使用 RFECV 的最佳特征和网格分数之间的不匹配?

数据挖掘 机器学习 数据挖掘 预测建模 特征选择 特征工程
2022-03-02 15:33:16

我有一个包含 5K 列的数据集,专注于二进制分类。我有超过 60 列。我正在尝试通过 RFECV 方法找到最佳功能。虽然它产生了 30 个最佳特征,但当我在图中绘制时,我只看到 12 个特征。请在下面查看我的代码和绘图

model  = RandomForestClassifier(n_estimators=100, random_state=0)
model_b = LinearSVC(class_weight='balanced',max_iter=1000)
# create the RFE model and select 15 attributes
rfe = RFECV(model,step=5,cv=5)
rfe = rfe.fit(X_train_std, y_train)
# summarize the selection of the attributes
feat = rfe.support_
fret = rfe.ranking_
features = X.columns
print(rfe.n_features_) # this returns 30 as output

print(rfe.grid_scores_) this produces the below output

在此处输入图像描述

我期待看到 30 个特征的网格得分,在图中,我期待看到 x 轴也有 30 个特征。但它仅显示 12 个功能。同样,如果我的数据集中只有 19 个特征,RFECV 会返回所有 19 个作为最佳特征,这很好。但再次在网格分数中它只显示 4

q1) 这是否意味着超过 12 个特征,模型准确率没有增加?

q2)我假设 grid_scores 只不过是权重/排名,它表示特征对结果的影响。但是我如何获得这 12 个功能的名称呢?

q3)为什么它显示最佳特征数为 30,但网格分数仅显示为 12。

你能帮我解决这些问题吗?

1个回答

RFE 代表递归特征消除,这意味着搜索从一整套特征开始,并且每一步都会删除一些特征(在您的情况下为 5 个),以试图提高模型的预测能力。如果我们仔细看看sklearn 的 RFECV 参考资料,它指出:

grid_scores_:形状数组 [n_subsets_of_features]

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

被引用的第i 个特征子集是在搜索的特定步骤中被评估的特征组。从您的输出(和绘图)来看,只需要 12 个步骤即可确定哪些 30 个功能是最佳的,并且使用所选方法无法找到进一步的改进 - 这就是为什么您会看到 CV 分数增加,然后是平台期。您在q1中的假设几乎是正确的,但是您正在查看算法步骤,而不是功能。这只是一个误解问题,q3也是如此。

至于q2,您需要查看 RFECV 对象的support_属性。它返回一个对应于 X.columns 的布尔掩码(如果为 True,则选择该特征,如果为 False,则不选择)。您也可以查看ranking_,但它仅提供有关丢弃特征的“优点”的信息(所有选定的特征都排名第1)。所选特征的重要性是特定于模型的。对于RandomForestClassifier,您可以查看feature_importances_对于LinearSVC,请查看coef_

希望这能回答你的问题。祝您选择顺利!