2017-07-23 3 views
3

Je travaille avec scikit learn sur une expérience de classification de texte. Maintenant, je voudrais obtenir les noms des meilleures caractéristiques sélectionnées. J'ai essayé quelques-unes des réponses à des questions similaires, mais rien ne fonctionne. Les dernières lignes de code sont un exemple de ce que j'ai essayé. Par exemple quand j'imprime feature_names, j'obtiens cette erreur: sklearn.exceptions.NotFittedError: This SelectKBest instance is not fitted yet. Call 'fit' with appropriate arguments before using this method. Des solutions?noms de fonctionnalités de pipeline Sklearn: erreur non installée

scaler = StandardScaler(with_mean=False) 

enc = LabelEncoder() 
y = enc.fit_transform(labels) 

feat_sel = SelectKBest(mutual_info_classif, k=200) 
clf = linear_model.LogisticRegression() 

pipe = Pipeline([('vectorizer', DictVectorizer()), 
       ('scaler', StandardScaler(with_mean=False)), 
       ('mutual_info', feat_sel), 
       ('logistregress', clf)]) 

feature_names = pipe.named_steps['mutual_info'] 
X.columns[features.transform(np.arange(len(X.columns)))] 
+0

Vous devez installer le tuyau. Voir ma réponse – sera

Répondre

1

Vous devez d'abord adapter à la canalisation puis appelez feature_names:

Solution

scaler = StandardScaler(with_mean=False) 

enc = LabelEncoder() 
y = enc.fit_transform(labels) 

feat_sel = SelectKBest(mutual_info_classif, k=200) 
clf = linear_model.LogisticRegression() 

pipe = Pipeline([('vectorizer', DictVectorizer()), 
       ('scaler', StandardScaler(with_mean=False)), 
       ('mutual_info', feat_sel), 
       ('logistregress', clf)]) 

# Now fit the pipeline using your data 
pipe.fit(X, y) 

#now can the pipe.named_steps 
feature_names = pipe.named_steps['mutual_info'] 
X.columns[features.transform(np.arange(len(X.columns)))] 

Informations générales

De la documentation example here vous pouvez voir la

anova_svm.set_params(anova__k=10, svc__C=.1).fit(X, y) 

Ceci définit certains paramètres initiaux (paramètre k pour le paramètre ANOVA et C pour svc)

puis appelle fit(X,y) pour adapter le pipeline.

EDIT:

pour la nouvelle erreur, puisque votre X est une liste de dictionnaires que je vois une façon d'appeler la méthode colonnes que vous voulez. Cela peut être fait en utilisant des pandas.

X= [{'age': 10, 'name': 'Tom'}, {'age': 5, 'name': 'Mark'}] 

df = DataFrame(X) 
len(df.columns) 

Résultat:

2 

Hope this helps

+1

mes instances (X) est une liste de dictionnaires. Quand je cours le code, j'obtiens toujours une erreur à la dernière ligne: 'l'objet de liste n'a aucune colonne d'attribut'. – Bambi

+0

@Bambi J'ai édité ma réponse fournissant une solution possible pour la nouvelle erreur. – sera

+0

merci, cela aide! J'ai juste une question, est-ce qu'il y a un moyen d'obtenir les vrais noms des fonctionnalités? Comme 'age' et 'nom' dans votre exemple? – Bambi