网格搜索SVM的超参数方差,并在Sklearn中得到所选特征



文档中有一个sklearn-SVM Anova的例子。我想进一步为超参数做GridSearchCV,为SVM做I.d.,C和gamma,为示例中使用的每个百分位特征做如下:

transform = feature_selection.SelectPercentile(feature_selection.f_classif)
clf = Pipeline([('anova', transform), 
('normal',preprocessing.StandardScaler()),
('svc', svm.SVC())])
parameters = {
'svc__gamma': (1e-3, 1e-4),
'svc__C': (1, 10, 100, 1000)
}      
percentiles = (1, 3, 6, 10, 15, 20, 30, 40, 60, 80, 100)
for percentile in percentiles:
clf.set_params(anova__percentile=percentile)
search = GridSearchCV(clf, parameters,cv=StratifiedKFold(y,7,shuffle=True, random_state=5), scoring='roc_auc', n_jobs=1)
search.fit(X,y)

它工作得很好,通过这样做,我可以同时调整Anova和SVM的参数,并使用这对参数来构建我的最终模型。

然而,我对它的工作原理感到困惑。它是否首先拆分数据并通过管道?如果是,如果我想进一步了解Anova选择的功能,我如何确定这些功能?

比方说,我使用一对参数(Anova的百分位数和SVM的C/gamma)获得了最佳的CV分数,我如何才能确切地找出在这些设置中保留了哪些特征?因为每一组参数都是在CV下测试的,每个参数都包含具有不同训练数据的折叠,因此Anova将评估不同的特征集。

我可以得出的一种方法是将每个折叠中保留的特征集相交,以获得性能最好的一对参数,但我不知道如何修改代码

对该方法的任何建议或疑问都表示赞赏和欢迎。

您可以去掉百分位数的循环,只需将百分位数放在参数网格中。然后您可以查看search.best_estimator_的选定功能,即search.best_estimator_.named_steps['anova'].get_support()

最新更新