RFECV未按预期选出前5特征的判定规则及官方示例疑问
问题1:RFECV筛选特征的判定标准是什么?
- RFECV的判定逻辑分为两步:
- 首先执行递归特征消除(RFE)流程:每次用传入的估计器拟合全部当前保留的特征,根据估计器输出的特征重要性(对线性回归来说默认是系数绝对值)剔除重要性最低的N个(N由step参数控制),重复迭代直到剩下1个特征,过程中会记录所有特征数对应的特征子集。
- 然后对每一种特征数对应的特征子集做交叉验证,计算交叉验证的平均得分,最终选择平均交叉验证得分最高对应的特征子集作为筛选结果。
- 你提到手动加特征能提升训练集调整R²,但RFECV只选1个特征,是因为调整R²是训练集指标,而RFECV以交叉验证的测试集泛化得分为准,你加入的额外特征虽然在训练集上有提升,但在交叉验证的测试集上没有增益甚至会降低泛化性能,所以被判定为无效特征。
问题2:官方示例仅选出5个特征,是否是因为排名为1的特征数量刚好是5?
- 这个逻辑是反过来的:官方示例用的是人工生成的模拟数据集,本身仅包含5个有真实预测效力的特征,其余都是无信息的噪声特征。RFECV做交叉验证后会发现保留5个特征时泛化得分最高,因此最终这5个特征的排名被标记为1,其余特征排名高于1,不是预先设定排名为1的数量是5。
- 特征排名是RFE流程的产物:最终入选最优子集的所有特征排名都是1,被剔除的特征按照被剔除的轮次依次获得2、3、4...的排名。
针对你的代码的额外提示
你当前的公式使用了四阶交互项gender*favor_programming_career*favor_seeking_risk*industry,会生成大量高度共线性的特征,线性回归的系数估计会非常不稳定,直接影响RFECV的特征重要性判断,导致筛选结果偏差。你可以先检查rfe_model.cv_results_['mean_test_score']的数值,确认不同特征数对应的交叉验证得分,也可以更换对共线性更鲁棒的估计器(比如Lasso回归)再做RFECV测试。
你编写的代码参考:
deskewed = analysis.getDeskewedData() kitchen_sink_formula = '''hirability ~ + gender*favor_programming_career*favor_seeking_risk*industry + 1''' kitchen_sink_model = sm.OLS.from_formula(kitchen_sink_formula, data=deskewed) y = kitchen_sink_model.endog X = kitchen_sink_model.exog estimator = LinearRegression() rfe_model = RFECV(estimator, step=1, cv=5) results = rfe_model.fit(X, y) print(results.support_) # 仅1个特征为TRUE
内容的提问来源于stack exchange,提问作者John Vandivier
相关产品推荐
相关产品推荐

