Transmission de données catégoriques à L'Arbre de décision Sklearn
certains avantages des arbres de décision sont:
(...)
capable de traiter à la fois des données numériques et des données catégoriques. D'autres techniques sont généralement spécialisées dans l'analyse d'ensembles de données qui n'ont qu'un seul type de variable. Voir algorithmes pour plus d'informations.
mais en cours d'exécution script suivant
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
data = pd.DataFrame()
data['A'] = ['a','a','b','a']
data['B'] = ['b','b','a','b']
data['C'] = [0, 0, 1, 0]
data['Class'] = ['n','n','y','n']
tree = DecisionTreeClassifier()
tree.fit(data[['A','B','C']], data['Class'])
affiche l'erreur suivante:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit
X = check_array(X, dtype=DTYPE, accept_sparse="csc")
File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: b
<!-Je sais qu'en R Il est possible de passer des données catégoriques, avec Sklearn, est-ce possible?
3 réponses
contrairement à la réponse acceptée, Je préférerais utiliser les outils fournis par Scikit-Learn à cette fin. La principale raison pour cela est qu'ils peuvent être facilement intégrés dans un Pipeline.
Scikit-Learn lui-même fournit de très bonnes classes pour traiter les données catégoriques. Au lieu d'écrire votre fonction personnalisée, vous devez utiliser LabelEncoder
qui est spécialement conçus à cet effet.
Référer au code de la documentation:
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"])
cela les code automatiquement en nombres pour vos algorithmes d'apprentissage machine. Maintenant cela supporte aussi le retour aux chaînes à partir d'entiers. Vous pouvez le faire en appelant simplement inverse_transform
comme suit:
list(le.inverse_transform([2, 2, 1]))
Ce serait de retour ['tokyo', 'tokyo', 'paris']
.
notez aussi que pour beaucoup d'autres classificateurs, en dehors des arbres de décision, comme la régression logistique ou SVM, vous aimeriez encoder vos variables catégoriques en utilisant One-Hot l'encodage. Scikit-learn le supporte aussi bien à travers le OneHotEncoder
classe.
Espérons que cette aide!
Les Arbres de décision Sklearn ne gèrent pas la conversion des chaînes catégoriques en nombres. Je vous suggère de trouver une fonction dans Sklearn (peut-être ) qui permet de faire manuellement ou à écrire du code comme ceci:
def cat2int(column):
vals = list(set(column))
for i, string in enumerate(column):
column[i] = vals.index(string)
return column
(..)
capable de traiter à la fois des données numériques et des données catégoriques.
Cela signifie seulement que vous pouvez utiliser
- la classe DecisionTreeClassifier pour les problèmes de classification
- la classe de régression de DecisionTreeRegressor.
dans tous les cas, vous devez encoder à chaud les variables catégoriques avant d'ajuster un arbre avec sklearn, comme ceci:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
data = pd.DataFrame()
data['A'] = ['a','a','b','a']
data['B'] = ['b','b','a','b']
data['C'] = [0, 0, 1, 0]
data['Class'] = ['n','n','y','n']
tree = DecisionTreeClassifier()
one_hot_data = pd.get_dummies(data[['A','B','C']],drop_first=True)
tree.fit(one_hot_data, data['Class'])