第5章 监督学习:给标准答案让机器学
2026/7/27 7:03:35 网站建设 项目流程

第5章 监督学习:给标准答案让机器学

一句话点题:监督学习就是"做题对答案"——给机器一堆带标准答案的练习题,它做完对照答案,慢慢就学会了。你上学时候怎么学数学的,机器就怎么学。


写在前面

从这一章开始,我们进入第2阶段「机器学习基础」。

第1阶段我们搞清楚了"AI是什么",现在要搞清楚"AI怎么学"。机器学习有三大类(监督学习、无监督学习、强化学习),这章先讲最常用、最基础的——监督学习

为什么先讲它?因为你日常遇到的机器学习问题,80%都是监督学习。垃圾邮件检测、房价预测、信用评分、疾病诊断……全是它。


一、监督学习到底在干什么

1. 一个生活化的例子

假设你要教小孩认识"猫"和"狗"。

你怎么教?你不会跟小孩讲"猫的瞳孔是竖的,狗的瞳孔是圆的"——小孩听不懂。你会拿出一堆照片,指着说:

“这是猫。”
“这也是猫。”
“这个是狗。”
“这个也是狗。”

反复几次后,小孩自己就能分辨了。

监督学习干的就是这件事。你给机器一堆数据,每条数据都标好了"正确答案"(猫/狗),机器通过反复学习,自己悟出分辨的规律。

教小孩教机器
拿照片给小孩看给机器输入数据
告诉他"这是猫"标注正确答案(标签)
小孩自己总结规律算法自动学习模式
拿新照片让小孩认用新数据测试模型准确率

2. 三个核心概念

监督学习里有三个词你必须记住,后面会反复出现:

概念英文是什么大白话
特征Features数据中用来判断的信息你给机器看的"线索"——比如邮件里的关键词、房子的面积
标签Label正确答案标准答案——这封邮件是/不是垃圾邮件
模型Model机器学到的规律机器总结出的"判断方法"——拿到新线索后怎么判断

用垃圾邮件检测举例:

特征:邮件中"免费"出现3次、"中奖"出现2次、发件人不在通讯录 ↓ 模型(学到的规律) ↓ 标签:垃圾邮件 ✅

监督学习的流程就是:特征 + 标签 → 训练出模型 → 用模型对新数据做预测。

3. "监督"是什么意思

"监督"不是说有个人盯着机器。它的意思是:训练数据里有标准答案(标签),机器学习时"有答案可以对照"。

就像老师改作业——学生做题(机器预测),老师对答案(标签校验),错了就纠正(调整模型参数),直到做对了为止。

对比一下另外两类学习你就更清楚了:

类型有没有标准答案大白话
监督学习做题对答案
无监督学习没有自己找规律
强化学习没有,但有奖惩试错靠反馈

二、监督学习的两大任务

监督学习解决的问题可以分两大类:分类回归。区别很简单——看答案是"类别"还是"数字"。

1. 分类:答案是"哪一类"

分类问题的标签是离散的类别。也就是说,答案是从几个选项里选一个。

场景特征标签(答案)类别数
垃圾邮件检测邮件内容、发件人垃圾/正常2类(二分类)
疾病诊断体检指标、症状健康/患病2类
图片识别图片像素猫/狗/鸟/鱼多类
信用评估收入、负债、信用记录优/良/中/差多类
情感分析评论文字正面/负面/中性多类

二分类是最常见的情况——答案只有"是/否"两种。很多复杂问题最终都能转化为二分类。

2. 回归:答案是"一个数字"

回归问题的标签是连续的数值。答案不是一个类别,而是一个具体的数。

场景特征标签(答案)
房价预测面积、地段、楼层、房龄价格(如:350万)
销量预测广告投入、季节、竞品价格销量(如:12000件)
温度预测湿度、气压、风速温度(如:28.5°C)
股价预测历史价格、交易量、新闻价格(如:152.3元)
用户停留时长预测页面内容、用户画像时长(如:125秒)

3. 怎么区分

一个简单的判断方法:

答案能穷举 → 分类;答案是一个范围里的任意数 → 回归。

  • “这封邮件是垃圾邮件吗?” → 答案只有是/否 →分类
  • “这套房子值多少钱?” → 答案是任意数字 →回归
  • “这个用户会不会流失?” → 答案只有会/不会 →分类
  • “这个用户下个月消费多少?” → 答案是任意数字 →回归

三、五个最常用的监督学习算法

监督学习的算法有很多,但日常工作中最常用的就这五个。我用大白话逐个讲。

1. 线性回归——“画一条最合适的线”

用于回归任务。

假设你想根据房子面积预测价格。你把已知的房子画在坐标系里(横轴面积、纵轴价格),然后画一条直线,让这条线尽可能"贴近"所有点。

这条线就是模型。新房子来了,知道面积,往线上一查,就知道大概值多少钱。

价格 │ · │ · / │ · / ← 这条线就是"模型" │ · / │ · / │· / │ / └──────────── 面积

优点:简单、快、好解释(直线的斜率就是"每平米多少钱")
缺点:只能处理线性关系,现实世界哪有那么多直线的
适合场景:趋势预测、初步分析、特征重要性判断

2. 逻辑回归——“算概率,再分类”

用于二分类任务。

名字里虽然有个"回归",但它是做分类的。原理是:先算出"是正类的概率"(0到1之间的数),再设一个阈值(比如0.5),大于0.5就判正类,小于就判负类。

比如判断邮件是否是垃圾邮件:算出"是垃圾邮件的概率=0.87",大于0.5,判定为垃圾邮件。

优点:简单、快、输出是概率(不只是分类结果,还告诉你有多大概率)
缺点:只能处理线性可分的问题(复杂边界搞不定)
适合场景:二分类的baseline方案、需要概率输出的场景(如风控评分)

3. 决策树——“二十问游戏”

分类和回归都能做。

决策树就像玩"二十问"——通过一系列是/否问题,一步步缩小范围,最终得出答案。

判断"今天要不要带伞"的决策树:

天气预报有雨吗? / \ 是 否 / \ 带伞 ✅ 云多吗? / \ 是 否 / \ 带伞 ✅ 不带 ✅

优点:极其直观、可解释性强(能看到每一步怎么判断的)、能处理非线性
缺点:容易过拟合(树太深了就变成死记硬背)、不稳定(数据变一点树就大变)
适合场景:需要可解释性的业务场景(风控、医疗)、特征选择

4. 随机森林——“100棵树投票”

分类和回归都能做。

决策树容易过拟合怎么办?种一片森林。

随机森林的思路:训练100棵决策树(每棵树用不同的数据子集和特征子集),最后让它们投票,少数服从多数。

打个比方:你拿不准一道题,问100个同学,60个选A、40个选B,你就选A。

优点:效果好、不容易过拟合、能处理高维数据、能评估特征重要性
缺点:比单棵树慢、可解释性下降(100棵树你怎么解释?)、模型大
适合场景:表格数据的分类/回归(这是最推荐的通用方案之一)

5. XGBoost——“不断纠错的学霸团队”

分类和回归都能做。

XGBoost(极端梯度提升)的思路跟随机森林不同:随机森林是100棵树各自独立判断然后投票,XGBoost是一棵树接着一棵树地纠错——第一棵树判断错了的部分,第二棵树专门针对错误来学,第三棵树继续补第二棵树的错……

就像考试复盘:第一遍做错的题,第二遍专门练错题,第三遍练还错的题……每练一遍,错题越来越少。

优点:效果极强(Kaggle比赛的常胜将军)、能处理缺失值
缺点:调参复杂、容易过拟合(要控制好)、训练比随机森林慢
适合场景:追求极致效果的表格数据任务、比赛、结构化数据预测

五个算法对比

算法任务类型大白话可解释性效果上限
线性回归回归画一条最合适的线
逻辑回归二分类算概率再分类
决策树分类+回归二十问游戏极高
随机森林分类+回归100棵树投票
XGBoost分类+回归不断纠错的学霸团队极高

实践建议:拿到表格数据,先用逻辑回归/线性回归做baseline,再试随机森林,最后试XGBoost。效果不够好再考虑深度学习。


四、手写第一个机器学习程序

光说不练假把式。下面用Python+Scikit-learn写一个完整的垃圾邮件分类器。

1. 环境准备

# 创建虚拟环境python-mvenv venvsourcevenv/bin/activate# Windows: venv\Scripts\activate# 安装依赖pipinstallscikit-learn pandas numpy

2. 完整代码

importpandasaspdimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportclassification_report,accuracy_score# ========== 第1步:准备数据 ==========# 模拟邮件数据(实际项目中从文件/数据库读取)data={'text':["免费领取大奖,点击链接马上领取","恭喜您中奖了,回复Y领取100万","明天下午3点开会,请准时参加","项目报告已更新,请查阅最新版本","限时优惠,买一送一,马上抢购","您的验证码是123456,5分钟内有效","本周工作总结已发送,请查收附件","免费体验VIP服务,名额有限速来","下周一团建活动,请报名参加","您的话费已充值成功,到账100元",],'label':[1,1,0,0,1,0,0,1,0,0]# 1=垃圾邮件, 0=正常邮件}df=pd.DataFrame(data)# ========== 第2步:特征提取 ==========# 把文字变成机器能理解的数字向量(TF-IDF)vectorizer=TfidfVectorizer(max_features=100)X=vectorizer.fit_transform(df['text'])# 特征y=df['label']# 标签# ========== 第3步:划分训练集和测试集 ==========# 80%用来训练,20%用来测试X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# ========== 第4步:训练模型 ==========# 用随机森林model=RandomForestClassifier(n_estimators=100,random_state=42)model.fit(X_train,y_train)# ========== 第5步:评估模型 ==========y_pred=model.predict(X_test)print(f"准确率:{accuracy_score(y_test,y_pred):.2%}")print("\n详细报告:")print(classification_report(y_test,y_pred,target_names=['正常邮件','垃圾邮件']))# ========== 第6步:用模型预测新邮件 ==========new_emails=["免费中奖快来领取","今晚加班,晚饭不用等我"]new_features=vectorizer.transform(new_emails)predictions=model.predict(new_features)foremail,predinzip(new_emails,predictions):label="垃圾邮件"ifpred==1else"正常邮件"print(f"邮件: '{email}' → 判断:{label}")

3. 代码逐段解释

步骤代码做了什么大白话
第1步准备数据准备练习题和答案
第2步特征提取把文字翻译成机器能看懂的数字
第3步划分数据集80%做题(训练),20%考试(测试)
第4步训练模型让机器做题、对答案、学规律
第5步评估模型看看考试考了多少分
第6步预测新数据上岗干活,判断新邮件

4. 一个关键概念:特征提取

机器不认识文字,只认识数字。所以在训练之前,要把文字转成数字向量。

上面代码用的是TF-IDF方法,原理是:

  • TF(词频):一个词在这封邮件里出现越多,越重要
  • IDF(逆文档频率):一个词在所有邮件里都出现(如"的"“是”),就不重要

两个相乘,就能算出每个词对判断"是不是垃圾邮件"的重要程度。

"免费" → 在垃圾邮件中出现多,在正常邮件中少 → TF-IDF高 → 重要特征 "的" → 在所有邮件中都出现 → TF-IDF低 → 不重要特征

这就是特征工程的核心:把原始数据变成机器能理解的数字,而且要让数字"有区分度"。


五、训练集和测试集——为什么不能"自己考自己"

1. 为什么要分

如果用全部数据训练模型,再用同样的数据测试,就好比:老师拿上课讲的例题当考试题——学生当然能答对,但这能说明他学会了吗?不能。他可能只是背下来了。

机器也一样。如果把训练数据也拿来测试,模型可能只是"记住"了答案,而不是学会了规律。这叫过拟合

正确的做法:把数据分成两份,一份训练(学习),一份测试(考试)。训练时没见过测试数据,测试成绩才能反映真实水平。

2. 怎么分

方案做法适用场景
简单划分80%训练 + 20%测试数据量够大时
交叉验证把数据分N份,轮流用N-1份训练、1份测试数据量不大时
分层抽样划分时保持各类别比例一致类别不平衡时

3. 训练集/验证集/测试集

更严谨的做法是分三份:

数据集作用大白话
训练集训练模型做练习题
验证集调参数、选模型模拟考试
测试集最终评估期末考试

三者不能混用。尤其是测试集,只能在最后用一次,用来评估最终效果。如果反复用测试集调参,就等于"偷看了期末考试题",成绩不可信。


六、过拟合和欠拟合——学习中的两个极端

1. 过拟合:死记硬背

模型把训练数据学得太好了,连噪声和偶然现象都"背"下来了,遇到新数据反而不会判断。

比方:一个学生把课本上的例题答案全背了,考试出了新题就不会做。

表现:训练准确率99%,测试准确率70%。

2. 欠拟合:没学会

