数据分析(02):机器学习入门——特征工程、经典模型、训练验证测试、偏差与方差
更新时间:2026-09-02。本文是
data-ai/data-analysis/第 02 篇,在数据分析索引下。上一篇讲了怎么把数据洗干净,这篇讲怎么让数据"长出结论"。本文聚焦经典机器学习(scikit-learn 范畴),不涉及深度学习;目标是建立正确的建模流程与评估观,而不是堆算法名词。
本文要回答的问题
- 监督学习和无监督学习有什么区别?什么时候用哪个?
- 为什么"特征工程"比"选模型"更重要?类别变量怎么编码?
- 为什么必须划分训练/验证/测试集?泄漏(leakage)是怎么发生的?
- 过拟合和欠拟合的本质是什么?偏差方差怎么权衡?
- 分类、回归、聚类各用什么指标评估好坏?
一、机器学习在解决什么问题
机器学习本质是:从数据中学到一个从输入 X 到输出 y 的映射 f,使它在没见过的新数据上也表现好。
传统编程: 规则(人写) + 数据 -> 答案
机器学习: 数据 + 答案(标签) -> 规则(模型自动学)两大范式:
| 范式 | 有没有标签 y | 典型任务 | 例子 |
|---|---|---|---|
| 监督学习 | 有 | 分类、回归 | 预测房价(回归)、判断垃圾邮件(分类) |
| 无监督学习 | 没有 | 聚类、降维、异常检测 | 用户分群、把高维数据压到 2 维可视化 |
- 回归:输出连续值(房价、温度、销量)。
- 分类:输出离散类别(猫/狗、点击/不点击)。
- 聚类:不给标签,让算法把相似样本归到一起(K-Means)。
二、建模的标准流程
原始数据
│
├─ 1. 数据清洗(见上一篇 Pandas:缺失/重复/类型)
├─ 2. 划分数据集 train / validation / test ← 越早划越好
├─ 3. 特征工程 仅在 train 上 fit,再 transform 所有集
├─ 4. 训练模型 model.fit(X_train, y_train)
├─ 5. 验证调参 在 validation 上比选模型/超参
├─ 6. 最终评估 只在 test 上跑一次,报告指标
└─ 7. 上线监控 真实分布会漂移,需持续监控最关键的纪律:测试集只能在最后用一次。 如果反复在测试集上调模型、选特征,相当于"偷看考卷",上线必然翻车。
三、特征工程:决定上限的一步
业界共识:数据和特征决定了机器学习的上限,模型只是逼近这个上限。常用手段:
1. 类别变量编码
import pandas as pd
# 有序/低基数:One-Hot(独热)
df = pd.get_dummies(df, columns=["city"], drop_first=True)
# 高基数(如 user_id、邮编):目标编码/计数编码,避免维度爆炸
# 树模型可以直接用 LabelEncoder(数字编号),线性模型不行- One-Hot:把类别展开成 0/1 列。适合类别少、线性模型/神经网络。
- Label/序数编码:用 0,1,2 编号。只对"有顺序"的类别(学历:高中<本科<硕士)或树模型安全;线性模型会误解为大小关系。
- 目标编码(target encoding):用该类别下标签的均值替代。高基数有效,但必须在训练集折内计算,否则泄漏。
2. 数值特征
- 标准化/归一化:线性模型、SVM、神经网络、KNN 对尺度敏感,需要
(x-mean)/std或缩放到 [0,1]。树模型不需要缩放。 - 分桶(binning):把连续年龄切成"少年/青年/中年/老年",引入非线性、抗噪。
- 组合特征:
单价 × 数量 = 金额、注册天数 / 活跃天数这类业务构造的特征往往最有效。 - 缺失值本身是信号:可加一列
is_missing标记。
3. 文本/时间
- 文本:TF-IDF、词袋,或直接用 embedding(见 LLM/向量库篇)。
- 时间:拆出"小时、星期几、是否周末、距今天数",模型才能学到周期规律。
铁律:所有"从数据学统计量"的步骤(scaler 的均值方差、目标编码的均值、PCA)都只能在训练集上 fit,再拿去 transform 验证/测试集。 在全量数据上 fit 就是数据泄漏。
四、划分数据与交叉验证
from sklearn.model_selection import train_test_split, cross_val_score
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y) # stratify 保持类别比例
# 交叉验证:把训练集分 5 折,轮流拿 1 折当验证,结果更稳
scores = cross_val_score(model, X_train, y_train, cv=5, scoring="roc_auc")
print(scores.mean(), scores.std())5 折交叉验证:
折1: [验][训][训][训][训]
折2: [训][验][训][训][训]
... 每一折都当一次验证集,5 个分数取均值 -> 更可靠、更省数据- 数据少用交叉验证;数据百万级可直接留一个验证集。
- 时间序列不能随机划分(会用未来预测过去),要用按时间切分的
TimeSeriesSplit。
五、经典模型怎么选
你的数据有标签吗?
/ \
有 没有
/ \
输出连续? 想分组?
/ \ |
是 否 聚类 K-Means
| | 降维 PCA
回归模型 分类模型 异常检测 IsolationForest| 模型 | 适用 | 优点 | 缺点 |
|---|---|---|---|
| 线性/逻辑回归 | 线性关系、要可解释 | 简单快、系数可解释 | 只能学线性、需缩放 |
| 决策树 | 表格数据、混合特征 | 不挑尺度、可解释 | 单棵树易过拟合 |
| 随机森林 / GBDT | 表格数据主力 | 精度高、抗过拟合、少调参 | 黑盒、预测较慢 |
| KNN | 小数据、简单基线 | 无需训练 | 预测慢、需缩放、怕高维 |
| SVM | 中小数据、高维 | 边界清晰 | 大数据慢、调参敏感 |
| K-Means | 无标签分群 | 简单快 | 需指定 K、怕尺度不一 |
实战经验:表格结构化数据,直接从逻辑回归(基线)+ 梯度提升树(XGBoost/LightGBM/CatBoost,主力)起步,通常能拿到 90% 的效果;深度学习在表格数据上往往打不过调得好的 GBDT。
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# Pipeline 把预处理和模型绑一起,杜绝泄漏、可整体交叉验证
clf = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
clf.fit(X_train, y_train)
clf.score(X_test, y_test)用 Pipeline 把 scaler/编码/模型串起来是专业写法:交叉验证时每折只在折内 fit 预处理,天然防泄漏。
六、过拟合、欠拟合与偏差方差
欠拟合(高偏差) 恰拟合 过拟合(高方差)
模型太简单,一条直线 抓住了规律 把噪声也背下来
训练差、测试也差 训练好、测试好 训练极好、测试差
误差
| 训练误差 o--------o________________
| 测试误差 o________________o--------o
| 欠拟合 恰拟合 过拟合
+--------------------------------------> 模型复杂度- 欠拟合(高偏差):模型太简单,连训练集都学不好。对策:加特征、换更强模型、减小正则。
- 过拟合(高方差):模型把训练集的噪声都记住了,换批数据就崩。对策:更多数据、简化模型、加正则(
C、max_depth、min_samples_leaf)、特征选择、交叉验证。
偏差-方差权衡是机器学习的核心矛盾:总误差 = 偏差^2 + 方差 + 不可约噪声。调模型就是在"太简单学不到"和"太复杂记太多"之间找平衡点——而裁判永远是验证集,不是训练集。
七、评估指标:别只看准确率
| 任务 | 指标 | 说明 |
|---|---|---|
| 回归 | MAE / RMSE | 平均绝对误差 / 均方根误差(对大误差更敏感) |
| 回归 | R² | 模型解释了多少方差,越接近 1 越好 |
| 分类(均衡) | Accuracy | 整体正确率;样本不均衡时会骗人 |
| 分类(不均衡) | Precision/Recall/F1 | 精确率/召回率/调和均值 |
| 分类(排序/不均衡) | ROC-AUC | 正负样本排序能力,欺诈/点击场景主力 |
| 聚类 | 轮廓系数 | 无标签下评估簇内紧凑、簇间分离 |
样本不均衡时准确率是陷阱:1000 个样本里 990 个负例,模型全猜"负"也有 99% 准确率,但毫无价值。此时看 Precision/Recall、ROC-AUC,或用 class_weight="balanced"、重采样。
小结
机器学习的正确姿势是:先按 train/validation/test 划好数据 → 只在训练集上做特征工程和预处理(防泄漏)→ 用交叉验证选模型调参 → 测试集只跑一次报告指标。特征工程决定效果上限,表格数据用"逻辑回归基线 + GBDT 主力"性价比最高;过拟合靠正则/简化/更多数据治理,欠拟合靠加特征/强模型;评估要选对指标,不均衡问题绝不能只看准确率。