特征选择
删除低价值、冗余或不稳定特征,降低方差、成本与解释负担,并把选择过程限制在训练折内。
学习前需要掌握
背景与问题
更多特征不必然提供更多有效信息,也可能增加噪声、计算成本与不稳定性。特征选择尝试保留一个子集,但其依据与评价边界同样需要审查。
特别是按标签相关性挑选列时,选择过程本身已经使用监督信息,不能放在验证之外当成无关准备工作。
概念定义
特征选择从现有表示中保留部分列,常见方法包括低方差筛选、统计关系筛选、模型内稀疏权重、树重要性和递归消除。它与生成新表示的特征构造、PCA 降维不同。
“被删除”只表示某个方法与当前数据、参数下没有保留该列,不等于该因素在现实中无作用,更不等于得到因果结论。
直观理解
像为一个具体任务整理工具箱:需要看这次任务和其他工具的组合,而不是给每件工具贴上永远有用或永远无用的标签。相关特征之间还可能互相替代。
低方差筛选只说明变化幅度
构造四行、三列数据:第一列 [0,1,2,3],第二列全为 1,第三列 [0,1,0,1]。总体方差分别为 1.25、0、0.25,若阈值为 0.5,只保留第一列。
但若目标恰好由第三列决定,删掉它就可能伤害预测。这个例子演示选择器的规则,不证明“方差小就没价值”;真正取舍仍要在训练内部验证。
核心原理
所有数据驱动的选择应在训练范围完成,交叉验证时放入当前折的 Pipeline。先使用全数据选列,再对剩余列 CV,会让验证折的信息进入模型选择。
低方差只衡量某列在当前数据中的波动,不保证它缺少标签信息;罕见但关键事件的指示列也可能方差很小。选择准则应与任务匹配。
相关特征可能分摊或交换模型权重,导致单次选择不稳定。应检查跨折、重采样或合理参数扰动下的保留情况,而不是只报告一个清单。
最终比较要包含预处理、选择与预测的整条管线,并权衡性能、采集成本与稳定性。选择阈值同样属于超参数,不应使用测试集反复调整。
计算与实现步骤
- 删除不可用和泄漏特征。
- 删除常量、重复和明显冗余。
- 选择与任务匹配的方法。
- 放入 Pipeline。
- 用相同交叉验证比较性能与稳定性。
- 记录保留特征和采集成本。
代码实现
示例 1
核对低方差规则与固定输出列
example_01.py用途:给出完整数据,展示拟合后的列选择如何应用于未来样本。
from sklearn.feature_selection import VarianceThreshold
X_train = [[0., 1., 0.], [1., 1., 1.], [2., 1., 0.], [3., 1., 1.]]
selector = VarianceThreshold(threshold=0.5).fit(X_train)
print("selected:", selector.get_support().tolist())
print("future:", selector.transform([[4., 1., 1.]]).tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
给出完整数据,展示拟合后的列选择如何应用于未来样本。
X_train- 训练特征,只允许它参与预处理器和模型的 fit。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.feature_selection import VarianceThreshold
X_train = [[0., 1., 0.], [1., 1., 1.], [2., 1., 0.], [3., 1., 1.]]
selector = VarianceThreshold(threshold=0.5).fit(X_train)
print("selected:", selector.get_support().tolist())
print("future:", selector.transform([[4., 1., 1.]]).tolist())预期输出或运行结果
selected: [True, False, False] future: [[4.0]]
常见错误 · 4 条
- 完整数据选择后再 CV
- 把重要性解释为因果
- 高度相关特征选择不稳定
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 高维表格
- 稀疏文本
- 降低采集成本
常见错误
- 完整数据选择后再 CV
- 把重要性解释为因果
- 高度相关特征选择不稳定
推荐学习资料
参考库不会生成虚假资源或无效外部链接。