特征工程之相关性筛选
相关性筛选指的是通过计算特征之间或特征与标签之间的相关性筛选出最有用的特征剔除冗余或无关的特征。它属于你之前看的组件列表里特征工程组件 - Python特征工程组件 - 相关性筛选的核心功能。下面我从概念、常见方法、代码实现、典型场景几个方面来讲。一、为什么需要相关性筛选现实数据中特征往往存在以下问题特征之间高度相关冗余比如身高(cm)和身高(m)信息几乎重复。特征与标签无关比如用户ID对是否流失没有预测力。维度太高几百上千个特征训练慢、容易过拟合。相关性筛选的目的剔除冗余特征减少维度。保留与标签最相关的特征。提升模型效果和训练速度。二、相关性的两种类型类型衡量什么用途特征-特征相关性特征之间的冗余程度剔除冗余特征特征-标签相关性特征对标签的预测能力筛选有用特征三、常见的相关性度量方法方法适用数据类型取值范围特点皮尔逊相关系数连续 vs 连续[-1, 1]衡量线性关系斯皮尔曼相关系数连续/有序[-1, 1]衡量单调关系抗异常值肯德尔相关系数有序[-1, 1]衡量一致性卡方检验类别 vs 类别p值衡量独立性互信息任意 vs 任意[0, ∞)衡量任意关系方差膨胀因子VIF连续 vs 连续[1, ∞)衡量多重共线性距离相关系数任意 vs 任意[0, 1]衡量任意关系四、代码实现1. 皮尔逊相关系数pandas.corr()import pandas as pd import numpy as np # 构造数据 np.random.seed(42) df pd.DataFrame({ height_cm: [170, 175, 180, 165, 185], height_m: [1.70, 1.75, 1.80, 1.65, 1.85], # 与 height_cm 高度相关 weight: [65, 70, 75, 60, 80], age: [25, 30, 35, 40, 45], label: [0, 1, 1, 0, 1] }) # 计算相关系数矩阵 corr_matrix df.corr() print(corr_matrix)输出height_cm height_m weight age label height_cm 1.000000 1.000000 0.998... 1.000... 0.316... height_m 1.000000 1.000000 0.998... 1.000... 0.316... weight 0.998... 0.998... 1.000000 0.998... 0.316... age 1.000... 1.000... 0.998... 1.000000 0.316... label 0.316... 0.316... 0.316... 0.316... 1.0000002. 剔除高度相关的特征特征-特征# 找出相关性大于 0.95 的特征对 threshold 0.95 corr_matrix_abs corr_matrix.abs() # 只看上三角避免重复 upper corr_matrix_abs.where(np.triu(np.ones(corr_matrix_abs.shape), k1).astype(bool)) # 找出需要删除的列 to_drop [column for column in upper.columns if any(upper[column] threshold)] print(需要删除的列:, to_drop) # 删除 df_reduced df.drop(columnsto_drop) print(df_reduced)输出需要删除的列: [height_m, weight, age] height_cm label 0 170 0 1 175 1 2 180 1 3 165 0 4 185 13. 特征-标签相关性筛选# 计算每个特征与 label 的相关性 corr_with_label df.corr()[label].drop(label) print(corr_with_label) # 筛选相关性绝对值大于 0.1 的特征 selected corr_with_label[corr_with_label.abs() 0.1].index.tolist() print(筛选后的特征:, selected)4. 斯皮尔曼相关系数# methodspearman 或 kendall corr_spearman df.corr(methodspearman) print(corr_spearman)5. 卡方检验类别 vs 类别from sklearn.feature_selection import chi2 from sklearn.preprocessing import LabelEncoder # 构造类别数据 X np.array([ [男, 北京], [女, 上海], [男, 北京], [女, 广州], [男, 上海] ]) y np.array([0, 1, 0, 1, 1]) # 先做 OneHot 或 Label 编码 from sklearn.preprocessing import OneHotEncoder encoder OneHotEncoder(sparse_outputFalse) X_encoded encoder.fit_transform(X) # 卡方检验 chi2_scores, p_values chi2(X_encoded, y) print(卡方值:, chi2_scores) print(p值:, p_values)6. 互信息mutual_info_classif/mutual_info_regressionfrom sklearn.feature_selection import mutual_info_classif, mutual_info_regression # 分类问题 mi_scores mutual_info_classif(X_encoded, y, random_state42) print(互信息分类:, mi_scores) # 回归问题 # mi_scores mutual_info_regression(X_encoded, y)互信息能捕捉非线性关系比皮尔逊更通用。7. 方差膨胀因子VIF—— 检测多重共线性from statsmodels.stats.outliers_influence import variance_inflation_factor # VIF 需要数值型数据 X_vif df[[height_cm, weight, age]].values vif_data pd.DataFrame() vif_data[feature] [height_cm, weight, age] vif_data[VIF] [variance_inflation_factor(X_vif, i) for i in range(X_vif.shape[1])] print(vif_data)输出示例feature VIF 0 height_cm 1234.56 1 weight 987.65 2 age 2345.67VIF 判断标准VIF 5无多重共线性5 ≤ VIF 10中度共线性VIF ≥ 10严重共线性建议删除8. sklearn 的SelectKBest 相关性from sklearn.feature_selection import SelectKBest, f_classif # 用 F 检验选前 k 个特征 selector SelectKBest(score_funcf_classif, k2) X_selected selector.fit_transform(X_encoded, y) print(选中的特征索引:, selector.get_support(indicesTrue)) print(特征得分:, selector.scores_)9.VarianceThreshold—— 剔除低方差特征from sklearn.feature_selection import VarianceThreshold # 剔除方差小于 0.1 的特征 selector VarianceThreshold(threshold0.1) X_selected selector.fit_transform(X_encoded) print(选中的特征索引:, selector.get_support(indicesTrue))10. 在 Pipeline 中使用from sklearn.pipeline import Pipeline from sklearn.feature_selection import SelectKBest, f_classif from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split(X_encoded, y, test_size0.3, random_state42) pipe Pipeline([ (scaler, StandardScaler()), (select, SelectKBest(score_funcf_classif, k2)), # 选前2个特征 (clf, LogisticRegression()) ]) pipe.fit(X_train, y_train) print(测试集准确率:, pipe.score(X_test, y_test))五、相关性筛选的常用阈值场景阈值建议特征-特征相关性剔除冗余0.9 或 0.95特征-标签相关性保留有用0.1 或 0.05p值VIF多重共线性5 或 10互信息看排序选前 k 个方差阈值0.01 或 0.1注意阈值不是绝对的要结合业务和数据特点调整。六、典型应用场景场景方法剔除冗余特征特征-特征相关性 0.95筛选有用特征特征-标签相关性检测多重共线性VIF类别特征筛选卡方检验、互信息非线性关系筛选互信息、距离相关高维数据降维SelectKBest 相关性回归问题mutual_info_regression、f_regression七、相关性筛选的优缺点优点简单快速计算成本低容易理解。减少维度剔除冗余特征加快训练。提升可解释性保留的特征更有业务意义。减少过拟合维度降低模型更简单。缺点只看线性关系皮尔逊只能捕捉线性关系非线性要用互信息。忽略特征组合两个特征单独与标签不相关组合起来可能很相关。可能误删相关性高不代表冗余有时两个特征都重要。阈值难定0.95 还是 0.9需要实验。不适用于所有模型树模型对冗余特征不敏感筛选收益有限。八、关键提醒相关性 ≠ 因果性两个特征相关不代表一个导致另一个。筛选参数从训练集学相关性计算、阈值选择只用训练集避免数据泄露。结合业务判断统计上相关业务上可能无意义要综合判断。互信息能捕捉非线性线性关系用皮尔逊非线性用互信息。特征组合可能有用两个单独不相关的特征组合起来可能很强筛选时要注意。树模型不需要XGBoost、LightGBM 对冗余特征不敏感筛选收益有限。筛选后要重新评估筛选可能丢信息要检查模型效果是否真的提升。九、相关性筛选 vs 其他特征选择方法方法类型特点相关性筛选Filter过滤式快独立于模型卡方检验Filter类别特征互信息Filter任意关系RFE递归特征消除Wrapper包裹式用模型选慢但效果好Lasso / L1 正则Embedded嵌入式模型自带特征选择树模型特征重要性Embedded随机森林、XGBoost 自带十、总结相关性筛选 通过计算特征之间或特征与标签之间的相关性筛选出最有用的特征。两种类型特征-特征相关性剔冗余、特征-标签相关性选有用。常用方法皮尔逊、斯皮尔曼、卡方、互信息、VIF。sklearn 实现SelectKBest、VarianceThreshold、mutual_info_classif。核心价值降维、去冗余、提升模型效果和可解释性。主要代价只看线性、忽略组合、可能误删。关键原则参数从训练集学结合业务判断树模型收益有限。

