使用 Scikit 每折叠特征提取

Feature extraction per fold with Scikit

对于机器学习实验,我必须执行特征选择。由于 10 折交叉验证,我在训练和测试集上没有划分。有人告诉我,我必须对每一折进行特征选择。但我不知道该怎么做。这是我的代码的一部分。

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

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

#feature selection
from sklearn.feature_selection import SelectKBest, mutual_info_classif
feat_sel = SelectKBest(mutual_info_classif, k=200) 
X_fs = feat_sel.fit_transform(X_scaled, y)

#train a classifier
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
y_pred = model_selection.cross_val_predict(clf, X_fs, y, cv=10)

有人可以帮我选择每折吗?

您可以使用 Pipeline,将特征选择器和分类器加入管道并交叉验证管道。

参考:http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

正在回答您发布的第二个问题。

您可以使用交叉验证并查看结果:

做:

from sklearn.feature_selection import SelectKBest, mutual_info_classif, RFECV
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline        
from sklearn.model_selection import cross_val_score
import numpy as np

feat_sel = SelectKBest(mutual_info_classif, k=200) 

clf = MultinomialNB()
pipe = Pipeline([('mutual_info',feat_sel), ('naive_bayes',clf)])

scores = cross_val_score(pipe, X_scaled, y, cv =10, scoring = 'accuracy')
print(np.mean(scores))