Transmission de données catégoriques à L'Arbre de décision Sklearn

<!-Il y a plusieurs messages sur la façon d'encoder des données catégoriques aux arbres de Decission de Sklearn, mais à partir de la documentation de Sklearn, nous avons obtenu ces

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?

24
demandé sur AaronDT 2016-06-29 22:47:46

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!

5
répondu Abhinav Arora 2016-06-29 20:49:52

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
3
répondu mrwyatt 2016-06-29 19:55:25

(..)

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'])
0
répondu Guillaume 2018-09-04 21:30:44