12

Gli algoritmi di regressione sembrano funzionare su caratteristiche rappresentate come numeri. Per esempio:Analisi di regressione lineare con stringhe/caratteristiche categoriali (variabili)?

enter image description here

Questo set di dati non contiene categoriche funzioni/variabili. È abbastanza chiaro come fare la regressione su questi dati e prevedere il prezzo.


Ma ora voglio fare analisi di regressione su dati che contengono funzioni categoriali:

enter image description here

Ci sono caratteristiche: District, Condition, Material, Security, Type


Come posso eseguire la regressione su questi dati? Devo trasformare tutti questi dati stringa/categoriali in numeri manualmente? Voglio dire se devo creare alcune regole di codifica e in base a quelle regole trasformare tutti i dati in valori numerici. C'è un modo semplice per trasformare i dati di stringa in numeri senza dover creare manualmente le proprie regole di codifica? Possono esserci alcune librerie in Python che possono essere utilizzate per questo? Ci sono dei rischi che il modello di regressione sia in qualche modo scorretto a causa della "cattiva codifica"?

risposta

26

Sì, si dovrà convertire tutto ai numeri. Ciò richiede di pensare a ciò che questi attributi rappresentano.

Di solito ci sono tre possibilità:

codifica
  1. One-Hot per i dati categorici
  2. numeri arbitrari per i dati ordinali
  3. usare qualcosa come gruppo significa per i dati categorici (ad esempio, i prezzi medi per i distretti della città) .

È necessario fare attenzione a non infondere informazioni che non si hanno nel caso di domanda.

una codifica a caldo

Se si dispone di dati categorici, è possibile creare variabili dummy con 0/1 valori per ogni valore possibile.

E. g.

idx color 
0 blue 
1 green 
2 green 
3 red 

a

idx blue green red 
0 1 0  0 
1 0 1  0 
2 0 1  0 
3 0 0  1 

Questo può essere fatto facilmente con i panda:

import pandas as pd 

data = pd.DataFrame({'color': ['blue', 'green', 'green', 'red']}) 
print(pd.get_dummies(data)) 

si tradurrà in:

color_blue color_green color_red 
0   1   0   0 
1   0   1   0 
2   0   1   0 
3   0   0   1 

Numbers per i dati ordinali

Creare una mappatura delle categorie ordinabili, ad es. g. vecchio < rinnovato < nuovo → 0, 1, 2

Ciò è possibile anche con i panda:

data = pd.DataFrame({'q': ['old', 'new', 'new', 'ren']}) 
data['q'] = data['q'].astype('category') 
data['q'] = data['q'].cat.reorder_categories(['old', 'ren', 'new'], ordered=True) 
data['q'] = data['q'].cat.codes 
print(data['q']) 

Risultato:

0 0 
1 2 
2 2 
3 1 
Name: q, dtype: int8 

Utilizzando i dati categorici per le operazioni di GroupBy

È potrebbe utilizzare la media per ogni categoria nel passato (eventi noti).

Diciamo che avete un dataframe con gli ultimi noti i prezzi medi per le città:

prices = pd.DataFrame({ 
    'city': ['A', 'A', 'A', 'B', 'B', 'C'], 
    'price': [1, 1, 1, 2, 2, 3], 
}) 
mean_price = prices.groupby('city').mean() 
data = pd.DataFrame({'city': ['A', 'B', 'C', 'A', 'B', 'A']}) 

print(data.merge(mean_price, on='city', how='left')) 

Risultato:

city price 
0 A  1 
1 B  2 
2 C  3 
3 A  1 
4 B  2 
5 A  1 
+0

Ma come poteva hotencoding aiuto quando si cercherà di prevedere un nuovo colore? Forse nel tuo caso devi riqualificare la modella. Avete qualche soluzione? – gtzinos

3

In questo caso è possibile utilizzare "Codifica fittizia". Ci sono librerie Python per fare una codifica fittizia, hai alcune opzioni.

È possibile utilizzare la libreria di scikit-learn. Dai uno sguardo allo here.

Oppure, se si lavora con i panda, ha una funzione integrata per creare variabili dummy. Controllare this.

Un esempio con i panda è inferiore:

import pandas as pd 

sample_data = [[1,2,'a'],[3,4,'b'],[5,6,'c'],[7,8,'b']] 
df = pd.DataFrame(sample_data, columns=['numeric1','numeric2','categorical']) 
dummies = pd.get_dummies(df.categorical) 
df.join(dummies)