相关新闻

FlinkX 流式同步实战:从 Sqoop 离线批同步到 binlog 增量同步的架构演进

FlinkX 流式同步实战:从 Sqoop 离线批同步到 binlog 增量同步的架构演进

1. 为什么离线批同步的老路子越来越走不通了做数据平台的人大概都有过这种体验:凌晨两点,调度系统里一堆 Sqoop 任务还在跑,日志刷得飞快,但就是不见结束。第二天早上业务方要看报表,发现昨天的数据还没同步完&#xf…

2026/10/14 6:12:24 阅读更多 →
从ponytail热词看AI绘画提示词与插件识别指南

从ponytail热词看AI绘画提示词与插件识别指南

如果你最近在搜索引擎里敲过“ponytail”这个词,大概率会跟我遇到一模一样的场面:页面里一半是各种马尾辫发型图,另一半却蹦出“ponytail skill”“ponytail 插件”这类看起来很技术、又完全猜不出指向什么的词。我第一次是在AI绘画工具的提示…

2026/10/14 6:12:24 阅读更多 →
小马智行杀入伦敦牵手Uber,中国Robotaxi出海怎么打?

小马智行杀入伦敦牵手Uber,中国Robotaxi出海怎么打?

10月8日,小马智行与Uber联合宣布,将把第七代Robotaxi引入伦敦,预计未来数周内启动道路测试。两个月前,双方规划在欧洲五座城市部署2000台辆Robotaxi,目前已经在克罗地亚萨格勒布推出全欧洲首个商业化Robotaxi服务。小马…

