scikit-learn的RFECV `cv_results`属性按什么排序?
我在我的训练数据上使用一个二分类器 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')
)现在的顺序如下:
我觉得结果是按升序排列的(首先是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