2016-07-21 38 views
6

Mam Pandas Dataframe z 2 zmiennymi kategorycznymi, zmienną ID i zmienną docelową (dla klasyfikacji). Udało mi się przekonwertować wartości kategoryczne na OneHotEncoder. Powoduje to rzadką matrycę.Jak używać wyjścia z OneHotEncoder w sklearn?

ohe = OneHotEncoder() 
# First I remapped the string values in the categorical variables to integers as OneHotEncoder needs integers as input 
... remapping code ... 

ohe.fit(df[['col_a', 'col_b']]) 
ohe.transform(df[['col_a', 'col_b']]) 

Ale nie mam pojęcia, jak mogę użyć tej rzadkiej macierzy w DecisionTreeClassifier? Szczególnie, gdy chcę dodać inne nie-kategoryczne zmienne w mojej ramce danych później. Dzięki!

EDIT W odpowiedzi na komentarz z miraculixx: Próbowałem też DataFrameMapper w sklearn-pand

mapper = DataFrameMapper([ 
    ('id_col', None), 
    ('target_col', None), 
    (['col_a'], OneHotEncoder()), 
    (['col_b'], OneHotEncoder()) 
]) 

t = mapper.fit_transform(df) 

Ale wtedy ten błąd:

TypeError: no supported conversion for types : (dtype('O'), dtype('int64'), dtype('float64'), dtype('float64')).

+0

[sklearn-pandy] (https://github.com/paulgb/sklearn-pandas) jest bardzo pomocny podczas pracy z ramkami danych i sklearn. – miraculixx

Odpowiedz

9

widzę, że jesteś już używa Pand, więc dlaczego nie skorzystać z jego funkcji get_dummies?

import pandas as pd 
df = pd.DataFrame([['rick','young'],['phil','old'],['john','teenager']],columns=['name','age-group']) 

wynik

name age-group 
0 rick  young 
1 phil  old 
2 john teenager 

teraz zakodować z get_dummies

pd.get_dummies(df) 

wynikowych

name_john name_phil name_rick age-group_old age-group_teenager \ 
0   0   0   1    0     0 
1   0   1   0    1     0 
2   1   0   0    0     1 

    age-group_young 
0    1 
1    0 
2    0 

I rzeczywiście można korzystać z nowej Pandy DataFrame w swojej Sklearn za DecisionTreeClassifier.

+1

Dzięki Guiem Bosch, to zadziałało. Jednak musiałem określić, aby używać get_dummies tylko w dwóch kolumnach. Jeśli zostawiłem zmienną ID w ramce danych, otrzymałem komunikat, że moje jądro zginęło. Tak więc działał następujący kod: pd.get_dummies (df [['col_a', 'col_b']]) –

+0

Ponadto ponowne odwzorowanie wartości ciągu na liczby całkowite nie jest konieczne. Otherwize get_dummies nie wydaje się nic. –