Scikit learn 使用scikit learn的递归特征消除和网格搜索

Scikit learn 使用scikit learn的递归特征消除和网格搜索,scikit-learn,feature-selection,Scikit Learn,Feature Selection,我想使用scikit learn对每个特征子集执行嵌套网格搜索和交叉验证的递归特征消除。从RFECV文档中可以看出,使用estimator\u params参数支持这种类型的操作: estimator_params : dict Parameters for the external estimator. Useful for doing grid searches. 但是,当我尝试将超参数网格传递给RFECV对象时 from sklearn.datasets import make

我想使用scikit learn对每个特征子集执行嵌套网格搜索和交叉验证的递归特征消除。从RFECV文档中可以看出,使用
estimator\u 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

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

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


如果您想使docstring不那么模棱两可,那么我们欢迎使用pull请求:)

DavidS提供的代码不适用于我(sklearn 0.18),但需要对特定的参数网格及其用法进行一些小的更改

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
param_grid = [{'estimator__C': [0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]}]
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=4)
clf = GridSearchCV(selector, param_grid, cv=7)
clf.fit(X, y)
clf.best_estimator_.estimator_
clf.best_estimator_.grid_scores_
clf.best_estimator_.ranking_

好的,谢谢你的帮助,现在清楚多了。我在我的原始帖子中添加了一个使用RFECV进行网格搜索的示例,供其他可能遇到困难的人参考。另外,提交了一个pull请求和一些修改过的文档,希望对您有所帮助。我也感谢您的解释,因为我遇到了同样的问题。是否已提出文件改进请求?如果还没有完成的话,我很乐意为您做贡献。@AndreasMueller如果您知道这个问题的答案,请告诉我:非常感谢:)Danke schoen())这很有魅力。我甚至会将print()添加到最后3条语句中的每一条,以显示所有语句的输出。
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
param_grid = [{'estimator__C': [0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]}]
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=4)
clf = GridSearchCV(selector, param_grid, cv=7)
clf.fit(X, y)
clf.best_estimator_.estimator_
clf.best_estimator_.grid_scores_
clf.best_estimator_.ranking_