sklearn 中的 RFECV,来自 grid_scores_ 的分数

Posted

技术标签:

【中文标题】sklearn 中的 RFECV,来自 grid_scores_ 的分数【英文标题】:RFECV in sklearn, scores from grid_scores_ 【发布时间】:2020-01-08 21:15:59 【问题描述】:

我正在使用sklearn.feature_selection.RFECV

ref = RFECV(lr, step=1, cv =5, scoring="r2")
ref.fit(X_ndarr, y_ndarr)
print(ref.grid_scores_)

我明白了:

[ 0.9316829 0.93472609 0.79440118 -2.37744438 -1.20559428 -1.35899883 -0.90087801 -1.02047363 -0.54169276 -0.08116821 -0.00685128 0.1561999 -0.26433411 -0.27843449 -0.32703359 -0.32782641 -0.30881354 0.11878835 0.08175137 0.04300757 0.0378917 0.04534877]

RFECV 在每个步骤中删除最不重要的特征,因此例如得分10 个功能应该是任何 10 个功能的最佳得分,而当我使用选定的 10 个功能(使用另一种方式)运行以下代码时:

from sklearn.model_selection import cross_val_score
lr = linear_model.LinearRegression()
scores = cross_val_score(lr, X_top10_ndarr, y_ndarr, cv=5) # top10 features

然后我得到:

交叉验证分数:[0.96706997 0.9653103 0.96386666 0.96017565 0.96603127]

所有分数都在 0.96 左右,而来自RFECV 的 10 个特征的分数是 -0.08

这里到底发生了什么?

EDIT1:选择的特征数量为2ranking_如下:

[ 4 7 1 6 3 2 8 11 5 10 21 9 12 14 13 15 16 19 18 17 1 20] p>

【问题讨论】:

【参考方案1】:

ref.grid_scores_ 表示交叉验证分数,使得 grid_scores_[i] 对应于第 i 个特征子集的 CV 分数。

请参阅this 答案以进一步了解这些值。

按照这个解释,模型对 10 个特征的 cv 得分将是 -0.26433411

话虽如此,分数确实很差,因为它是负数,可能线性模型可能不适合您的数据集。

还有一点需要注意的是,即使是所有的特征,你也只有 0.9316829 小于 0.96。

可以使用 StratifiedKFold 设置 random_state 并将其作为 cv 参数值提供。

【讨论】:

谢谢。我还以为是-0.26,但是n_features_2,而且arr 中的第二项是最大的。要自己验证它,请为此打印grid_scores_:scikit-learn.org/stable/auto_examples/feature_selection/… 所以,我认为文档也不准确!您还提到 LR 可能不太适合,那么为什么当我用 CV 做 LR 时它很适合? RFECV 应该在任何 10 个特征组合中给出最好的结果。对吗?

以上是关于sklearn 中的 RFECV,来自 grid_scores_ 的分数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn | RFECV + 线性回归给出“'LinearRegression'对象没有属性'coef_'”

scikit learn(sklearn) 中 RFECV 中的特征如何排名?

如何获得每个 rfecv 分数的特征索引?

如何在 sklearn 中使用 SVC 运行 RFECV

通过 Sklearn 的 RFECV(带有交叉验证的递归特征消除)选择特定数量的特征

PyCaret 成功解决无法从‘sklearn.model_selection._search‘导入名称“_check_param_grid”