scikit-learn - 使用 scikit-learn 进行递归特征消除和网格搜索

标签 scikit-learn feature-selection

我想使用 scikit-learn 对每个特征子集进行嵌套网格搜索和交叉验证来执行递归特征消除。来自 RFECV 文档 听起来像使用 estimator_params 支持这种类型的操作范围:

estimator_params : dict

    Parameters for the external estimator. Useful for doing grid searches.

但是,当我尝试将超参数网格传递给 RFECV 对象时
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=5, estimator_params={'C': [0.1, 10, 100, 1000]})
selector = selector.fit(X, y)

我收到类似的错误
  File "U:/My Documents/Code/ModelFeatures/bin/model_rcc_gene_features.py", line 130, in <module>
    selector = selector.fit(X, y)
  File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", line 336, in fit
    ranking_ = rfe.fit(X_train, y_train).ranking_
  File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", line 146, in fit
    estimator.fit(X[:, features], y)
  File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 178, in fit
    fit(X, y, sample_weight, solver_type, kernel, random_seed=seed)
  File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 233, in _dense_fit
    max_iter=self.max_iter, random_seed=random_seed)
  File "libsvm.pyx", line 59, in sklearn.svm.libsvm.fit (sklearn\svm\libsvm.c:1628)
TypeError: a float is required

如果有人能告诉我我做错了什么,将不胜感激,谢谢!

编辑:

在 Andreas 的回应变得清晰之后,下面是 RFECV 结合网格搜索的工作示例。
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
param_grid = [{'C': 0.01}, {'C': 0.1}, {'C': 1.0}, {'C': 10.0}, {'C': 100.0}, {'C': 1000.0}, {'C': 10000.0}]
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=4)
clf = GridSearchCV(selector, {'estimator_params': param_grid}, cv=7)
clf.fit(X, y)
clf.best_estimator_.estimator_
clf.best_estimator_.grid_scores_
clf.best_estimator_.ranking_

最佳答案

不幸的是,RFECV 仅限于交叉验证组件的数量。你不能用它搜索 SVM 的参数。错误是因为 SVC 期望浮点数为 C,而您给了它一个列表。

您可以执行以下两种操作之一:在 RFECV 上运行 GridSearchCV,这将导致将数据分成两次折叠(在 GridSearchCV 中和在 RFECV 中一次),但是对组件数量的搜索将是有效的,或者您可以这样做GridSearchCV 仅适用于 RFE,这将导致数据的单一拆分,但对 RFE 估计器参数的扫描效率非常低。

如果您想让文档字符串不那么模糊,欢迎提出拉取请求 :)

关于scikit-learn - 使用 scikit-learn 进行递归特征消除和网格搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815938/

相关文章:

python - scikit-learn:关于 RFECV 示例的问题

python - 如何并行化 scikit-learn SVM (SVC) 分类器的 .predict() 方法?

linear-regression - 我们应该如何处理高度相关的特征?

neural-network - 用于时间相关特征的卷积神经网络

python - 为什么一个频繁出现的词会被错误分类?

python - 计算学习算法的 yScore

python - 试图校准keras模型

python - 如何使用python通过余弦相似度有效地检索前K个相似文档?

python - 没有类标签列的特征选择

使用贪婪特征选择的 Python 拟合线性回归