python - 网格搜索 SVM-anova 的超参数并在 Sklearn 中获取所选特征

标签 python scikit-learn pipeline cross-validation feature-selection

sklearn SVM-Anova 的文档中有一个示例。我想进一步对 SVM 的超参数、i.d.、C 和 gamma 进行GridSearchCV,对于示例中使用的每个百分位数的特征,如下所示:

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()

关于python - 网格搜索 SVM-anova 的超参数并在 Sklearn 中获取所选特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732783/

相关文章:

python - 要求在 Ruffus 管道中运行函数之前创建一组文件

python - 如何遍历 python 列表,并在继续该过程之前停止加载下一个 URL?

python - MySql 查询的 Flask HTML 表单字段在 macOS Sierra 上返回错误

python - Pandas 数据框每行列平均值

python - 你如何解决 pyinstaller for scipy 中的 'hidden imports not found!' 警告?

python - 当有 2 个类时,sklearn LabelBinarizer 返回向量

c# - SSIS - PipelineComponent 中的 ProcessInput 被多次调用

python - Sklearn 在线预测,批量 vs 一一

python - 类别权重与欠采样/过采样

python-3.x - sklearn 管道 + keras 顺序模型 - 如何获取历史记录?