机器学习数据预处理:特征构造(超通俗完整版)
特征构造 = 用原始数据"造"出更有用的新特征,是数据挖掘、竞赛上分、论文实验的核心技能,本科/研究生一看就懂、一学就会。
一、什么是特征构造?为什么必须做?
一句话理解
从已有的特征里加工、组合、提取、变换 ,创造出模型更容易学习的新特征。
举个最简单的例子
- 原始特征:身高、体重
- 构造特征:BMI = 体重 / 身高²
→ 比单独身高、体重更能预测健康/体重等级
为什么要做特征构造?
- 原始信息太"粗",模型学不到深层规律
- 提升模型精度,简单模型也能拟合复杂关系
- 注入业务知识,让模型更贴合实际场景
- 小样本也能变强,不用堆数据也能提效果
二、最常用的 6 大类特征构造方法(全是干货)
1. 特征组合(交互项)
把两个或多个特征相乘/相除/加减 ,捕捉联合影响。
- 例子:房间数 × 低收入比例、面积 × 楼层
- 公式:
x1 × x2 - 作用:让线性模型也能学非线性关系
2. 多项式特征(升维)
对特征做平方、立方、交叉项,扩展表达能力。
- 例子:
RM→RM²、RM×LSTAT - 工具:
PolynomialFeatures - 适用:线性回归、逻辑回归、SVM
3. 函数变换(非线性构造)
用数学函数把特征变得更"规整"。
- 对数:
log(x)→ 处理偏态数据(价格、收入) - 倒数:
1/x→ 强化距离、浓度类差异 - 根号:
sqrt(x)→ 缓和极端值 - 三角函数:
sin / cos→ 处理时间周期
4. 时间特征提取(超级常用)
从时间戳里拆出有用信息:
- 年/月/日/小时/星期
- 是否周末、是否月初、是否节假日
- 时间差:距今多少天、间隔时长
5. 分桶/分箱(连续→离散)
把连续数字变成等级类别,降低噪声、增强鲁棒性。
- 等宽分箱、等频分箱、业务分箱
- 例子:年龄 → 青年/中年/老年;收入 → 低/中/高
6. 统计聚合特征(多表必用)
按用户/物品/地区分组,计算统计量:
- 均值、总和、最大值、最小值、标准差
- 近7天均值、近30天总和、波动程度
- 适用:用户行为数据、订单数据、时序数据
三、特征构造的标准流程(背下来直接用)
- 理解数据与业务:知道每个字段含义、目标是什么
- 观察相关性:看哪些特征和目标关系强
- 设计新特征:组合、变换、提取、分桶
- 构造特征:代码实现
- 检验有效性:看相关性、特征重要度、模型分数
- 去冗余:去掉没用、重复、噪声特征
四、完整实战代码(波士顿房价预测)
包含:多项式构造、函数变换、特征重要性、模型对比,直接复制可运行。
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression, RidgeCV
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')
# ======================
# 1. 加载数据
# ======================
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['MEDV'] = boston.target # 房价(目标)
print("数据形状:", data.shape)
print(data.head())
# ======================
# 2. 查看相关性(找构造思路)
# ======================
plt.figure(figsize=(14, 8))
sns.heatmap(data.corr(), annot=True, cmap='Reds', fmt='.2f')
plt.title('特征相关性热力图')
plt.show()
# ======================
# 3. 特征构造 1:多项式交互特征
# ======================
key_feats = ['RM', 'LSTAT', 'PTRATIO']
X = data[key_feats]
y = data['MEDV']
# 二阶多项式扩展
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
feat_names = poly.get_feature_names_out(key_feats)
X_poly_df = pd.DataFrame(X_poly, columns=feat_names)
print("构造后特征:")
print(feat_names)
# ======================
# 4. 特征构造 2:函数变换特征
# ======================
data['LOG_CRIM'] = np.log1p(data['CRIM']) # 对数
data['SQRT_TAX'] = np.sqrt(data['TAX']) # 根号
data['DIS_INV'] = 1.0 / (data['DIS'] + 1e-6) # 倒数
# ======================
# 5. 特征重要性可视化
# ======================
scaler = StandardScaler()
X_std = scaler.fit_transform(X_poly_df)
model = LinearRegression()
model.fit(X_std, y)
imp = pd.Series(model.coef_, index=feat_names).sort_values()
plt.figure(figsize=(12, 6))
imp.plot(kind='barh', color='purple')
plt.title('构造特征重要性')
plt.grid(True)
plt.show()
# ======================
# 6. 模型训练与评估
# ======================
X_train, X_test, y_train, y_test = train_test_split(
X_poly_df, y, test_size=0.2, random_state=42
)
# 岭回归
ridge = RidgeCV(alphas=np.logspace(-3, 3, 50), cv=5)
ridge.fit(X_train, y_train)
y_pred = ridge.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}")
print(f"R²: {r2:.4f}")
# ======================
# 7. 预测结果可视化
# ======================
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.7, color='blue')
plt.plot([0, 50], [0, 50], 'r--', lw=2)
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('真实 vs 预测')
plt.grid()
plt.show()
五、特征构造的优点 & 缺点
优点
- 大幅提升模型效果:线性模型 R² 可从 0.6 → 0.8+
- 小样本神器:数据少也能明显提分
- 可解释性极强:新特征含义清晰
- 融入业务知识:比纯黑盒模型更可靠
缺点
- 依赖经验:新手不容易想到好特征
- 容易维度爆炸:多项式会疯狂增加特征数
- 可能引入冗余/噪声:需要配合特征选择
六、特征构造 vs 特征选择 vs 数据转换(一张表看懂)
| 方法 | 作用 | 一句话 |
|---|---|---|
| 特征构造 | 造新特征 | 从0到1,创造更强特征 |
| 特征选择 | 挑好特征 | 从多到少,保留关键特征 |
| 数据转换 | 改特征格式 | 缩放、编码、分桶、变换 |
| PCA降维 | 压缩特征 | 把高维变低维,丢语义 |
七、什么时候最适合做特征构造?
- 用线性模型、LR、SVM 时 → 必须构造非线性特征
- 数据量小、维度低 → 特征构造收益最大
- 竞赛/科研提分 → 核心上分手段
- 需要高可解释性 → 金融、医疗、政务场景
- 时序/表格数据 → 时间特征+聚合特征必做
八、总结(面试/笔记万能版)
- 特征构造 = 用原始数据加工更强特征
- 6大方法:组合、多项式、函数变换、时间提取、分箱、统计聚合
- 线性模型 + 特征构造 = 低成本非线性拟合
- 构造 → 选择 → 训练 是数据建模黄金流程
- 好特征 > 好模型,是机器学习最朴素的真理