Question

Je fais quelques problèmes sur l'application d'arbre de décision / forêt aléatoire. Je suis en train de répondre à un problème qui a des numéros ainsi que des chaînes (telles que le nom du pays) comme caractéristiques. Maintenant, la bibliothèque, scikit-learn prend des chiffres en tant que paramètres, mais je veux injecter les cordes aussi bien qu'ils transporter une quantité importante de connaissances.

Comment gérer un tel scénario?

Je peux convertir une chaîne en nombre par un mécanisme tel que le hachage en Python. Mais je voudrais savoir les meilleures pratiques sur la façon dont les chaînes sont traitées dans les problèmes d'arbre de décision.

Était-ce utile?

La solution

Dans la plupart des systèmes d'apprentissage machine bien établies, variables sont traitées naturellement. Par exemple, dans R vous utiliseriez facteurs, WEKA vous utiliseriez des variables nominales. Ce n'est pas le cas dans scikit-learn. Les arbres de décision mis en œuvre dans scikit-learn Seules les utilisations caractéristiques numériques et ces caractéristiques sont interprétées comme toujours des variables numériques continues .

Ainsi, en remplaçant simplement les chaînes avec un code de hachage doit être évitée, parce qu'être considéré comme une caractéristique numérique continue tout codage que vous utiliserez induira un ordre qui ne fonctionne tout simplement pas dans vos données.

Un exemple est le code [ « rouge », « vert », « bleu »] avec [1,2,3], produirait des choses étranges comme « rouge » est inférieur à « bleu », et si vous en moyenne « rouge » et un « bleu », vous obtiendrez un « vert ». Un autre exemple plus subtile peut se produire lorsque vous le code [ « faible », « moyen », « élevé »] avec [1,2,3]. Dans ce dernier cas, il peut arriver d'avoir une commande qui pourrait se produire lorsque « moyen » est logique, cependant, certaines incohérences subtiles pas au milieu de « faible » et « élevé ».

Enfin, la réponse à votre question réside dans le codage de la fonction catégorique en plusieurs caractéristiques binaires . Par exemple, vous pouvez le code [ « rouge », « vert », « bleu »] avec 3 colonnes, une pour chaque catégorie, ayant 1 lorsque le match de la catégorie et 0 sinon. Ceci est appelé un chaud codant pour , le codage binaire, one-of-k codant ou autre. Vous pouvez consulter la documentation ici pour encodage catégorique caractéristiques et extraction de caractéristiques - hachage et dicts . De toute évidence, un codage à chaud augmentera vos besoins en espace et parfois nuit à la performance.

Autres conseils

Vous devez encoder vos chaînes comme caractéristiques numériques que la science-kit peut utiliser pour les algorithmes ML. Cette fonctionnalité est traitée dans le module de prétraitement (par exemple, voir sklearn.preprocessing.LabelEncoder pour un exemple).

Vous devriez habituellement encode un chaud variables pour scikit-learn modèles, y compris forêt aléatoire. forêt aléatoire souvent bien fonctionner sans codage d'un chaud, mais en général fonctionne mieux si vous le faites encode un chaud. codant pour un chaud et les variables « dummying » signifient la même chose dans ce contexte. Scikit-learn a sklearn.preprocessing.OneHotEncoder et Pandas a pandas.get_dummies pour y parvenir.

Cependant, il existe des alternatives. L'article "Au-delà de One-Hot" à KDnuggets fait un excellent travail d'expliquer pourquoi vous avez besoin de coder les variables qualitatives et les alternatives à l'encodage d'un chaud.

Il existe des implémentations alternatives de forêt aléatoire qui ne nécessitent pas l'encodage d'un chaud tel que R ou H2O. La mise en œuvre en R est cher et informatiquement ne fonctionnera pas si vos caractéristiques ont de nombreuses catégories . H2O travaillera de concert avec un grand nombre de catégories. Continuum a H2O disponible dans Anaconda Python.

Il y a un effort continu pour faire catégorielle poignée scikit-learn fonctionnalités directement .

Cet article a une explication de l'algorithme utilisé dans H2O. Il fait référence au document académique Une décision parallèle streaming Arbre algorithme et version plus longue du même papier.

Mise à jour 2018!

Vous pouvez créer un plongement (vecteur dense) espace pour vos variables. Beaucoup d'entre vous sont familiers avec word2vec et fastexte, qui embarquent des mots dans un espace significatif vecteur dense. Même idée ici-- vos variables traceront un vecteur avec un certain sens.

De la papier Guo / Berkhahn :

  

Entité noyant non seulement réduit l'utilisation de la mémoire et accélère neural   réseaux comparés avec le codage d'un chaud, mais surtout par   la cartographie des valeurs similaires près de l'autre dans l'espace l'intégrant   révèle les propriétés intrinsèques des variables. nous   appliqué avec succès dans un récent concours Kaggle et ont pu   pour atteindre la troisième position avec des fonctionnalités simples relatives.

Les auteurs ont constaté que représentant variables de cette façon d'améliorer l'efficacité de tous les algorithmes d'apprentissage machine testée, y compris la forêt aléatoire.

Le meilleur exemple est peut-être l'application de Pinterest du technique groupe lié broches:

Les gens de fastai ont mis en œuvre incorporations catégoriques et a créé une très belle Blog poster avec compagnon demo portable .

Détails additionnels et explication

Un réseau de neurones est utilisé pour créer le embeddings dire assign un vecteur à chaque valeur catégorique. Une fois que vous avez les vecteurs, vous pouvez les utiliser dans un modèle qui accepte des valeurs numériques. Chaque composante du vecteur est une variable d'entrée. Par exemple, si vous avez utilisé des vecteurs 3-D pour intégrer votre liste de catégories de couleurs, vous obtiendrez peut-être quelque chose comme: rouge = (0, 1,5, -2,3), = bleu (1, 1, 0), etc. Vous utiliserez trois variables d'entrée dans votre forêt aléatoire correspondant aux trois composantes. Pour les choses rouges, c1 = 0, c2 = 1,5, et c3 = -2,3. Pour les choses bleues, c1 = 1, c2 = 1 et c3 = 0.

Vous ne fait pas besoin pour utiliser un réseau de neurones pour créer incorporations (bien que je ne recommande pas se détourner de la technique). Vous êtes libre de créer vos propres incorporations à la main ou tout autre moyen, lorsque cela est possible. Voici quelques exemples:

  1. Carte des couleurs à des vecteurs RGB.
  2. Lieux Mapper vecteurs lat / long.
  3. Dans un modèle politique américain, la carte des villes à certains composants de vecteur représentant gauche / alignement droit, fardeau fiscal, etc.

Vous pouvez utiliser des variables muettes dans ces scénarios. vous pouvez avec panda.get_dummies de panda créer des variables muettes pour les chaînes que vous voulez mettre dans l'arbre de décision ou la forêt aléatoire.

Exemple:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

TRANSFORMEZ à des numéros, par exemple pour chaque pays unique assingn un numéro unique (comme 1,2,3 et ...)

aussi vous Ne pas ont besoin d'utiliser codant pour un Hot- (aka les variables muettes) lorsque vous travaillez avec la forêt au hasard, parce que les arbres ne fonctionnent pas comme autre algorithme ( tels que linéaire / régression logistique) et ils ne fonctionnent pas par distance (ils travaillent à trouver une bonne séparation pour vos fonctions) si pAS BESOIN pour un encodage à chaud

Licencié sous: CC-BY-SA avec attribution
scroll top