Pandas: Pandas get_dummies() und n-1 kategoriale Kodierungsoption zur Vermeidung von Kollinearität?

Erstellt am 15. Jan. 2016  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Bei der linearen Regression und der Codierung kategorialer Variablen kann die perfekte Kollinearität ein Problem darstellen. Um dies zu umgehen, wird vorgeschlagen, n-1 Spalten zu verwenden. Es wäre nützlich, wenn pd.get_dummies() einen booleschen Parameter hätte, der n-1 für jede kategoriale Spalte zurückgibt, die codiert wird.

Beispiel:

>>> df
    Account  Network      Device
0  Account1   Search  Smartphone
1  Account1  Display      Tablet
2  Account2   Search  Smartphone
3  Account3  Display  Smartphone
4  Account2   Search      Tablet
5  Account3   Search  Smartphone
>>> pd.get_dummies(df)
   Account_Account1  Account_Account2  Account_Account3  Network_Display  \
0                 1                 0                 0                0   
1                 1                 0                 0                1   
2                 0                 1                 0                0   
3                 0                 0                 1                1   
4                 0                 1                 0                0   
5                 0                 0                 1                0   

   Network_Search  Device_Smartphone  Device_Tablet  
0               1                  1              0  
1               0                  0              1  
2               1                  1              0  
3               0                  1              0  
4               1                  0              1  
5               1                  1              0 

Stattdessen hätte ich gerne einen Parameter wie drop_first=True in get_dummies() und es macht ungefähr Folgendes:

>>> new_df = pd.DataFrame(index=df.index)
>>> for i in df:
    new_df = new_df.join(pd.get_dummies(df[i]).iloc[:, 1:])


>>> new_df
   Account2  Account3  Search  Tablet
0         0         0       1       0
1         0         0       0       1
2         1         0       1       0
3         0         1       0       0
4         1         0       1       1
5         0         1       1       0

Quellen
http://fastml.com/converting-categorical-data-into-numbers-with-pandas-and-scikit-learn/
http://stackoverflow.com/questions/31498390/how-to-get-pandas-get-dummies-to-emit-n-1-variables-to-avoid-co-linearaity
http://dss.princeton.edu/online_help/analysis/dummy_variables.htm

Reshaping

Hilfreichster Kommentar

Es wäre von Vorteil, einen bestimmten Wert fallen zu lassen, nicht nur den 'ersten'.

Die weggelassene Kategorie (Referenzgruppe) beeinflusst die Interpretation der Koeffizienten.

Eine bewährte Methode besteht beispielsweise darin, den „größten“ Wert als Referenzkategorie wegzulassen;

````

hot = df[['vol_k', 'activation']]

cat_vars = list(df.select_dtypes(include=['category']).columns)
für var in cat_vars:
new = pd.get_dummies(df[var])
hot = hot.join(neu)

#drop most frequent variable for ref category
drop_col = df.groupby([var]).size().idxmax()
hot.drop(drop_col, axis=1, inplace=True)

print(var + " dropping " + drop_col)
print(df.groupby([var]).size())`

```

Alle 3 Kommentare

Klingt gut, Interesse an einem Pull Request?

:+1:

Es wäre von Vorteil, einen bestimmten Wert fallen zu lassen, nicht nur den 'ersten'.

Die weggelassene Kategorie (Referenzgruppe) beeinflusst die Interpretation der Koeffizienten.

Eine bewährte Methode besteht beispielsweise darin, den „größten“ Wert als Referenzkategorie wegzulassen;

````

hot = df[['vol_k', 'activation']]

cat_vars = list(df.select_dtypes(include=['category']).columns)
für var in cat_vars:
new = pd.get_dummies(df[var])
hot = hot.join(neu)

#drop most frequent variable for ref category
drop_col = df.groupby([var]).size().idxmax()
hot.drop(drop_col, axis=1, inplace=True)

print(var + " dropping " + drop_col)
print(df.groupby([var]).size())`

```

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen