机器学习初学者指南 · 第2章

监督学习入门

从标签数据到模型评估——掌握回归与分类的核心框架

2.1

标签数据、特征与目标

监督学习的核心在于使用标签数据(Labeled Data)进行训练。理解特征与目标的概念,是构建任何监督学习模型的起点。

特征(Features / X)

特征是模型的输入变量,是用来描述样本的属性或测量值。在表格数据中,每一列(除了目标列)都是一个特征;在图像数据中,每个像素值都是特征;在文本数据中,每个词或字符的出现频率可以是特征。

目标(Target / y)

目标是模型试图预测的输出变量。在训练数据中,每个样本都有已知的目标值,模型学习的是从特征到目标的映射函数:y = f(X)

特征与目标示例:房价预测

假设我们要预测房价,一个训练样本可能是:

  • 特征:面积=120m²,地段="朝阳区",房龄=5年,卧室数=3,朝向="南"
  • 目标:房价=850万元

模型将学习这5个特征与房价之间的映射关系。当给定新房子(面积=90m²,地段="海淀区"...)的特征时,模型输出预测的房价。

核心洞察:特征工程的艺术

在实际项目中,原始数据很少能直接作为特征使用。特征工程是将原始数据转换为更有信息量的表示的过程。例如:将"出生日期"转换为"年龄";将"交易时间"分解为"小时""星期几""是否节假日"。好的特征能让简单模型表现出色,差的特征会让复杂模型也无能为力。

2.2

回归(连续输出)vs 分类(离散输出)

监督学习根据目标变量的类型,分为两大任务:回归(Regression)分类(Classification)。选择正确的任务类型,是建模成功的第一步。

回归:预测连续数值

回归任务的目标是预测一个连续的数值输出。输出可以是任意实数(或在某个范围内的实数)。

分类:预测离散类别

分类任务的目标是将样本分配到预定义的类别中。输出是离散的标签,而不是连续数值。

工程应用:回归与分类的典型场景

房价预测(回归):房地产公司使用回归模型根据位置、面积、房龄等特征预测房价。线性回归是最简单的 baseline,实际中常使用 XGBoost、随机森林等集成方法。关键评估指标是 RMSE 和 MAE。

信用评分(分类):银行根据客户的收入、负债比、信用历史等特征,预测其违约概率(二分类)。由于违约样本通常极少,需要处理类别不平衡问题。关键评估指标是 AUC-ROC 和 F1 分数。

销量预测(回归):零售企业使用时间序列模型或回归模型预测未来销量,以优化库存。需要考虑季节性、促销活动、节假日等特征。

疾病诊断(分类):根据患者的检验指标(血压、血糖、胆固醇等)预测患病风险。医疗场景中,假阴性(漏诊)的代价远高于假阳性(误诊),因此需要调整分类阈值。

图 2-1:回归(连续输出)与分类(离散输出)的直观对比
2.3

训练与预测流程

监督学习的标准流程可以分为两个阶段:训练(Training)预测(Prediction / Inference)。理解这两个阶段的区别,对后续学习模型评估至关重要。

训练阶段

在训练阶段,模型通过观察大量带有标签的样本,调整内部参数以最小化预测误差。这个过程本质上是一个优化问题:

minimize Loss(f(X; θ), y)

其中 θ 是模型参数,Loss 是损失函数,衡量预测值 f(X; θ) 与真实值 y 之间的差距。

预测阶段

训练完成后,模型被用于预测新样本的目标值。在预测阶段,模型参数不再改变,只进行前向计算:

ŷ_new = f(X_new; θ_trained)
为什么必须区分训练集和测试集?

如果我们在训练集上评估模型,评估结果会过于乐观——模型可能已经"记住"了训练样本(过拟合)。为了获得对模型泛化能力的真实估计,必须保留一部分数据作为测试集,在训练过程中完全不接触。这模拟了模型面对未来未知数据的表现。

训练/验证/测试集划分

严谨的 ML 实践通常将数据分为三份:

  • 训练集(Training Set):用于训练模型参数,通常占 60%-80%。
  • 验证集(Validation Set):用于调整超参数和模型选择,通常占 10%-20%。
  • 测试集(Test Set):用于最终评估,只能在项目结束时使用一次,通常占 10%-20%。

验证集是防止过拟合的"预警系统"。当训练集误差持续下降,但验证集误差开始上升时,说明模型已经开始过拟合,应该停止训练。

