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
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())`
```
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)
```