与RFECV结合使用时,如何在Gridsearch中使用“ max_features”?

时间:2019-12-12 01:42:04

标签: scikit-learn random-forest gridsearchcv rfe

感谢您提前回答。这是我的第一篇文章,相对于python来说我还比较陌生,因此如果格式化格式过高,我深表歉意。

我正在尝试在sklearn中结合使用递归特征消除和网格搜索来确定超参数和特征数量的最佳组合。当使用下面的代码时,我得到 max_features必须处于(0,n_features]估计器拟合失败。。除了max_features之外,其他均为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)

'''

1 个答案:

答案 0 :(得分:0)

我不会混合特征选择步骤和超参数优化步骤。

事实是,您正在将选择器传递给Grid Search而不是估算器-这可能最终可以工作,但这可能不是最好的主意,因为两者是不同的类,并且具有不同的方法。

我不确定两者的实现方式,但是如果只有几个重要的功能(甚至可能只有一个),RFECV可能会返回少量功能,这似乎是合理的,而GridSearchCV可能想要测试更多的功能-因此不可用。

另外,您正在执行的是交叉验证中的交叉验证,这似乎是不必要的。对于Grid Search的每次评估,您都要运行选择器5次,然后依次运行“ Random Forest” 5次以选择要素数量。

最后,我认为您最好将两个步骤分开。首先通过RFECV查找最重要的功能,然后为max_features查找最佳参数。

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