2.4

损失函数:MSE 与交叉熵

损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是监督学习的优化目标。不同任务需要不同的损失函数。

均方误差(MSE):回归的标准损失

MSE 计算预测值与真实值之间差值的平方的平均值:

MSE = (1/n) · Σ(yᵢ - ŷᵢ)²

MSE 对大误差给予更严厉的惩罚(因为平方操作),这使得模型对异常值比较敏感。当数据中存在明显的异常点时,可以考虑使用 MAE(平均绝对误差),它对异常值更鲁棒。

交叉熵损失(Cross-Entropy):分类的标准损失

对于分类问题,交叉熵损失衡量模型输出的概率分布与真实分布之间的差异:

L = -Σ yᵢ · log(ŷᵢ)

其中 yᵢ 是真实标签(one-hot 编码),ŷᵢ 是模型预测的概率。交叉熵对"自信且错误"的预测惩罚极大——如果模型对错误答案给出 99% 的概率,损失值会非常高。

损失函数选择指南
  • 回归任务:首选 MSE;对异常值敏感时使用 MAE;需要平衡两者时使用 Huber 损失。
  • 二分类任务:使用二元交叉熵(Binary Cross-Entropy)。
  • 多分类任务:使用分类交叉熵(Categorical Cross-Entropy)。
图 2-2:MSE 损失随误差变化的曲线(误差越大,损失增长越快)
2.5

模型评估基础

训练模型只是第一步,更重要的是评估模型在未知数据上的表现。不同任务使用不同的评估指标。

回归评估指标

分类评估指标

评估指标的陷阱:准确率悖论

假设一个疾病检测数据集中,99% 的人健康,1% 的人患病。如果一个模型对所有样本都预测"健康",准确率高达 99%,但完全没有任何实用价值——它漏掉了所有患者。在类别不平衡时,应关注 F1 分数、AUC-ROC 或精确率-召回率曲线,而非单纯的准确率。

工程应用:指标选择实战

房价预测:使用 RMSE 作为主要指标,同时关注 MAE 以减少异常高价房的影响。R² 帮助判断模型是否捕捉到了主要的价格驱动因素。

垃圾邮件过滤:更关注精确率(不要把正常邮件判为垃圾)而非召回率。用户可以接受少量垃圾邮件,但无法接受重要邮件被误判。

疾病筛查:更关注召回率(不要漏掉病人)。假阳性(健康人被误判)可以通过后续检查排除,但假阴性(病人被漏掉)可能危及生命。

Ex

例题精讲

例1:回归 vs 分类判断

判断以下任务属于回归还是分类:

(a) 根据用户的年龄、收入预测其信用卡消费金额

(b) 根据邮件内容判断是否为垃圾邮件

(c) 根据房屋特征预测卧室数量(1/2/3/4间)

(d) 根据传感器数据预测机器剩余寿命(小时)

解答

(a) 回归:消费金额是连续数值(如 3528.5 元)。

(b) 分类(二分类):输出是离散的类别(垃圾/正常)。

(c) 分类(多分类):虽然卧室数是数字,但它是离散的类别(1间/2间/3间/4间),且通常只有少数几种取值。如果作为回归处理,模型可能预测出 2.37 间卧室,这在实际中没有意义。

(d) 回归:剩余寿命是连续数值(如 1250.5 小时)。

(a) 回归;(b) 二分类;(c) 多分类;(d) 回归。关键看输出是连续数值还是离散类别。
例2:计算 MSE

某回归模型对5个样本的预测值与真实值如下,计算 MSE 和 RMSE:

样本真实值 y预测值 ŷ
11012
22018
31515
42530
53028
计算过程

样本1: (10 - 12)² = 4

样本2: (20 - 18)² = 4

样本3: (15 - 15)² = 0

样本4: (25 - 30)² = 25

样本5: (30 - 28)² = 4

MSE = (4 + 4 + 0 + 25 + 4) / 5 = 37 / 5 = 7.4

RMSE = √7.4 ≈ 2.72

MSE = 7.4,RMSE ≈ 2.72。RMSE 与目标变量同量纲,表示平均预测偏差约为 2.72 个单位。
例3:准确率与召回率计算

某疾病检测模型在 1000 个样本上的结果如下:

  • 真正例(TP):预测患病且实际患病 = 80 人
  • 假正例(FP):预测患病但实际健康 = 20 人
  • 假反例(FN):预测健康但实际患病 = 30 人
  • 真反例(TN):预测健康且实际健康 = 870 人

