在 scikit-learn 中结合递归特征消除和网格搜索

Posted

技术标签:

【中文标题】在 scikit-learn 中结合递归特征消除和网格搜索【英文标题】:Combining Recursive Feature Elimination and Grid Search in scikit-learn 【发布时间】:2015-11-19 10:13:12 【问题描述】:

我正在尝试。正如您从下面的代码(有效)中看到的那样,我能够从网格搜索中获得最佳估计器,然后将该估计器传递给 RFECV。但是,我宁愿先做 RFECV,然后再做网格搜索。问题是当我将RFECV中的选择器传递给网格搜索时,它并没有取走它:

ValueError:估计器 RFECV 的参数引导程序无效

是否可以从 RFECV 中获取选择器并将其直接传递给 RandomizedSearchCV,或者这在程序上不是正确的做法?

from sklearn.datasets import make_classification
from sklearn.feature_selection import RFECV
from sklearn.grid_search import GridSearchCV, RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint as sp_randint

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=5, n_redundant=2, n_repeated=0, n_classes=8, n_clusters_per_class=1, random_state=0)

grid = "max_depth": [3, None],
        "min_samples_split": sp_randint(1, 11),
        "min_samples_leaf": sp_randint(1, 11),
        "bootstrap": [True, False],
        "criterion": ["gini", "entropy"]

estimator = RandomForestClassifierCoef()
clf = RandomizedSearchCV(estimator, param_distributions=grid, cv=7)
clf.fit(X, y)
estimator = clf.best_estimator_

selector = RFECV(estimator, step=1, cv=4)
selector.fit(X, y)
selector.grid_scores_

【问题讨论】:

我猜想编辑了 sp_randint 导入,在 scikit-learn 示例中它通常是 scipy.stats.randint 的别名。 是的,感谢您的更正。 没有答案?我也有同样的问题。 【参考方案1】:

最好的方法是使用this SO answer 中的方法将RFECV 嵌套在随机搜索中。 一些示例代码,基于上面提到的问题代码和 SO 答案:

from sklearn.datasets import make_classification
from sklearn.feature_selection import RFECV
from sklearn.grid_search import GridSearchCV, RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint as sp_randint

# Build a classification task using 5 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=5, n_redundant=2, n_repeated=0, n_classes=8, n_clusters_per_class=1, random_state=0)

grid = "estimator__max_depth": [3, None],
        "estimator__min_samples_split": sp_randint(1, 11),
        "estimator__min_samples_leaf": sp_randint(1, 11),
        "estimator__bootstrap": [True, False],
        "estimator__criterion": ["gini", "entropy"]

estimator = RandomForestClassifier()
selector = RFECV(estimator, step=1, cv=4)
clf = RandomizedSearchCV(selector, param_distributions=grid, cv=7)
clf.fit(X, y)
print(clf.grid_scores_)
print(clf.best_estimator_.n_features_)

【讨论】:

是否可以将多个估算器添加到 RFECV(类似于管道)中以查看哪个效果最好?换句话说,不是有一个固定的 RandomForest,而是说添加其他估计器?如果是这样,你能更新你的答案吗? 对于到达这里的任何人,请参阅此答案中的 cmets,了解为什么加入特征选择和超参数调整可能不好:***.com/a/59301396/1379826

以上是关于在 scikit-learn 中结合递归特征消除和网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

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

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

GPU 上的 SKLearn RFE(递归特征消除)

Scikit-learn 中的特征选择遇到了混合变量类型的问题

在 scikit-learn 中结合异构特征

递归特征消除(RFE)+ 交叉验证