5.1.2 什么是机器学习

这一节是你正式进入机器学习的第一站。重点不是背定义,而是理解机器学习和传统编程的区别,建立“问题类型 → 数据形式 → 学习方法”的判断框架,为后面的监督学习、无监督学习和模型评估打底。
- 理解什么是机器学习以及它与传统编程的区别
- 掌握机器学习的三大分类(监督学习、无监督学习、强化学习)
- 理解机器学习的完整工作流程
- 建立正确的 ML 思维框架
先建立一张地图
Section titled “先建立一张地图”这篇最重要的任务,不是把定义背下来,而是先帮你建立一个判断框架:

如果这张图你看懂了,后面第 5 站很多章节都会突然顺起来。

可以把这张漫画当成快速入门检查表:如果规则能写清楚,普通程序可能就够了;如果规律藏在大量案例里,机器学习就开始有价值。然后再判断你有没有标签、输出是类别还是数值、评估指标能不能证明模型真的有用。
一、机器学习到底是什么?
Section titled “一、机器学习到底是什么?”机器学习 = 让计算机从数据中自动发现规律,而不是由人类手写规则。
传统编程 vs 机器学习
Section titled “传统编程 vs 机器学习”flowchart LR subgraph 传统编程 R1["人类写规则"] --> P1["程序"] D1["数据"] --> P1 P1 --> O1["输出"] end
subgraph 机器学习 D2["数据"] --> ML["机器学习算法"] O2["期望输出"] --> ML ML --> R2["自动学到的规则(模型)"] end
style R1 fill:#fff3e0,stroke:#e65100,color:#333 style R2 fill:#e8f5e9,stroke:#2e7d32,color:#333| 传统编程 | 机器学习 | |
|---|---|---|
| 输入 | 规则 + 数据 | 数据 + 期望输出 |
| 输出 | 结果 | 规则(模型) |
| 适用场景 | 规则明确(如计算税额) | 规则难以描述(如识别猫) |
| 编写方式 | 人工编写 if-else 逻辑 | 算法自动从数据中学习 |
为什么需要机器学习?
Section titled “为什么需要机器学习?”有些任务,人类说不清规则:
# 传统编程:判断邮件是否是垃圾邮件def is_spam_traditional(email): if "免费" in email: return True if "中奖" in email: return True if "点击领取" in email: return True # ... 还有多少规则?永远写不完! return False
# 机器学习:给模型 10 万封已标注的邮件,让它自己学# model.fit(emails, labels)# model.predict(new_email) → 自动判断机器学习适用的场景:
- 规则复杂或未知(图像识别、语音识别)
- 规则会变化(推荐系统、欺诈检测)
- 数据量大到人类无法手动分析
- 需要个性化的结果
第一次学机器学习,最该先抓住什么?
Section titled “第一次学机器学习,最该先抓住什么?”最该先抓住的不是“模型有多少种”,而是这一句:
机器学习是在用数据替代手写规则。
一旦你抓住这句,后面很多问题都会更好判断:
- 什么时候适合传统编程
- 什么时候应该交给模型去学
- 为什么数据质量会直接决定模型上限
新人应该提前拆开的术语
Section titled “新人应该提前拆开的术语”| 术语 | 它是什么 | 在本章为什么重要 |
|---|---|---|
ML | Machine Learning 的缩写 | 你会在图、文件名和项目记录里反复看到 |
model | 学到的规则或函数 | 训练完成后被保存、复用、拿去预测的就是模型 |
algorithm | 学习方法 | 决策树、逻辑回归、K-Means 在训练前都是算法 |
training | 从数据中学习的过程 | 在代码里通常发生在调用 fit 的时候 |
inference | 用训练好的模型处理新数据 | 在 sklearn 里通常对应 predict 或 predict_proba |
baseline | 最简单、最先做出来的对照结果 | 它能告诉你后面的优化是不是真的有效 |
metric | 衡量模型成败的尺子 | Accuracy、F1、MAE、RMSE 回答的是不同评估问题 |
对新人来说,最重要的是先区分 algorithm 和 model:算法是学习配方,模型是这个配方看过数据以后训练出来的结果。
二、机器学习的三大分类
Section titled “二、机器学习的三大分类”flowchart TD ML["机器学习"] ML --> SL["监督学习<br/>Supervised Learning"] ML --> UL["无监督学习<br/>Unsupervised Learning"] ML --> RL["强化学习<br/>Reinforcement Learning"]
SL --> CL["分类<br/>(邮件→垃圾/正常)"] SL --> RG["回归<br/>(特征→房价预测)"]
UL --> CLU["聚类<br/>(客户分群)"] UL --> DR["降维<br/>(数据压缩)"]
RL --> G["游戏AI"] RL --> RO["机器人控制"]
style SL fill:#e3f2fd,stroke:#1565c0,color:#333 style UL fill:#fff3e0,stroke:#e65100,color:#333 style RL fill:#e8f5e9,stroke:#2e7d32,color:#333监督学习——有”标准答案”
Section titled “监督学习——有”标准答案””核心:给模型大量”输入-输出”配对数据,让它学习映射关系。
| 类型 | 输出 | 例子 |
|---|---|---|
| 分类 | 离散类别 | 邮件→垃圾/正常,图片→猫/狗 |
| 回归 | 连续数值 | 面积→房价,特征→温度 |
# 监督学习的数据格式# X(特征/输入) y(标签/输出)# [面积, 房间数, 楼层] → 房价# [120, 3, 15] → 350万# [80, 2, 8] → 220万# [200, 4, 20] → 580万关键:训练数据必须有标签(标准答案)。模型的目标是学会从 X 预测 y。
怎么最快判断一个问题是不是监督学习?
Section titled “怎么最快判断一个问题是不是监督学习?”可以直接问自己:
- 我手里有没有“输入 -> 正确输出”这样的配对数据?
如果有,通常就是监督学习。 然后再继续问:
- 输出是类别,还是连续数值?
这就会自然分出:
- 分类
- 回归
无监督学习——没有”标准答案”
Section titled “无监督学习——没有”标准答案””核心:只有输入数据,没有标签。让模型自己发现数据中的结构和模式。
| 类型 | 做什么 | 例子 |
|---|---|---|
| 聚类 | 把相似的数据分组 | 客户分群、新闻归类 |
| 降维 | 减少特征数量 | PCA(第 4 站学过) |
| 异常检测 | 找出不正常的数据 | 信用卡欺诈检测 |
# 无监督学习的数据:没有标签# X(特征)# [消费金额, 消费频次, 最近消费]# [500, 10, 3天前]# [50, 2, 30天前]# [1000, 20, 1天前]# → 模型自动分成 "高价值客户"、"低频客户" 等群组无监督学习最容易被误解的地方
Section titled “无监督学习最容易被误解的地方”很多新人会把无监督学习理解成“机器自己就能找到真正答案”。 其实更准确的说法是:
- 模型会帮你发现一种可能的结构
- 但这个结构有没有业务价值,最后还得靠你解释
所以无监督学习里,“解释结果”往往和“跑出结果”同样重要。
强化学习——通过”试错”学习
Section titled “强化学习——通过”试错”学习”核心:智能体(Agent)在环境中采取行动,根据奖励/惩罚调整策略。
| 要素 | 说明 |
|---|---|
| 智能体 | 做决策的 AI |
| 环境 | 智能体所在的世界 |
| 状态 | 当前环境的信息 |
| 行动 | 智能体能做的选择 |
| 奖励 | 行动后得到的反馈 |
# 强化学习的直觉:训练小狗# 状态:小狗看到的环境# 行动:坐下 / 站起 / 握手# 奖励:做对了 → 给零食(+1),做错了 → 不给(0)# 经过多次试错,小狗学会了正确的行为三种学习方式对比
Section titled “三种学习方式对比”| 监督学习 | 无监督学习 | 强化学习 | |
|---|---|---|---|
| 数据有标签? | 有 | 没有 | 有奖励信号 |
| 目标 | 预测标签 | 发现结构 | 最大化奖励 |
| 典型算法 | 线性回归、决策树 | K-Means、PCA | Q-Learning、PPO |
| AI 应用 | 图像分类、翻译 | 客户分群、推荐 | 游戏 AI、机器人 |
三、机器学习的工作流程
Section titled “三、机器学习的工作流程”flowchart TD A["1. 问题定义<br/>要解决什么问题?"] --> B["2. 数据收集<br/>获取相关数据"] B --> C["3. 数据预处理<br/>清洗、特征工程"] C --> D["4. 选择模型<br/>线性回归?决策树?"] D --> E["5. 训练模型<br/>用训练数据拟合"] E --> F["6. 评估模型<br/>用测试数据验证"] F --> G{"效果好吗?"} G -->|"不够好"| H["7. 调优<br/>调参数、换模型"] H --> D G -->|"足够好"| I["8. 部署上线<br/>用于实际预测"]
style A fill:#e3f2fd,stroke:#1565c0,color:#333 style E fill:#fff3e0,stroke:#e65100,color:#333 style I fill:#e8f5e9,stroke:#2e7d32,color:#333先把流程读成一句人话
Section titled “先把流程读成一句人话”这条流程可以先翻译成一句更适合新人的话:
先定义问题,再准备数据,先做一个能跑的版本,再看结果,最后一点点改进。
这句话其实就是第 5 站整条主线的底层逻辑。
训练集 vs 测试集
Section titled “训练集 vs 测试集”这是 ML 中最重要的概念之一:不能用训练数据来评估模型。
import numpy as np
# 模拟数据集rng = np.random.default_rng(seed=42)n = 100X = rng.normal(size=(n, 3))y = rng.integers(0, 2, n)
# 通常 80% 训练,20% 测试from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)
print(f"训练集: {X_train.shape[0]} 个样本")print(f"测试集: {X_test.shape[0]} 个样本")预期输出:
训练集: 80 个样本测试集: 20 个样本flowchart LR D["全部数据<br/>100 个样本"] D -->|"80%"| TR["训练集<br/>80 个样本<br/>用来训练模型"] D -->|"20%"| TE["测试集<br/>20 个样本<br/>用来评估模型"]
style TR fill:#e3f2fd,stroke:#1565c0,color:#333 style TE fill:#e8f5e9,stroke:#2e7d32,color:#333
读这张图时,先看三条边界:训练集用来学,验证集用来选方案,测试集只在最后验收。只要某个处理步骤提前看到了测试集信息,比如先对全量数据标准化、先用全量数据选特征,模型分数就可能变得“虚高”。
新人最容易踩的坑:把“学会”误当成“记住”
Section titled “新人最容易踩的坑:把“学会”误当成“记住””机器学习里一个特别重要的分界点就是:
- 模型在训练集上做得好,不等于它真的学会了规律
- 它也可能只是把训练数据记住了
所以从这一节开始,你就应该养成一个习惯:
- 看到高分,先问这是训练集分数还是测试集分数
一个最小的完整例子
Section titled “一个最小的完整例子”先别急着看代码,先看完整闭环:

