R语言中logistic回归的特征选择方法选型咨询
R环境下Logistic回归特征选择的补充方案与疑问解答
你当前疑问的针对性说明
分类因变量下的关联检验与热图实现
你之前找ANOVA相关示例没结果、不确定能不能做相关热图,核心是没对应对不同变量类型的匹配检验方法:
- 分析自变量和分类因变量的关联强度,根本不需要找所谓的“ANOVA相关系数”:
- 连续型自变量配二分类因变量:直接用
t.test()做组间差异检验,多分类因变量就用aov()跑ANOVA,逻辑就是看不同因变量分组下的自变量分布差,差越大关联越强 - 分类型自变量配分类因变量:用
chisq.test()、fisher.test()做关联检验就行
- 连续型自变量配二分类因变量:直接用
- 相关热图完全能做:不用套连续变量用的皮尔逊相关系数,把上面检验输出的统计量(t值绝对值、F值、卡方值)或者互信息值当关联强度的量化指标,用
pheatmap包直接画热图就可以。
现有方法的常见批评与可替代/补充的特征选择方法
你用的「Lasso初筛+stepAIC复筛」是常规操作,但这俩的普遍问题是:Lasso遇到高度相关的特征会随机留一个、stepAIC是贪心搜索,容易过拟合训练集的AIC规则,可以根据场景补下面的方法:
1. 先做前置共线性处理
- 方差膨胀因子(VIF)筛选:给Lasso筛出来的24个变量算VIF,一般把VIF>5(要严点就用>10)的变量逐个剔除,直到所有变量VIF达标,用
car包的vif()函数就能跑。
2. 比普通Lasso更稳的惩罚类回归
- 弹性网(Elastic Net):把Lasso的特征筛选能力和岭回归的抗共线性能力结合起来,能解决Lasso对高相关特征乱选的问题,用
glmnet包设alpha=0.5就行(取0是纯岭回归,取1是纯Lasso)。 - 自适应Lasso:给惩罚项加权重,给重要的特征少加惩罚,筛出来的结果比普通Lasso更贴近真实的变量重要性,基于
glmnet的权重参数就能实现。
3. 替代stepAIC的稳定包装法
- 递归特征消除(RFE):反复训练logistic回归,每次剔掉系数最小的特征,靠交叉验证找最优的特征子集,不会像stepAIC那样贪心搜完就过拟合,用
caret包的rfe()函数指定logistic回归当基模型就行。 - 置换重要性筛选:先训个初始模型,然后逐个打乱单个自变量的取值,看模型预测精度掉了多少,掉的幅度低于阈值的特征就直接剔,这方法不看系数p值,比你之前用p≈0.1剔变量靠谱多了,用
vip包的vip()函数直接出结果。
4. 更靠谱的统计显著性筛选
- 换个p值的来源:你之前用来剔变量的p值大多是Wald检验出来的,样本量小或者特征多的时候结果特别飘,换成似然比检验就行:每次移除一个特征,对比模型偏差(Deviance)的变化显不显著,用
lmtest包的lrtest()函数就能跑。
5. 必做的泛化性验证
- 所有选出来的特征子集都要跑k折交叉验证:别只看训练集的AIC、p值就定,要对比不同特征数量下测试集的AUC、准确率之类的指标,不然很容易选出来一堆过拟合的特征,用
caret包的train()函数直接配交叉验证参数就行。
适配你当前操作的综合流程建议
结合你已经走完的初筛步骤,按这个顺序调整就顺:
- 先给Lasso筛出来的24个变量跑VIF检验,把高共线性的变量先剔了
- 用弹性网重新筛一遍,两种惩罚方法都觉得重要的特征再留
- 用RFE替代stepAIC做后续的子集筛选,靠交叉验证定最优特征数
- 用似然比检验的结果替代Wald检验的p值,剔掉统计上不显著的特征
- 最后跑一遍置换重要性,确认所有留的特征都是真的对预测有贡献
内容的提问来源于stack exchange,提问作者user000
相关产品推荐
相关产品推荐

