网格搜索 SVM-anova 的超参数并在 Sklearn 中获得选择的特征
Posted
技术标签:
【中文标题】网格搜索 SVM-anova 的超参数并在 Sklearn 中获得选择的特征【英文标题】:Grid searching hyper-parameters of SVM-anova and get the chosen feature in Sklearn 【发布时间】:2015-06-26 06:53:21 【问题描述】:在 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 评估不同的特征集。
我可以出来的一种方法是将每个折叠中保留的特征集相交以获得最佳性能的一对参数,但我不知道如何修改代码来做到这一点。
欢迎对方法提出任何建议或疑问。
【问题讨论】:
【参考方案1】:您可以摆脱百分位数的循环,只需将百分位数放在参数网格中。
然后可以查看search.best_estimator_
的选中特征,即search.best_estimator_.named_steps['anova'].get_support()
【讨论】:
谢谢!但是它如何确定最终选择的特征呢?最好的估计器有一个最佳的百分位,它可以最大化 CV 分数,但是那个特定的百分位在 CV 下的不同折叠分区中选择了不同的特征,我如何确定最终的特征子集? 找到最佳参数后在整个训练集上重新训练。 所以这意味着它在这种情况下将最佳参数重新拟合到整个数据集X
,同时对候选百分位数的每个折叠分区(部分数据集)进行交叉验证?
谢谢。但是请问为什么要这样确定最终的特征子集呢?为什么不采用投票方案,例如,在所有折叠分区中累积特征子集,每个折叠分区都是在最佳百分位数的阈值下选择的。然后我们可以在累积的特征子集中对特征的出现进行排名。
这是可能的,但不是使用交叉验证的标准方式。相反,这将是一种装袋方法。以上是关于网格搜索 SVM-anova 的超参数并在 Sklearn 中获得选择的特征的主要内容,如果未能解决你的问题,请参考以下文章