机器学习基础概念
目标读者: 机器学习初学者 核心内容: 学习范式、过拟合/欠拟合、偏差-方差权衡、交叉验证 前置知识: 基础数学(线性代数、微积分、概率统计)
1. 什么是机器学习?
机器学习的本质:让机器从数据中自动学习规律,而不是显式编程。
传统编程: 规则 + 数据 → 结果
机器学习: 数据 + 结果 → 规则(模型)
示例对比:
- 传统方法:写 100 条 if-else 判断垃圾邮件
- 机器学习:给 10000 封邮件(标记好垃圾/正常),让模型自己学规律
2. 三大学习范式
根据机器获取学习信号(反馈)的来源,可将机器学习分为三大类:
2.1 监督学习 (Supervised Learning)
特点:有”标准答案”(标签)
| 输入 X | 标签 Y |
|---|---|
| [图片:猫] | “猫” |
| [图片:狗] | “狗” |
| [房子:100㎡] | 500万 |
两类任务:
| 类型 | 输出 | 例子 |
|---|---|---|
| 分类 | 离散类别 | 垃圾邮件检测、图像识别 |
| 回归 | 连续数值 | 房价预测、股票预测 |
数学表达:学习映射函数
2.2 无监督学习 (Unsupervised Learning)
特点:没有标签,只有数据本身
核心目标:发现数据中内在的结构、模式或分布
典型任务:
| 任务 | 目标 | 例子 |
|---|---|---|
| 聚类 | 发现相似群体 | 客户分群、文档归类 |
| 降维 | 压缩特征 | PCA 降维可视化 |
| 异常检测 | 找出异常点 | 信用卡欺诈检测 |
2.3 强化学习 (Reinforcement Learning)
特点:通过”试错”获得延迟反馈
┌─────────────┐
│ 环境 │
│ Environment │
└──────┬──────┘
│ 状态 + 奖励
▼
┌─────────────┐
│ 智能体 │ ──→ 动作
│ Agent │
└─────────────┘
与监督学习的区别:
- 监督学习:每一步都有正确答案
- 强化学习:只有最终结果的奖励/惩罚
典型应用:AlphaGo、游戏 AI、机器人控制、自动驾驶决策
2.4 三大范式对比
| 范式 | 数据特点 | 学习目标 | 典型算法 |
|---|---|---|---|
| 监督学习 | 有标签 | 学习 映射 | 线性回归、SVM、神经网络 |
| 无监督学习 | 无标签 | 发现数据结构 | K-Means、PCA、自编码器 |
| 强化学习 | 交互反馈 | 最大化累计奖励 | Q-Learning、PPO |
3. 过拟合与欠拟合
重要:这是机器学习中最核心的概念之一,理解它对模型调优至关重要。
3.1 直观理解
数据点: ● (训练数据)
欠拟合 (Underfitting) 适度拟合 (Good Fit) 过拟合 (Overfitting)
● ● ●
● ● ● ● ● /\ ●
──────────── ~~~~~~~~~~~ /\/ \/\
● ● ●
模型太简单 刚刚好 模型太复杂
没学到规律 学到真正规律 学到了噪声
3.2 如何判断?
| 情况 | 训练误差 | 测试误差 | 诊断 |
|---|---|---|---|
| 欠拟合 | 高 | 高 | 模型太简单,无法捕捉数据规律 |
| 适度拟合 | 低 | 低 | 理想状态,泛化能力好 |
| 过拟合 | 很低 | 高 | 模型太复杂,记住了噪声 |
3.3 解决方案
欠拟合的解决方法(增加模型复杂度):
- 使用更复杂的模型(如从线性模型换成神经网络)
- 增加特征数量或进行特征工程
- 减少正则化强度
- 增加训练轮数
过拟合的解决方法(降低模型复杂度):
- 增加训练数据:最有效的方法
- 正则化:L1 正则化(稀疏)、L2 正则化(权重衰减)
- Dropout:深度学习中随机丢弃神经元
- 早停 (Early Stopping):在验证集误差开始上升时停止训练
- 数据增强:通过变换扩充训练数据
4. 偏差-方差权衡
4.1 概念定义
| 概念 | 数学含义 | 直观理解 |
|---|---|---|
| 偏差 (Bias) | 模型预测的期望值与真实值的差距 | |
| 方差 (Variance) | 模型预测值的波动程度 | |
| 噪声 | 数据本身的随机性 | 无法消除的误差下界 |
4.2 射击类比
高偏差+低方差 低偏差+高方差 低偏差+低方差
(欠拟合) (过拟合) (理想)
○ ○ ○
· · · · · ·
· · · · · · · ·
· · · · ·
· ·
打得很稳但偏了 对准了但太分散 又准又稳
4.3 与模型复杂度的关系
误差
│
│ ╲ ╱
│ ╲ 总误差 ╱
│ ╲____╱ ╱
│ ╲ ╱
│ 偏差 ╲________╱ 方差
│
└──────────────────────────→ 模型复杂度
简单 复杂
关键洞察:
- 简单模型:高偏差、低方差 → 欠拟合
- 复杂模型:低偏差、高方差 → 过拟合
- 最优模型:在偏差和方差之间找到平衡点
5. 交叉验证 (Cross-Validation)
5.1 为什么需要交叉验证?
单次划分训练/测试集可能存在偶然性,交叉验证通过多次划分来获得更可靠的性能评估。
5.2 K-Fold 交叉验证
将数据分成 K 份,轮流使用每一份作为验证集:
数据分成 K=5 份:
第1轮: [验证] [训练] [训练] [训练] [训练] → 得分 85%
第2轮: [训练] [验证] [训练] [训练] [训练] → 得分 87%
第3轮: [训练] [训练] [验证] [训练] [训练] → 得分 83%
第4轮: [训练] [训练] [训练] [验证] [训练] → 得分 86%
第5轮: [训练] [训练] [训练] [训练] [验证] → 得分 84%
最终得分 = 平均值 = 85%
5.3 常用交叉验证方法
| 方法 | 说明 | 适用场景 |
|---|---|---|
| Hold-out | 简单划分 70/30 或 80/20 | 数据量大时快速评估 |
| K-Fold | K 次轮换验证 | 通用方法,K=5 或 10 |
| Leave-One-Out (LOO) | K=N,每次只留一个样本验证 | 数据量很小时 |
| Stratified K-Fold | 保持每折中类别比例一致 | 类别不平衡数据集 |
| 时间序列分割 | 按时间顺序划分 | 时间序列数据 |
5.4 代码示例
from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression
# 创建模型
model = LogisticRegression()
# 5 折交叉验证
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold, scoring='accuracy')
print(f"各折得分: {scores}")
print(f"平均得分: {scores.mean():.3f} (+/- {scores.std()*2:.3f})")6. 模型评估指标
6.1 分类问题
| 指标 | 公式 | 适用场景 |
|---|---|---|
| 准确率 (Accuracy) | 类别平衡时 | |
| 精确率 (Precision) | 关注假阳性代价时 | |
| 召回率 (Recall) | 关注假阴性代价时 | |
| F1 分数 | 精确率和召回率的调和平均 | |
| AUC-ROC | ROC 曲线下面积 | 综合评估分类器性能 |
6.2 回归问题
| 指标 | 公式 | 说明 |
|---|---|---|
| MSE | 平均平方误差 | |
| RMSE | 与目标变量同量纲 | |
| MAE | 对异常值更鲁棒 | |
| 解释方差的比例 |
小结
| 概念 | 核心要点 |
|---|---|
| 机器学习 | 从数据中自动学习规律 |
| 监督学习 | 有标签,学习输入到输出的映射 |
| 无监督学习 | 无标签,发现数据内在结构 |
| 强化学习 | 通过试错和奖励信号学习最优策略 |
| 过拟合 | 模型太复杂,泛化能力差 |
| 欠拟合 | 模型太简单,无法捕捉规律 |
| 偏差-方差 | 简单模型高偏差,复杂模型高方差 |
| 交叉验证 | 多次划分验证,评估更可靠 |
参考资料
- 吴恩达机器学习课程
- StatQuest 机器学习系列
- 《统计学习方法》- 李航
- 《机器学习》- 周志华(西瓜书)