模型太简单,连训练数据中的基本规律都没学到。

比方:一个学生上课走神,连基础题都不会。

表现:训练准确率60%,测试准确率55%。

3. 怎么判断

训练准确率测试准确率判断
欠拟合模型太简单,没学会
刚好学到了规律,能举一反三
过拟合很高明显低于训练死记硬背,不会变通

4. 怎么解决

问题解决方案
欠拟合用更复杂的模型、增加特征、训练更久
过拟合用更简单的模型、增加数据、正则化、Dropout、提前停止

七、模型评估——怎么知道模型好不好

1. 不能只看准确率

假设100封邮件里有95封正常的、5封垃圾的。你的模型直接全判"正常",准确率95%——但一个垃圾邮件都没识别出来,这模型有意义吗?

所以不能只看准确率,要看多个指标。

2. 四个核心指标

先搞懂四个概念:

概念意思大白话
True Positive (TP)垃圾邮件,模型判为垃圾抓对了
False Positive (FP)正常邮件,模型判为垃圾冤枉好人
True Negative (TN)正常邮件,模型判为正常正确放行
False Negative (FN)垃圾邮件,模型判为正常漏网之鱼

基于这四个,衍生出四个指标:

指标公式含义什么时候重要
准确率(Accuracy)(TP+TN)/总数整体判断对了多少类别均衡时
精确率(Precision)TP/(TP+FP)判为垃圾的里,真垃圾占多少"宁可放过不可错杀"时(冤枉好人代价大)
召回率(Recall)TP/(TP+FN)真垃圾里,抓到了多少"宁可错杀不可放过"时(漏掉代价大)
F1值(F1-Score)精确率和召回率的调和平均综合平衡精确率和召回率都要兼顾时

3. 不同场景看不同指标

场景更看重哪个原因
垃圾邮件精确率冤枉正常邮件的代价更大(用户错过重要邮件)
癌症筛查召回率漏掉一个癌症病人的代价更大(命比什么都重要)
风控反欺诈召回率漏掉一个欺诈交易的代价更大(直接经济损失)
推荐系统精确率推错了用户不点就行,影响不大

选指标的本质是:搞清楚"假阳性"和"假阴性"哪个代价更大。


八、实践中的注意事项

1. 数据质量 > 算法选择

垃圾进,垃圾出。再好的算法,喂垃圾数据也出不了好结果。

数据质量问题清单:

  • 标签是否准确?(人工标注的标签有5-10%的错误率很常见)
  • 特征是否有信息量?("用户ID"对预测没有意义)
  • 数据是否平衡?(99%正常1%异常,模型会直接全判正常)
  • 有没有数据泄漏?(把"未来才知道的信息"放进特征里)

2. 从简单开始

黄金法则:先用最简单的方案做baseline,再逐步优化。

简单baseline(逻辑回归) ↓ 效果不够? 加特征工程 ↓ 还不够? 换随机森林/XGBoost ↓ 还不够? 调参优化 ↓ 还不够? 考虑深度学习

每一步都要跟上一步对比,确认确实有提升才继续。别跳过baseline直接上复杂模型——你不知道复杂模型带来的提升是来自模型本身还是来自你的调参。

3. 注意数据泄漏

数据泄漏是机器学习中最隐蔽也最致命的错误:训练时不小心用了测试时才该知道的信息。

经典案例:预测用户是否会流失,特征里包含了"本月登录次数"——但"本月"还没过完的时候你不可能知道这个数。结果模型在测试集上表现极好,上线后效果极差。

防范方法:严格区分"预测时点之前能知道的信息"和"之后才知道的信息"。


本章小结

要点内容
监督学习给带标签的数据让机器学规律
两大任务分类(答案是类别)和回归(答案是数字)
五大算法线性回归、逻辑回归、决策树、随机森林、XGBoost
核心流程数据准备 → 特征提取 → 划分数据集 → 训练 → 评估 → 预测
训练/测试集不能自己考自己,必须分开
过拟合/欠拟合死记硬背 vs 没学会,都不行
评估指标不能只看准确率,按场景选精确率/召回率/F1
实践原则数据质量>算法选择,从简单开始,防数据泄漏

下一章预告:第6章「无监督学习:没有标准答案怎么办」—— 当你的数据没有标签时,机器怎么自己找规律?聚类、降维、异常检测,教你处理"没有答案"的数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询