2026/10/14 6:11:24 阅读更多 →

最新新闻

LoadRunner 12录制+11压测:APP后端并发测试实战指南

LoadRunner 12录制+11压测:APP后端并发测试实战指南

简介:这份资源面向移动端性能测试工程师与后端开发人员,聚焦APP后台服务器的压力测试场景,解决LoadRunner无法直接录制手机APP脚本的痛点。核心思路是借助LoadRunner12的代理录制能力抓取APP请求,再将调试好的脚本放到LoadRunner1…

2026/10/14 6:59:33 阅读更多 →
Agent规模化落地:执行环境才是第一道坎

Agent规模化落地:执行环境才是第一道坎

1. 为什么Agent规模化,第一关就卡在执行环境过去大半年,我一直在用DeepSeek现成的API做Agent类项目。说实话,单机版玩Agent,体验是相当愉快的:模型推理能力在线、上下文窗口够用、工具调用也越来越稳,几个关…

2026/10/14 6:59:33 阅读更多 →
纯白主题紧凑型主机装机避坑指南

纯白主题紧凑型主机装机避坑指南

“男孩子的婚纱”这句话,第一次听到时我笑了,笑完之后又觉得特别贴切。攒钱、选件、等快递、拧螺丝、理线、反复点亮又拔掉重来,最后把侧板盖上,按下开机键的那一下整台机器亮起来——那个瞬间的满足感,真的不亚于新娘…

2026/10/14 6:59:33 阅读更多 →
限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

我最早被这个题目绊住,是A同学拿一个半成品代码来问:为什么轨道一旦靠近其中一颗主星,几秒之后就彻底崩了。那个代码写的是平面限制性三体问题——两个大质量天体在同一个平面内绕公共质心匀速转动,第三个小质量天体只受它们的引力…

2026/10/14 6:59:33 阅读更多 →
一个人用AI做六种短视频账号:漫剧、数字人、绘本全流程拆解

一个人用AI做六种短视频账号:漫剧、数字人、绘本全流程拆解

最近老同学跑来问我,一个人能不能同时做五六种短视频账号。我说能,但关键不是你会剪辑,而是你有没有一套能复用的AI工作流。你看现在站内最活跃的漫剧号、数字人口播号、绘本故事号,背后很可能就是一个人:选题用AI&…

2026/10/14 6:59:33 阅读更多 →
Python静态检查实战:pychecker原理、配置与CI接入指南

Python静态检查实战:pychecker原理、配置与CI接入指南

简介: pychecker 是一款面向 Python 开发者的静态代码分析工具,能在程序运行前检查语法错误、类型不匹配、未定义引用、未使用变量、循环依赖等问题。压缩包对应 pychecker-0.8.19 版本,除可直接执行的脚本外,还包含完整源代码…

2026/10/14 6:58:33 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →