scikit-learn的RFECV `cv_results`属性按什么排序?

1 投票
1 回答
42 浏览
提问于 2025-04-14 18:01

我在我的训练数据上使用一个二分类器 clf 进行了 RFECV 的实例训练。

我的训练数据有154个特征,我使用了10折交叉验证,每次迭代去掉五个特征。

rfecv = RFECV(
    estimator=clf,
    step=5,
    min_features_to_select=10,
    cv=10,
    scoring='precision',
    verbose=10,
    n_jobs=1,
    importance_getter='auto'
)

我不太明白生成的 rfecv.cv_results_ 字典是怎么排序的。把它转换成 pandas 数据框后,我发现行数对应于每一步测试的特征数量(也就是说,154, 149, 145, ..., 24, 19, 14)。

不过,我想知道哪一行对应于多少个特征。比如,第一行是代表使用154个特征的10个模型吗?

我的平均测试分数(rfecv.cv_results_.get('mean_test_score'))现在的顺序如下:

RFECV mean test scores

我觉得结果是按升序排列的(首先是14个特征的10个模型,然后是19个,再然后是24个,等等)。不过,这让我觉得有点反直觉,因为这个去除特征的过程是递归的,所以我在这里寻求帮助。

1 个回答

1

你说得对,特征消除的过程是从所有可用的特征开始,然后一步一步减少它们。

不过,结果确实是按照特征数量从少到多排序的。要证明这一点,可以查看源代码的第783行及之后的内容

# reverse to stay consistent with before
scores_rev = scores[:, ::-1]
self.cv_results_ = {}
self.cv_results_["mean_test_score"] = np.mean(scores_rev, axis=0)
self.cv_results_["std_test_score"] = np.std(scores_rev, axis=0)

for i in range(scores.shape[0]):
    self.cv_results_[f"split{i}_test_score"] = scores_rev[i]

为了让你的DataFrame更容易理解,你可以像这样在DataFrame中添加特征数量:

cv_results_df['num_features'] = 154 - cv_results_df.index * 5

撰写回答