6

J'ai une base de données Pandas avec 2 variables catégorielles, et une variable ID et une variable cible (pour la classification). J'ai réussi à convertir les valeurs catégorielles avec OneHotEncoder. Cela résulte en une matrice clairsemée.Comment utiliser la sortie de OneHotEncoder dans 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']]) 

Mais je n'ai aucune idée comment je peux utiliser cette matrice clairsemée dans un DecisionTreeClassifier? Surtout quand je veux ajouter d'autres variables non catégoriques dans ma base de données plus tard. Merci!

EDIT En réponse au commentaire de miraculixx: J'ai essayé aussi le DataFrameMapper dans sklearn-pandas géants

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

t = mapper.fit_transform(df) 

Mais je reçois cette erreur:

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

+0

[sklearn-pandas] (https://github.com/paulgb/sklearn-pandas) est vraiment utile lorsque vous travaillez avec des dataframes et sklearn. – miraculixx

Répondre

9

Je vois que vous êtes déjà en utilisant Pandas, alors pourquoi ne pas utiliser sa fonction get_dummies?

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

résultat

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

maintenant que vous encodez avec get_dummies

pd.get_dummies(df) 

résultat

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 

Et vous pouvez réellement utiliser la nouvelle Pandas dataframe dans DecisionTreeClassifier de votre Sklearn.

+1

Merci Guiem Bosch, cela a fonctionné. Cependant, j'ai dû spécifier d'utiliser get_dummies uniquement sur les deux colonnes. Si j'ai laissé la variable ID dans la Dataframe, j'ai reçu le message que mon noyau est mort. Le code suivant a donc fonctionné: pd.get_dummies (df [['col_a', 'col_b']]) –

+0

En outre, le remappage des valeurs de chaîne en entiers n'est pas nécessaire. Otherwize get_dummies ne semble rien faire. –