这张图就是一个最小可用 ML 项目的形状:定义问题,准备 X 和 y,训练模型,用指标评估,再决定下一步改哪里。下面的代码故意写得很小,是为了让你把每一行都对应到图里的一个步骤,而不是一上来就被框架细节淹没。
from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import accuracy_score
# 1. 加载数据iris = load_iris()X, y = iris.data, iris.targetprint(f"数据集: {X.shape[0]} 个样本, {X.shape[1]} 个特征, {len(set(y))} 个类别")
# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 选择模型并训练model = DecisionTreeClassifier(random_state=42)model.fit(X_train, y_train) # 训练!
# 4. 预测和评估y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)print(f"测试集准确率: {accuracy:.1%}")预期输出:
数据集: 150 个样本, 4 个特征, 3 个类别测试集准确率: 100.0%只用几行代码就完成了一个完整的 ML 项目! 接下来的章节会逐步深入每个环节。
如果这段代码报错 ModuleNotFoundError: No module named 'sklearn',先安装本章依赖:
python -m pip install --upgrade scikit-learn这里 scikit-learn 是安装包名,sklearn 是 Python 代码里的导入模块名。
可以按下面这张表读代码:
| 代码关键词 | 它是什么意思 | 为什么重要 |
|---|---|---|
load_iris() | 加载一个内置的玩具数据集 | 不需要下载文件,就能安全完成第一次练习 |
X | 特征矩阵,也就是输入列 | 模型从这些数值里学习规律 |
y | 目标向量,也就是标准答案 | 监督学习需要标签才能学习 |
train_test_split | 把数据分成学习部分和检查部分 | 避免用模型已经看过的样本来评价模型 |
fit | 训练模型 | 算法在这里变成训练好的模型 |
predict | 用训练好的模型处理新输入 | 这就是实际应用中的推理步骤 |
accuracy_score | 计算预测正确的比例 | 把模型表现变成一个可度量的结果 |
random_state | 固定随机切分或模型随机性 | 让新人反复运行时能得到一致结果 |
四、关键术语速查
Section titled “四、关键术语速查”| 术语 | 英文 | 含义 |
|---|---|---|
| 样本 | Sample | 一条数据 |
| 特征 | Feature | 描述样本的属性(输入的每一列) |
| 标签 | Label / Target | 样本的”答案”(要预测的值) |
| 训练集 | Training Set | 用来训练模型的数据 |
| 测试集 | Test Set | 用来评估模型的数据 |
| 过拟合 | Overfitting | 模型”死记硬背”训练数据,泛化能力差 |
| 欠拟合 | Underfitting | 模型太简单,连训练数据都学不好 |
| 泛化 | Generalization | 模型在新数据上表现好的能力 |
| 超参数 | Hyperparameter | 需要人为设定的参数(如学习率、树深度) |
| 数据泄漏 | Data leakage | 测试集或未来信息意外进入训练流程,让分数看起来虚高 |
| 验证集 | Validation Set | 最终测试前,用来选择模型或超参数的数据 |
过拟合 vs 欠拟合
Section titled “过拟合 vs 欠拟合”flowchart LR A["欠拟合<br/>模型太简单<br/>用直线拟合曲线数据"] B["刚好<br/>模型复杂度合适<br/>很好地拟合了规律"] C["过拟合<br/>模型太复杂<br/>连噪声都拟合了"]
style A fill:#ffebee,stroke:#c62828,color:#333 style B fill:#e8f5e9,stroke:#2e7d32,color:#333 style C fill:#ffebee,stroke:#c62828,color:#333import matplotlib.pyplot as plt
rng = np.random.default_rng(seed=42)x = np.linspace(0, 1, 20)y = np.sin(2 * np.pi * x) + rng.normal(size=20) * 0.3
fig, axes = plt.subplots(1, 3, figsize=(15, 4))x_smooth = np.linspace(0, 1, 200)
# 欠拟合:1 次多项式(直线)coeffs = np.polyfit(x, y, 1)axes[0].scatter(x, y, color='steelblue', s=40)axes[0].plot(x_smooth, np.polyval(coeffs, x_smooth), 'r-', linewidth=2)axes[0].set_title('欠拟合(直线)\n太简单,无法捕捉规律')
# 刚好:3 次多项式coeffs = np.polyfit(x, y, 3)axes[1].scatter(x, y, color='steelblue', s=40)axes[1].plot(x_smooth, np.polyval(coeffs, x_smooth), 'r-', linewidth=2)axes[1].set_title('刚好(3 次多项式)\n较好地拟合了规律')
# 过拟合:18 次多项式coeffs = np.polyfit(x, y, 18)axes[2].scatter(x, y, color='steelblue', s=40)y_overfit = np.polyval(coeffs, x_smooth)y_overfit = np.clip(y_overfit, -3, 3)axes[2].plot(x_smooth, y_overfit, 'r-', linewidth=2)axes[2].set_title('过拟合(18 次多项式)\n连噪声都拟合了')axes[2].set_ylim(-3, 3)
for ax in axes: ax.grid(True, alpha=0.3)
plt.tight_layout()plt.show()学完这一页,至少保留这张证据卡:
- 机器学习问题
- 监督学习、无监督学习、评估或特征工程任务
- 基线
- 最简单的 sklearn/建模循环和固定的训练/测试划分
- 输出
- 预测、指标、图表,或模型决策备注
- 失败检查
- 数据泄漏、目标不清、基线薄弱或指标不匹配
- 期望产出
- 带指标和一个失败观察的最小 ML 循环
| 要点 | 说明 |
|---|---|
| 机器学习 | 让计算机从数据中学习规律 |
| 监督学习 | 有标签,学预测(分类/回归) |
| 无监督学习 | 无标签,发现结构(聚类/降维) |
| 强化学习 | 通过试错学策略(奖励驱动) |
| 核心流程 | 数据 → 预处理 → 训练 → 评估 → 部署 |
| 训练/测试分割 | 必须分开,防止过拟合 |
这节最该带走什么
Section titled “这节最该带走什么”如果只带走一句话,我希望你记住:
机器学习阶段真正的起点,不是学某个模型,而是先学会把问题、数据和评估方式对上。
所以这一节最重要的收获应该是:
- 能分清监督学习和无监督学习
- 能分清分类和回归
- 知道为什么一定要分训练集和测试集
- 知道第 5 站后面所有算法其实都在这张地图里
练习 1:分类 vs 回归
Section titled “练习 1:分类 vs 回归”判断以下任务属于分类还是回归:
- 预测明天的气温
- 判断一张照片中是否有人脸
- 预测一只股票明天的收盘价
- 将新闻分为体育/科技/娱乐/财经
- 预测一个用户会不会流失
练习 2:第一个 ML 模型
Section titled “练习 2:第一个 ML 模型”用 scikit-learn 的 load_wine() 数据集,训练一个决策树分类器,输出测试集的准确率。
from sklearn.datasets import load_winefrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifier
wine = load_wine()X_train, X_test, y_train, y_test = train_test_split( wine.data, wine.target, test_size=0.2, random_state=42, stratify=wine.target)
model = DecisionTreeClassifier(random_state=42)model.fit(X_train, y_train)accuracy = model.score(X_test, y_test)print(f"测试准确率:{accuracy:.3f}")在当前 sklearn 版本上,预期输出约为:
测试准确率:0.944如果 sklearn 版本或数据切分设置不同,结果可能有轻微变化。这里最重要的是流程:加载数据、划分数据、只在训练集训练、在测试集评估。
练习 3:观察过拟合
Section titled “练习 3:观察过拟合”修改 4.3 节的过拟合示例,用不同次数的多项式(1, 3, 5, 10, 18)拟合数据,画出 5 张子图,观察复杂度对拟合效果的影响。
参考实现与讲解
- 明天气温和股票收盘价属于回归,因为目标是连续数值;人脸检测、新闻类别和用户是否流失属于分类,因为目标是离散标签。
load_wine()练习要保持监督学习的基本流程:先加载特征和标签,再切分训练集/测试集,只用X_train, y_train训练,最后在X_test, y_test上评分。这个切分下约0.944的准确率是合理的,但比具体数值更重要的是避免把测试集泄漏进训练过程。- 1 次多项式通常欠拟合,3 次或 5 次往往能抓住主要趋势,10 次或 18 次可能开始追逐噪声。判断复杂度时不要只看训练曲线是否贴合,还要看验证集或测试集误差。