Рекурсивное устранение функций и поиск сетки с использованием scikit-learn

Я хотел бы выполнить рекурсивное устранение функции с помощью вложенного поиска сетки и кросс-валидации для каждого подмножества функций, используя 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

Если бы кто-нибудь мог показать мне, что я делаю неправильно, это было бы очень признательно, спасибо!

EDIT:

После ответа Андреаса все стало яснее, ниже - рабочий пример 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_

Ответ 1

К сожалению, RFECV ограничивается перекрестной проверкой количества компонентов. Вы не можете выполнять поиск по параметрам SVM. Ошибка связана с тем, что SVC ожидает float как C, и вы дали ему список.

Вы можете сделать одну из двух вещей: Запустить GridSearchCV на RFECV, что приведет к разложению данных на сгибы два раза (внутри GridSearchCV и один раз внутри RFECV), но поиск по количеству компонентов будет эффективным, ИЛИ вы можете сделать GridSearchCV только на RFE, что приведет к единичному расщеплению данных, но при очень неэффективном сканировании параметров оценки RFE.

Если вы хотите сделать docstring менее двусмысленным, запрос на перенос будет приветствоваться:)

Ответ 2

Код, предоставленный DavidS, не работал у меня (sklearn 0.18), но потребовал небольшого изменения для конкретного параметра param_grid и его использования.

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_