与RFECV结合时如何在Gridsearch中使用'max_features'?

How to use 'max_features' in Gridsearch when combining with RFECV?

感谢您提前回答。这是我的第一个 post,我对 python 还比较陌生,所以如果我把某些东西格式化得很糟糕,我深表歉意。

我正在尝试在 sklearn 中结合递归特征消除和网格搜索来确定超参数和特征数量的最佳组合。使用下面的代码时,我得到 max_features must be in (0, n_features] Estimator fit failed. for anything other than max_features is 1 . 我的数据集中有 300 多个特征,其中许多可能并不重要。

'''

    param_dist = {'estimator__n_estimators': [i for i in range(11, 121, 10)],
                  'estimator__criterion': ['gini', 'entropy']}
                  'estimator__max_features': [i for i in range(1, 10)]}



    estimator = sklearn.ensemble.RandomForestClassifier(n_jobs=-1, random_state=42, bootstrap=True, verbose=True, max_features='auto')

    selector = sklearn.feature_selection.RFECV(estimator=estimator, step=1, cv=5,
                                                scoring='accuracy')

    rf_nested = sklearn.model_selection.GridSearchCV(estimator=selector, param_grid=param_dist, cv=5,
                                                        scoring='accuracy', n_jobs=-1, refit=True, return_train_score=True)


    rf_nested.fit(X_train, y_train)

'''

我不会将特征 select离子步骤和超参数优化混合在一起。

问题是您将 selector 传递给网格搜索而不是估算器 - 这可能最终会起作用,但这可能不是最好的主意,因为两者不同 类 并且有不同的方法.

我不确定这两者的实现,但看起来 RFECV 可能 return 少量的功能是合理的,如果只有少数是重要的(甚至可能只有一个),而 GridSearchCV 可能想要测试更多的功能功能 - 因此不可用。

此外,您正在做的是交叉验证中的交叉验证,这似乎是不必要的。对于网格搜索的每次评估,您 运行 您 select 或 5 次,这反过来 运行 随机森林 5 次到 select 特征的数量。

最后,我认为将这两个步骤分开会更好。先通过 RFECV 找到最重要的特征,然后找到 max_features 的最佳参数。

最终(不相关)建议:我不会对估算器的数量进行网格搜索。随机森林往往不会过度拟合,所以最好的选择是在交叉验证时设置一个提前停止参数 :)