À l'aide de DictVectorizer avec sklearn DecisionTreeClassifier
J'essaie de démarrer un arbre de décision avec python et sklearn.
Méthode de travail était comme ça:
import pandas as pd
from sklearn import tree
for col in set(train.columns):
if train[col].dtype == np.dtype('object'):
s = np.unique(train[col].values)
mapping = pd.Series([x[0] for x in enumerate(s)], index = s)
train_fea = train_fea.join(train[col].map(mapping))
else:
train_fea = train_fea.join(train[col])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, labels)
Maintenant, j'essaie de faire la même chose avec DictVectorizer, mais mon code ne fonctionne pas:
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
train_fea = vec.fit_transform([dict(enumerate(sample)) for sample in train])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, labels)
J'ai une erreur à la dernière ligne: "ValueError: Nombre d'étiquettes=332448 ne correspond pas au nombre d'échantillons=55". Comme je l'ai appris à partir de la documentation DictVectorize a été conçu pour transformer nominale caractéristiques en numérique. Que dois-je faire de mal?
corrigé (merci ogrisel pour me pousser à faire un exemple complet):
import pandas as pd
import numpy as np
from sklearn import tree
##################################
# working example
train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'e', 'f'],
'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']})
columns = set(train.columns)
columns.remove('b')
train_fea = train[['b']]
for col in columns:
if train[col].dtype == np.dtype('object'):
s = np.unique(train[col].values)
mapping = pd.Series([x[0] for x in enumerate(s)], index = s)
train_fea = train_fea.join(train[col].map(mapping))
else:
train_fea = train_fea.join(train[col])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, train['c'])
##########################################
# example with DictVectorizer and error
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
train_fea = vec.fit_transform([dict(enumerate(sample)) for sample in train])
dt = tree.DecisionTreeClassifier(min_samples_split=3,
compute_importances=True,max_depth=5)
dt.fit(train_fea, train['c'])
Dernier code a été corrigé avec l'aide de ogrisel:
import pandas as pd
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'x', 'f'],
'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']})
# encode labels
labels = train[['c']]
le = preprocessing.LabelEncoder()
labels_fea = le.fit_transform(labels)
# vectorize training data
del train['c']
train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()]
train_fea = DictVectorizer(sparse=False).fit_transform(train_as_dicts)
# use decision tree
dt = tree.DecisionTreeClassifier()
dt.fit(train_fea, labels_fea)
# transform result
predictions = le.inverse_transform(dt.predict(train_fea).astype('I'))
predictions_as_dataframe = train.join(pd.DataFrame({"Prediction": predictions}))
print predictions_as_dataframe
tout fonctionne
C'est vraiment pas clair quelle est la structure de l'échantillon. Combien d'échantillons avez-vous dans votre formation? Pouvez-vous imprimer un exemple d'un tel échantillon dans votre description?
fixe - j'ai ajouté un exemple de code
merci je vais maintenant répondre.
fixe - j'ai ajouté un exemple de code
merci je vais maintenant répondre.
OriginalL'auteur Viacheslav Nefedov | 2013-03-03
Vous devez vous connecter pour publier un commentaire.
La façon dont vous énumérer vos échantillons n'est pas significative. Simplement de les imprimer à l'évidence:
Maintenant, c'est syntacticly une liste des dicts mais rien de comparable à ce que vous attendez. Essayez de faire ceci à la place:
C'est beaucoup mieux, nous allons maintenant essayer de vectoriser ces dicts:
Pour obtenir la signification de chaque colonne, de demander à la vectorizer:
Pouvez-vous s'il vous plaît marquer la réponse acceptée? Il permet de suivre encore question sans réponse de la part des utilisateurs.
Comme pour les étiquettes, il suffit de passer directement à la
DecisionTreeClassifier
sans l'aide de laDictVectorizer
: les étiquettes devraient être catégorique par défaut.Oliver, merci beaucoup pour votre réponse! si je n'utilise pas DictVectorizer j'ai une erreur "ValueError: impossible de convertir de la chaîne d'float: b"
Ok désolé, pour les étiquettes, certains classificateur accepter des chaînes directement, d'autres encore doivent être transmis par le biais de LabelEncoder manuellement. Dans l'avenir, tous les classificateurs dans sklearn doit utiliser LabelEncoder en interne.
OriginalL'auteur ogrisel
vec.fit_transform
retourne un tableau fragmenté. Et IIRCDecisionTreeClassifier
ne joue pas bien avec qui.Essayer
train_fea = train_fea.toarray()
avant de passer àDecisionTreeClassifier
.si vous imprimez train_fea vous avez 3 lignes pour le premier morceau de code et de 4 lignes par seconde
vous auriez raison si je ne l'utilise pas vec = DictVectorizer(sparse=False). En cas de "sparse=False' on n'a pas besoin d'ajouter .toarray().
OriginalL'auteur lazy1