计算准确率、精确率和召回率。

计算过程

准确率 = (TP + TN) / 总数 = (80 + 870) / 1000 = 950 / 1000 = 95.0%

精确率 = TP / (TP + FP) = 80 / (80 + 20) = 80 / 100 = 80.0%

召回率 = TP / (TP + FN) = 80 / (80 + 30) = 80 / 110 ≈ 72.7%

F1 = 2 × (精确率 × 召回率) / (精确率 + 召回率) = 2 × 0.8 × 0.727 / (0.8 + 0.727) ≈ 76.2%

准确率 95%,精确率 80%,召回率 72.7%,F1 ≈ 76.2%。虽然准确率很高,但 30 个病人被漏诊,在医疗场景中需要进一步提高召回率。
例4:训练集与测试集划分

某数据集有 10000 条样本,你计划按 70%/15%/15% 划分为训练集、验证集和测试集。但在实际建模中,你多次调整模型超参数,以在验证集上获得最佳表现,最后用测试集评估。

请问:(a) 各集合有多少样本?(b) 这种做法有什么问题?

解答

(a) 训练集:10000 × 70% = 7000;验证集:10000 × 15% = 1500;测试集:10000 × 15% = 1500

(b) 问题:验证集信息泄露。当你多次调整超参数以优化验证集表现时,验证集实际上被"污染"了——模型间接地"看到了"验证集的信息。此时再用测试集评估,结果会过于乐观,不能反映真实的泛化能力。

正确做法:如果进行了多轮调参,应该再划分一个独立的测试集,或者使用交叉验证来更可靠地估计模型性能。

(a) 7000 / 1500 / 1500;(b) 多次调参导致验证集信息泄露,测试集评估不再可靠。
Py

Python 代码实践

本节通过 sklearn 实现线性回归和逻辑回归,演示完整的监督学习流程:数据划分、模型训练、预测和评估。

supervised_learning.py
# 第2章:监督学习入门——线性回归与分类 from sklearn.datasets import load_diabetes, load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, LogisticRegression from sklearn.metrics import mean_squared_error, accuracy_score import numpy as np # ===== 回归任务:糖尿病进展预测 ===== diabetes = load_diabetes() X_reg, y_reg = diabetes.data, diabetes.target # 划分训练集和测试集 (80% / 20%) X_train_r, X_test_r, y_train_r, y_test_r = train_test_split( X_reg, y_reg, test_size=0.2, random_state=42) # 训练线性回归模型 reg_model = LinearRegression() reg_model.fit(X_train_r, y_train_r) # 预测与评估 y_pred_r = reg_model.predict(X_test_r) mse = mean_squared_error(y_test_r, y_pred_r) rmse = np.sqrt(mse) print("=== 回归任务 ===") print(f"MSE: {mse:.2f}") print(f"RMSE: {rmse:.2f}") # ===== 分类任务:鸢尾花种类预测 ===== iris = load_iris() X_cls, y_cls = iris.data, iris.target # 划分数据集 X_train_c, X_test_c, y_train_c, y_test_c = train_test_split( X_cls, y_cls, test_size=0.2, random_state=42) # 训练逻辑回归模型 clf_model = LogisticRegression(max_iter=200) clf_model.fit(X_train_c, y_train_c) # 预测与评估 y_pred_c = clf_model.predict(X_test_c) acc = accuracy_score(y_test_c, y_pred_c) print("\n=== 分类任务 ===") print(f"准确率: {acc:.2%}") print(f"测试集样本数: {len(y_test_c)}")
运行结果
=== 回归任务 === MSE: 2900.19 RMSE: 53.85 === 分类任务 === 准确率: 100.00% 测试集样本数: 30
代码解读

train_test_split() 是数据划分的标准工具。random_state 确保划分结果可复现。

LinearRegression().fit() 使用最小二乘法拟合模型,找到使 MSE 最小的参数。

LogisticRegression 虽然名字里有"回归",但实际是分类算法。它通过 sigmoid 函数将线性输出映射为概率。

鸢尾花数据集简单且类别分离明显,因此达到 100% 准确率并不意外。在更复杂的数据集上,准确率通常在 70%-95% 之间。

← 上一章:第1章 机器学习概论 下一章:第3章 无监督与强化学习 →