0

Pour un projet de classification de texte, j'ai créé un pipeline pour la sélection de caractéristiques et le classificateur. Maintenant, ma question est de savoir s'il est possible d'inclure le module d'extraction de caractéristiques dans le pipeline et comment. J'ai regardé certaines choses à ce sujet, mais cela ne semble pas correspondre à mon code actuel.Inclure l'extraction de caractéristiques dans le pipeline sklearn

C'est ce que j'ai maintenant:

# feature_extraction module. 
from sklearn.preprocessing import LabelEncoder, StandardScaler 
from sklearn.feature_extraction import DictVectorizer 
import numpy as np 

vec = DictVectorizer() 
X = vec.fit_transform(instances) 
scaler = StandardScaler(with_mean=False) # we use cross validation, no train/test set 
X_scaled = scaler.fit_transform(X) # To make sure everything is on the same scale 

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

# Feature selection and classification pipeline 
from sklearn.feature_selection import SelectKBest, mutual_info_classif 
from sklearn import model_selection 
from sklearn.metrics import classification_report 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.svm import LinearSVC 
from sklearn import linear_model 
from sklearn.pipeline import Pipeline 

feat_sel = SelectKBest(mutual_info_classif, k=200) 
clf = linear_model.LogisticRegression() 
pipe = Pipeline([('mutual_info', feat_sel), ('logistregress', clf)])) 
y_pred = model_selection.cross_val_predict(pipe, X_scaled, y, cv=10) 

Comment puis-je mettre le dictvectorizer jusqu'à ce que l'encodeur d'étiquettes dans le pipeline?

Répondre

1

Voici comment vous le feriez. Si l'on suppose instances est un objet semblable à dict, tel que spécifié dans le API, puis juste construire votre pipeline comme ceci:

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

Pour prédire, puis appelez cross_val_predict, en passant instances comme X:

y_pred = model_selection.cross_val_predict(pipe, instances, y, cv=10) 
+0

oui, instances est un dict. Donc, je n'ai plus besoin de faire fit.transform dans l'extraction de feature? – Bambi

+1

Correct, vous n'avez pas besoin de faire le 'fit_transform'. Le pipeline le fera automatiquement. –