1 特征工程
1.1| 什么是特征工 程
特征工程(Feature Engineering)是机器学习过程中非常重要的一步,指的是通过对原始数据的处理、转换和构造,生成新的特征或选择有效的特征,从而提高模型的性能 。一句话:把原始数据"加工"成模型更容易看懂、更好用的形式。
简单来说,特征工程是将原始数据转换为可以更好地表示问题的特征形式,帮助模型更好地理解和学习数据中的规律。优秀的特征工程可以显著提高模型的表现;反之,忽视特征工程可能导致模型性能欠佳。
| 需要迭代 | 不是一次搞定,要反复试、反复改 |
|---|---|
| 依赖具体情境 | 不同问题方法不同(预测房价 vs 识别垃圾邮件) |
| 需要领域知识 | 懂行的人才知道什么特征有用(医生知道哪些指标真能治病变) |
| 要看模型类型 | 给决策树用的特征和给神经网络用的可能不一样 |
| 数据类型不同,方法不同 | 处理图片、文字、数字表格,手法各不相同 |
1.2| 特征工程的内容
1.2.1、特征选择
特征选择(Feature Selection)是从已有特征中挑出最有用的、与目标变量关系最紧密的特征,去掉无关或冗余的特征。它的好处:
- 降低模型复杂度 → 模型更简单,训练更快。
- 减少过拟合(训练数据准确高,泛化能力差)风险 → 不让模型被无关噪声"迷惑"(噪声也学成规律了)。
- 提高模型性能 → 有时去掉不重要特征,模型反而更准。
⚠️ 注意:特征选择不会生成新特征 ,也不会改变数据结构,只是删减已有特征。
1️⃣ 过滤法(Filter Method)
概念:
-
通过统计指标评估每个特征与目标变量的关系,不依赖任何模型。
-
典型方法:
-
相关系数
-
卡方检验 (适用特征和目标都是类别型数据),检查特征与目标变量的独立性,卡方值越大 → 特征与目标相关性越强
举例:
预测学生是否能通过考试(Pass = Yes/No),有一个特征
Study_Habit(好/一般/差):Study_Habit Pass=Yes Pass=No 好 40 5 一般 30 20 差 5 30 -
信息增益 (公式计算得出,适用于分类问题 ),衡量某个特征能减少 多少不确定性 (熵)。信息增益 = 这个特征能帮你消除多少不确定性
信息增益大 信息增益小 知道它之后,结果变得很清楚 知道它之后,还是很混乱 特征很有用 特征没啥用 熵高 熵低 很混乱,什么都可能发生 很确定,结果很集中 难预测 好预测
-
特点:
- 简单快速
- 与具体模型无关
- 可能忽略特征之间的组合关系
举例(相关系数):
假设你要预测学生是否能通过考试(目标变量 Pass,是0或1),有4个特征:
| 特征 | 说明 |
|---|---|
| Hours | 学习时间(小时) |
| Sleep | 每天睡眠时间(小时) |
| Age | 学生年龄 |
| Hobbies | 每周兴趣爱好时间(小时) |
- 相关系数法 :计算每个特征和
Pass的相关系数。Hours→ 0.8(高度相关)Sleep→ 0.2(弱相关)Age→ 0.05(几乎无关)Hobbies→ 0.1(几乎无关)
- 结论 :保留
Hours,可能考虑Sleep;去掉Age和Hobbies。
🔹 过滤法直接用数学统计量来挑特征,不训练模型。
2️⃣ 包裹法(Wrapper Method)
通过反复训练模型,比较模型(临时评估模型)性能,来判断"用哪些特征最好"
"在这个模型 + 这批数据下,用哪些特征预测最准?"
RFE = Recursive Feature Elimination(递归特征消除):
"先全用 → 找最没用的 → 删掉 → 再来一轮"
优点
- 考虑 特征之间的组合效应
- 与具体模型强相关 → 精度高
缺点(致命)
❌ 训练次数多,计算成本极高
3️⃣ 嵌入法
嵌入法(Embedded Method)=特征选择被"嵌入"进模型训练过程里,训练一次模型,就顺便完成了特征选择
使用模型本身的特征选择机制(模型在优化目标函数时,自然"偏好"某些特征 )。这两类是嵌入法最经典、最重要的两条路线:树模型(结构型选择)和L1 正则(参数型选择)。
1.2.2、特征转换
对数据进行数学或统计处理,把数据"整理成模型更容易理解的样子" 。
1️⃣ 归一化 Normalization(0~1)
把一个特征线性缩放 到固定区间(通常是 [0, 1])。
典型模型:KNN、SVM、KMeans 。他们核心依赖的是距离。
举例(KNN):
- 特征1:年龄(0--100)
- 特征2:收入(0--100000)
👉 不归一化:
- 收入直接"碾压"年龄
- 年龄几乎不起作用
2️⃣标准化 Standardization(均值 0,方差 1)
通过减去均值并除以标准差,使特征的分布具有均值0,标准差1。
减均值 → 把"平均水平"移到 0
除标准差 → 把"波动大小"拉到同一尺度。
为什么一定要标准化?(核心动机)
不同特征的"数值尺度"不一样
如果不处理,模型会被"数值大的特征"误导。
🎯 任务:预测房价
原始特征
特征 数值范围 房屋面积(㎡) 30 -- 200 楼层 1 -- 30 距地铁距离(km) 0.1 -- 5
不标准化会发生什么?
对模型来说:
- 面积的数值最大
- 梯度 / 权重更新时,面积天然"话语权最大"
👉 即使:
- 地铁距离更重要
- 模型也会"更偏向面积"
标准化之后
特征 均值 标准差 标准化后 面积 100 40 (x−100)/40 楼层 15 6 (x−15)/6 距地铁 2 1 (x−2)/1 👉 模型看到的是"偏离平均水平多少个标准差"
为什么很多模型"更喜欢标准化"?
典型模型:
- 线性回归
- 逻辑回归
- SVM
- 神经网络
原因:
- 梯度下降更稳定
- 不同特征可比较
- 正则项(L1/L2)才有意义
| 标准化(Z-score) | 归一化(Min-Max) | |
|---|---|---|
| 目标 | 让数据以0为中心,标准差为1 | 让数据缩放到固定范围(通常是0~1) |
| 公式 | x−μσ\frac{x - \mu}{\sigma}σx−μ | x−xminxmax−xmin\frac{x - x_{min}}{x_{max} - x_{min}}xmax−xminx−xmin |
| 结果范围 | 无界(可以是负数,通常-3~+3) | 有界(固定在0~1之间) |
| 受异常值影响 | 较小 | 很大 |
| 什么时候用 | 数据分布接近正态、需要比较相对位置 | 需要固定范围、神经网络输入层 |
3️⃣ 对数变换 Log Transform
压缩大数,拉开小数,分布更"对称"
很多现实数据是:
- 收入
- 房价
- 点击量
👉 极度右偏
3000, 4000, 5000, 1000000
经过对数转换后:
| 原始收入 | log(收入) |
| --------- | ------- |
| 3000 | 8.01 |
| 5000 | 8.52 |
| 1,000,000 | 13.82 |
ln(3000)=ln(3×1000)=ln(3)+3ln(10)≈1.1+6.9=8.0
什么时候用?
✅ 特征是非负
✅ 分布极度偏态
✅ 线性模型 / 回归问题
4️⃣ 类别变量的编码
-
独热编码(One-Hot Encoding):将类别型变量转换为二进制列,常用于无序类别特征。
每个类别变成一列,是就标1,不是就标0 。类别之间没有大小关系,模型不会认为有熟悉。
-
标签编码(Label Encoding):将类别型变量映射为整数,常用于有序类别特征。
直接用数字0,1,2,3...代替类别 。必须要是有序类别:学历(小学<初中<高中<大学)、评分(差<中<良<优)。
-
目标编码(Target Encoding):将类别变量的每个类别替换为其对应目标变量的平均值或其他统计量。
房子编号 装修风格 房价(目标) 1 简约 100万 2 豪华 500万 3 田园 150万 4 豪华 600万 5 简约 120万 最后:把"装修风格"变成数字,让模型能学习。
-
频率编码(Frequency Encoding):将类别变量的每个类别替换为该类别在数据集中的出现频率。
| 类型 | 用法 |
|---|---|
| KNN / SVM | 归一化 / 标准化 |
| 线性模型 | 标准化 +(必要时)log |
| 树模型 | 通常不需要缩放 |
| 无序类别 | One-Hot |
| 有序类别 | Label |
| 高基数类别 | 频率 / 目标编码 |
1.2.3、特征构造
特征构造是基于现有的特征创造出新的、更有代表性的特征。通过组合、转换、或者聚合现有的特征,形成能够更好反映数据规律的特征。
1️⃣ 交互特征
单个特征不够用,特征之间"一起看"才有意义.
将两个特征组合起来,形成新的特征,例如,两个特征的乘积、和或差等。
2️⃣ 统计特征
把一堆数据,压缩成"有代表性"的几个数字。
从原始特征中提取统计值,例如求某个时间窗口的平均值、最大值、最小值、标准差等。
例如,在时间序列数据中,你可以从原始数据中提取每个小时、每日的平均值。
3️⃣日期和时间特征
从日期时间数据中提取如星期几、月份、年份、季度等特征。
例如,将"2000-01-01"转换为"星期几"、"是否节假日"、"月初或月末"等特征。
1.2.4、特征降维
当数据集的特征数量非常大时,特征降维可以帮助减少计算复杂度并避免过拟合。通过降维方法,可以在保持数据本质的情况下减少特征的数量。
降维的核心思想: 用更少的"关键维度",表达原来数据的主要信息
-
PCA:主成分分析(无监督)
通过线性变换将原始特征映射到 一个新的空间 ,使得新的特征(主成分)尽可能地保留数据的方差。找"变化最大的方向",用这些方向来代表数据
-
线性判别分析(LDA,监督)
核心思想 :不仅降维,还要找一条线让同类靠得近、异类离得远。把"不同类别的人"拉得尽量远,,把"同一类的人"挤得尽量紧,然后只用这一条"最会区分类别的方向"当新特征
👉 LDA 不是为了表示数据,而是为了"区分类别"
-
t-SNE(t-Distributed Stochastic Neighbor Embedding,t分布随机近邻嵌入)
为数据可视化而生,擅长把高维的"圈子"在平面上画出来。
👉 让"原本靠得近的点",在低维里还靠得近
-
自编码器
通过神经网络实现压缩。
通俗例子------写摘要与扩写:
- 编码器(Encoder):把一万字的小说总结成100字的梗概(降维)。
- 解码器(Decoder):根据这100字梗概,尝试还原出一万字的小说(重构)。
- 训练目标:如果还原出来的小说和原著一模一样,说明那100字抓住了灵魂!这100字就是降维后的特征。
1.3| 常用的方法
1.3.1|低方差过滤法
每个特征(每列)有自己的方差。
方差衡量 该特征在所有样本上的波动程度。不同特征之间不互相影响各自的方差计算对于特征的选择,可以直接基于方差来判断,这是最简单的。低方差的特征意味着该特征的所有样本值几乎相同,对预测影响极小,可以将其去掉。
1.3.2|相关系数法
通过计算特征与目标变量或特征之间的相关性,筛选出高相关性特征(与目标相关)或剔除冗余特征(特征间高度相关-特征重复)
-
皮尔逊相关系数
皮尔逊相关系数(Pearson Correlation)用于衡量两个变量的线性相关性,取值范围[-1,1]
- 正相关:值接近1,说明特征随目标变量增加而增加。
- 负相关:值接近-1,说明特征随目标变量增加而减少。
- 无关:值接近0,说明特征和目标变量无明显关系。
1️⃣ 皮尔逊衡量的是线性相关
2️⃣ 对异常值敏感
3️⃣ 常用于特征去冗余、线性模型前的筛选
-
斯皮尔曼相关系数
斯皮尔曼相关系数(Spearman's Rank Correlation Coefficient)的定义是等级变量 之间的皮尔逊相关系数。用于衡量两个变量之间的"单调关系强度 ",不关心是不是直线,只关心:是不是一起涨、一起跌 。取值范围[-1,1]。
举例:X (R_X) Y (R_Y) (d = R_X - R_Y) (d^2) 5 2 55 2 0 0 8 5 65 5 0 0 10 7 70 6 1 1 12 8 75 8 0 0 15 10 85 10 0 0 3 1 50 1 0 0 7 4 60 4 0 0 ✅ 适合
- 非线性但单调
- 有异常值
- 等级 / 打分 / 顺序数据
- 样本较小
和皮尔逊的本质区别(一句话版)
皮尔逊:看"能不能画直线"
斯皮尔曼:看"顺序是否一致"
1.3.3| 主成分分析(PCA)
寻找最大方向差。
具体例子:学生成绩分析
假设有5个科目的成绩:语文、数学、英语、物理、化学。我们想降到2维。
plain
原始数据(5维):
学生A: [85, 90, 88, 92, 89] ← 理科强,文科也不弱
学生B: [78, 65, 80, 60, 62] ← 文科较好,理科较弱
学生C: [92, 95, 90, 94, 93] ← 全能学霸
学生D: [70, 75, 72, 78, 76] ← 中等水平
PCA怎么做?
- 观察相关性:发现物理和化学成绩高度相关(相关系数0.95),数学也与它们相关
- 找主成分 :
- 第一主成分(PC1):"理科能力"方向(数学+物理+化学的综合)
- 第二主成分(PC2):"文科优势"方向(语文+英语,与理科的差值)
- 投影变换:
plain
降维后(2维):
学生A: PC1=90, PC2=-2 → 理科强,文理均衡
学生B: PC1=62, PC2=+15 → 理科弱,文科相对好
学生C: PC1=94, PC2=-1 → 全能,理科略占优
学生D: PC1=76, PC2=-3 → 中等,略偏理
几何解释:想象5维空间中的数据点云,PCA找到这个点云"最胖"的方向作为第一轴,"次胖"且垂直的方向作为第二轴。
特点:
- ✅ 无监督方法,不需要标签
- ✅ 去除特征间相关性
- ❌ 只捕捉线性关系
- ❌ 主成分有时难以解释
理解
1️⃣ 只在同一个数据集内比较
2️⃣ 看相对大小 / 排名
3️⃣ 0 是"平均水平",可以做方差看差距
4️⃣ PC 本身没有单位
比如原来是100维度的数据,经过pca之后,得到一个系数公式,将100维度的数据换算成20维度(比如拍脑袋20个维度就能表达),得到20维数据,用这20维数据表达原来的100维度数据,用于模型训练。
"20列表示100列"的准确理解
数学本质
plain
原始数据 X: (1000样本, 100特征) = (n_samples, n_features)
PCA转换:
X_pca = X · W (矩阵乘法)
其中 W: (100, 50) 是主成分权重矩阵
W[:, 0] = PC1的100个权重
W[:, 1] = PC2的100个权重
...
W[:, 49] = PC50的100个权重
每一列PCA特征都是原始100个特征的加权组合:
plain
PC1得分 = w₁₁×特征1 + w₂₁×特征2 + ... + w₁₀₀,₁×特征100
PC2得分 = w₁₂×特征1 + w₂₂×特征2 + ... + w₁₀₀,₂×特征100
...
PC50得分 = w₁,₅₀×特征1 + w₂,₅₀×特征2 + ... + w₁₀₀,₅₀×特征100
信息保留 vs 损失
plain
原始100维:100%信息(包含信号+噪声+冗余)
PCA 50维:保留主要信号,丢弃:
- 冗余信息(高度相关的重复表达)
- 噪声方向(方差小的随机波动)
典型保留比例:85%-95%(取决于n_components设置)