📢 转载信息
原文链接:https://www.kdnuggets.com/5-useful-python-scripts-for-effective-feature-selection
原文作者:Bala Priya C
5个实用的Python脚本,用于有效的特征选择
了解五个简单的Python脚本,以执行有效的特征选择。每个脚本都实用、简洁且易于在实际项目中使用。
作者:Bala Priya C,KDnuggets 特约编辑兼技术内容专家,发布于 2026年3月30日,分类:Python
图片作者
# 引言
作为一名机器学习从业者,您知道特征选择是一项重要但耗时的工作。您需要识别哪些特征实际有助于模型性能,删除冗余变量,检测多重共线性,过滤噪声特征,并找到最优特征子集。对于每种选择方法,您都需要测试不同的阈值,比较结果,并跟踪有效的方法。
随着您的特征空间的增长,这变得更具挑战性。拥有数百个工程特征,您将需要系统的方法来评估特征重要性,消除冗余,并选择最佳子集。
本文介绍了五个旨在自动化最有效的特征选择技术的Python脚本。
# 1. 使用方差阈值过滤常数特征
// 痛点
低方差或零方差的特征对预测几乎没有信息。在所有样本中恒定或近乎恒定的特征无法帮助区分不同的目标类别。手动识别这些特征意味着计算每列的方差,设置适当的阈值,并处理二元特征或不同尺度特征的边缘情况。
// 脚本功能
根据可配置的阈值识别和移除低方差特征。适当处理连续特征和二元特征,规范化方差计算以实现跨不同尺度的公平比较,并提供详细的报告,显示哪些特征被移除及其原因。
// 工作原理
该脚本根据特征类型计算每个特征的方差,并应用不同的策略。
- 对于连续特征,它计算标准方差,并可选择按特征范围进行归一化,以使阈值具有可比性。
- 对于二元特征,它计算少数类别的比例,因为二元特征的方差与类别不平衡有关。
低于阈值的特征将被标记为移除。脚本维护已移除特征及其方差得分的映射,以确保透明度。
# 2. 通过相关性分析消除冗余特征
// 痛点
高度相关的特征是冗余的,并且可能导致线性模型的共线性问题。当两个特征高度相关时,保留两者会增加维度但不会增加信息。但是,拥有数百个特征,识别所有相关对,决定保留哪个,并确保保留与目标最相关的特征需要系统分析。
// 脚本功能
使用皮尔逊相关性(对于数值特征)和Cramér's V(对于分类特征)识别高度相关的特征对。对于每对相关特征,根据其与目标变量的相关性自动选择要保留的特征。在最大化预测能力的同时移除冗余特征。生成相关性热力图和已移除特征的详细报告。
// 工作原理
脚本计算所有特征的相关矩阵。对于超出相关性阈值的每对特征,它会比较这两个特征与目标变量的相关性。与目标相关性较低的特征将被标记为移除。此过程会迭代进行,以处理相关特征链。脚本处理缺失值、混合数据类型,并提供可视化,显示相关性簇和每对特征的选择决策。
# 3. 使用统计检验识别显著特征
// 痛点
并非所有特征都与目标变量具有统计学上的显著关系。与目标没有有意义关联的特征会增加噪声,并经常增加过拟合的风险。测试每个特征需要选择适当的统计检验,计算 p 值,纠正多重检验,并正确解释结果。
// 脚本功能
该脚本根据特征类型和目标变量类型自动选择并应用适当的统计检验。它使用方差分析 (ANOVA) F 检验来处理数值特征与分类目标,使用卡方检验来处理分类特征,使用互信息评分来捕捉非线性关系,并在目标是连续变量时使用回归 F 检验。然后,它应用Bonferroni 或错误发现率 (FDR) 纠正来处理多重检验,并返回所有按统计显著性排序的特征,以及它们的 p 值和检验统计量。
// 工作原理
脚本首先确定特征类型和目标类型,然后将每个特征路由到正确的检验。对于具有数值特征的分类任务,ANOVA 检验数值特征的均值在不同目标类别之间是否存在显著差异。对于分类特征,卡方检验用于检查特征与目标之间的统计独立性。互信息评分会与这些检验一起计算,以找出可能被标准检验遗漏的任何非线性关系。当目标是连续变量时,则使用回归 F 检验。
运行所有检验后,p 值使用 Bonferroni 纠正(将每个 p 值乘以特征总数)或错误发现率方法进行调整,以获得不那么保守的纠正。调整后的 p 值低于默认显著性阈值 0.05 的特征将被标记为统计显著,并优先包含。
如果您对更严格的统计方法进行特征选择感兴趣,我建议您按照以下方法进一步改进此脚本。
// 您还可以探索和改进的内容
在假设不成立时使用非参数替代方法。 ANOVA 假设各组的近似正态性和方差相等。对于严重偏斜或非正态特征,切换到Kruskal-Wallis 检验是一种更稳健的选择,它不依赖于任何分布假设。
小心处理稀疏分类特征。 卡方检验要求预期的单元格频率至少为 5。当此条件不满足时(在类别基数高或类别不频繁时很常见),Fisher 精确检验是一种更安全、更准确的替代方法。
将互信息分数与 p 值分开处理。 由于互信息分数不是 p 值,因此它们不适合 Bonferroni 或 FDR 纠正框架。一种更清晰的方法是独立地按互信息分数对特征进行排序,并将其作为补充信号,而不是将其合并到同一个显著性管道中。
在高维设置中优先使用错误发现率纠正。 Bonferroni 的设计初衷是保守的,这在误报成本非常高时是合适的,但当您拥有大量特征时,它可能会丢弃真正有用的特征。Benjamini-Hochberg FDR 纠正在宽数据集(数据维度远大于样本数)中提供了更多的统计功效,并且通常在机器学习特征选择工作流中是首选。
在 p 值旁边包含效应量。 仅统计显著性并不能告诉您特征的实际意义有多大。将 p 值与效应量指标配对,可以更全面地了解哪些特征值得保留。
添加置换检验的重要性检验。 对于复杂或混合类型的数据集,置换检验提供了一种模型无关的方式来评估显著性,而无需依赖任何分布假设。它通过反复打乱目标变量并检查特征偶然获得相同分数的频率来工作。
# 4. 使用基于模型的特征重要性分数进行特征排名
// 痛点
基于模型的特征重要性可以提供对哪些特征有助于预测准确性的直接洞察,但不同的模型会给出不同的重要性分数。运行多个模型,提取重要性分数,并将结果合并成一致的排名很复杂。
// 脚本功能
训练多种模型类型并从中提取特征重要性。跨模型对重要性分数进行归一化以进行公平比较。通过对各模型进行平均或排名来计算集成重要性。提供置换重要性作为模型无关的替代方案。返回带有各模型重要性分数的排名特征和推荐的特征子集。
// 工作原理
脚本在完整的特征集上训练每种模型类型,并提取原生的重要性分数,如森林的基于树的重要性以及线性模型的系数。对于置换重要性,它会随机打乱每个特征并测量模型性能的下降。重要性分数被归一化为在每个模型内总和为 1。
集成分数是通过所有模型上的平均排名或平均归一化重要性来计算的。特征按集成重要性排序,并选择排名前 N 的特征或那些超过重要性阈值的特征。
# 5. 通过递归特征消除优化特征子集
// 痛点
最优特征子集不一定是单个特征中排名前 N 的特征;特征交互也很重要。一个特征单独来看可能较弱,但与其他特征结合使用时可能很有价值。递归特征消除通过迭代移除最弱的特征并重新训练模型来测试特征子集。但这需要运行数百次模型训练迭代并跟踪不同子集大小下的性能。
// 脚本功能
以迭代过程系统地移除特征,在每个步骤重新训练模型并评估性能。从所有特征开始,在每次迭代中移除最重要的特征。跟踪所有子集大小下的模型性能。识别最大化性能或以最少特征实现目标性能的最优特征子集。支持交叉验证以获得稳健的性能估计。
// 工作原理
脚本从完整的特征集开始并训练一个模型。它按重要性对特征进行排名并移除排名最低的特征。此过程会重复,在每次迭代中使用减少的特征集训练新模型。准确性、F1 和 AUC 等性能指标会针对每个子集大小进行记录。
脚本应用交叉验证以在每个步骤获得稳定的性能估计。最终输出包括性能曲线,显示指标如何随特征数量变化,以及最优特征子集。这意味着您可以看到最优性能或增加特征收益递减的肘部点。
# 总结
这五个脚本解决了特征选择的核心挑战,这些挑战决定了模型的性能和训练效率。以下是快速概述:
| 脚本 | 描述 |
|---|---|
| 方差阈值选择器 | 移除无信息量(恒定或近乎恒定)的特征。 |
| 基于相关性的选择器 | 在保留预测能力的同时消除冗余特征。 |
| 统计检验选择器 | 识别与目标具有显著关系的特征。 |
| 基于模型的选择器 | 使用来自多个模型的集成重要性对特征进行排名。 |
| 递归特征消除 | 通过迭代测试找到最优特征子集。 |
每个脚本都可以独立用于特定的选择任务,也可以组合成一个完整的流水线。祝您特征选择顺利!
Bala Priya C是一位来自印度的开发者和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她的兴趣和专业领域包括 DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正在通过撰写教程、操作指南、观点文章等来学习并与开发者社区分享她的知识。Bala 还创建了引人入胜的资源概述和编码教程。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区