从标签数据到模型评估——掌握回归与分类的核心框架
监督学习的核心在于使用标签数据(Labeled Data)进行训练。理解特征与目标的概念,是构建任何监督学习模型的起点。
特征是模型的输入变量,是用来描述样本的属性或测量值。在表格数据中,每一列(除了目标列)都是一个特征;在图像数据中,每个像素值都是特征;在文本数据中,每个词或字符的出现频率可以是特征。
目标是模型试图预测的输出变量。在训练数据中,每个样本都有已知的目标值,模型学习的是从特征到目标的映射函数:y = f(X)。
假设我们要预测房价,一个训练样本可能是:
模型将学习这5个特征与房价之间的映射关系。当给定新房子(面积=90m²,地段="海淀区"...)的特征时,模型输出预测的房价。
在实际项目中,原始数据很少能直接作为特征使用。特征工程是将原始数据转换为更有信息量的表示的过程。例如:将"出生日期"转换为"年龄";将"交易时间"分解为"小时""星期几""是否节假日"。好的特征能让简单模型表现出色,差的特征会让复杂模型也无能为力。
监督学习根据目标变量的类型,分为两大任务:回归(Regression)和分类(Classification)。选择正确的任务类型,是建模成功的第一步。
回归任务的目标是预测一个连续的数值输出。输出可以是任意实数(或在某个范围内的实数)。
分类任务的目标是将样本分配到预定义的类别中。输出是离散的标签,而不是连续数值。
房价预测(回归):房地产公司使用回归模型根据位置、面积、房龄等特征预测房价。线性回归是最简单的 baseline,实际中常使用 XGBoost、随机森林等集成方法。关键评估指标是 RMSE 和 MAE。
信用评分(分类):银行根据客户的收入、负债比、信用历史等特征,预测其违约概率(二分类)。由于违约样本通常极少,需要处理类别不平衡问题。关键评估指标是 AUC-ROC 和 F1 分数。
销量预测(回归):零售企业使用时间序列模型或回归模型预测未来销量,以优化库存。需要考虑季节性、促销活动、节假日等特征。
疾病诊断(分类):根据患者的检验指标(血压、血糖、胆固醇等)预测患病风险。医疗场景中,假阴性(漏诊)的代价远高于假阳性(误诊),因此需要调整分类阈值。
监督学习的标准流程可以分为两个阶段:训练(Training)和预测(Prediction / Inference)。理解这两个阶段的区别,对后续学习模型评估至关重要。
在训练阶段,模型通过观察大量带有标签的样本,调整内部参数以最小化预测误差。这个过程本质上是一个优化问题:
其中 θ 是模型参数,Loss 是损失函数,衡量预测值 f(X; θ) 与真实值 y 之间的差距。
训练完成后,模型被用于预测新样本的目标值。在预测阶段,模型参数不再改变,只进行前向计算:
如果我们在训练集上评估模型,评估结果会过于乐观——模型可能已经"记住"了训练样本(过拟合)。为了获得对模型泛化能力的真实估计,必须保留一部分数据作为测试集,在训练过程中完全不接触。这模拟了模型面对未来未知数据的表现。
严谨的 ML 实践通常将数据分为三份:
验证集是防止过拟合的"预警系统"。当训练集误差持续下降,但验证集误差开始上升时,说明模型已经开始过拟合,应该停止训练。
损失函数(Loss Function)衡量模型预测值与真实值之间的差距,是监督学习的优化目标。不同任务需要不同的损失函数。
MSE 计算预测值与真实值之间差值的平方的平均值:
MSE 对大误差给予更严厉的惩罚(因为平方操作),这使得模型对异常值比较敏感。当数据中存在明显的异常点时,可以考虑使用 MAE(平均绝对误差),它对异常值更鲁棒。
对于分类问题,交叉熵损失衡量模型输出的概率分布与真实分布之间的差异:
其中 yᵢ 是真实标签(one-hot 编码),ŷᵢ 是模型预测的概率。交叉熵对"自信且错误"的预测惩罚极大——如果模型对错误答案给出 99% 的概率,损失值会非常高。
训练模型只是第一步,更重要的是评估模型在未知数据上的表现。不同任务使用不同的评估指标。
假设一个疾病检测数据集中,99% 的人健康,1% 的人患病。如果一个模型对所有样本都预测"健康",准确率高达 99%,但完全没有任何实用价值——它漏掉了所有患者。在类别不平衡时,应关注 F1 分数、AUC-ROC 或精确率-召回率曲线,而非单纯的准确率。
房价预测:使用 RMSE 作为主要指标,同时关注 MAE 以减少异常高价房的影响。R² 帮助判断模型是否捕捉到了主要的价格驱动因素。
垃圾邮件过滤:更关注精确率(不要把正常邮件判为垃圾)而非召回率。用户可以接受少量垃圾邮件,但无法接受重要邮件被误判。
疾病筛查:更关注召回率(不要漏掉病人)。假阳性(健康人被误判)可以通过后续检查排除,但假阴性(病人被漏掉)可能危及生命。
判断以下任务属于回归还是分类:
(a) 根据用户的年龄、收入预测其信用卡消费金额
(b) 根据邮件内容判断是否为垃圾邮件
(c) 根据房屋特征预测卧室数量(1/2/3/4间)
(d) 根据传感器数据预测机器剩余寿命(小时)
(a) 回归:消费金额是连续数值(如 3528.5 元)。
(b) 分类(二分类):输出是离散的类别(垃圾/正常)。
(c) 分类(多分类):虽然卧室数是数字,但它是离散的类别(1间/2间/3间/4间),且通常只有少数几种取值。如果作为回归处理,模型可能预测出 2.37 间卧室,这在实际中没有意义。
(d) 回归:剩余寿命是连续数值(如 1250.5 小时)。
某回归模型对5个样本的预测值与真实值如下,计算 MSE 和 RMSE:
| 样本 | 真实值 y | 预测值 ŷ |
|---|---|---|
| 1 | 10 | 12 |
| 2 | 20 | 18 |
| 3 | 15 | 15 |
| 4 | 25 | 30 |
| 5 | 30 | 28 |
样本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
某疾病检测模型在 1000 个样本上的结果如下:
计算准确率、精确率和召回率。
准确率 = (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%
某数据集有 10000 条样本,你计划按 70%/15%/15% 划分为训练集、验证集和测试集。但在实际建模中,你多次调整模型超参数,以在验证集上获得最佳表现,最后用测试集评估。
请问:(a) 各集合有多少样本?(b) 这种做法有什么问题?
(a) 训练集:10000 × 70% = 7000;验证集:10000 × 15% = 1500;测试集:10000 × 15% = 1500。
(b) 问题:验证集信息泄露。当你多次调整超参数以优化验证集表现时,验证集实际上被"污染"了——模型间接地"看到了"验证集的信息。此时再用测试集评估,结果会过于乐观,不能反映真实的泛化能力。
正确做法:如果进行了多轮调参,应该再划分一个独立的测试集,或者使用交叉验证来更可靠地估计模型性能。
本节通过 sklearn 实现线性回归和逻辑回归,演示完整的监督学习流程:数据划分、模型训练、预测和评估。
train_test_split() 是数据划分的标准工具。random_state 确保划分结果可复现。
LinearRegression().fit() 使用最小二乘法拟合模型,找到使 MSE 最小的参数。
LogisticRegression 虽然名字里有"回归",但实际是分类算法。它通过 sigmoid 函数将线性输出映射为概率。
鸢尾花数据集简单且类别分离明显,因此达到 100% 准确率并不意外。在更复杂的数据集上,准确率通常在 70%-95% 之间。