第5章 监督学习:给标准答案让机器学
第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。效果不够好再考虑深度学习。四、手写第一个机器学习程序光说不练假把式。下面用PythonScikit-learn写一个完整的垃圾邮件分类器。1. 环境准备# 创建虚拟环境python-mvenv venvsourcevenv/bin/activate# Windows: venv\Scripts\activate# 安装依赖pipinstallscikit-learn pandas numpy2. 完整代码importpandasaspdimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportclassification_report,accuracy_score# 第1步准备数据 # 模拟邮件数据实际项目中从文件/数据库读取data{text:[免费领取大奖点击链接马上领取,恭喜您中奖了回复Y领取100万,明天下午3点开会请准时参加,项目报告已更新请查阅最新版本,限时优惠买一送一马上抢购,您的验证码是1234565分钟内有效,本周工作总结已发送请查收附件,免费体验VIP服务名额有限速来,下周一团建活动请报名参加,您的话费已充值成功到账100元,],label:[1,1,0,0,1,0,0,1,0,0]# 1垃圾邮件, 0正常邮件}dfpd.DataFrame(data)# 第2步特征提取 # 把文字变成机器能理解的数字向量TF-IDFvectorizerTfidfVectorizer(max_features100)Xvectorizer.fit_transform(df[text])# 特征ydf[label]# 标签# 第3步划分训练集和测试集 # 80%用来训练20%用来测试X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 第4步训练模型 # 用随机森林modelRandomForestClassifier(n_estimators100,random_state42)model.fit(X_train,y_train)# 第5步评估模型 y_predmodel.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_featuresvectorizer.transform(new_emails)predictionsmodel.predict(new_features)foremail,predinzip(new_emails,predictions):label垃圾邮件ifpred1else正常邮件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)(TPTN)/总数整体判断对了多少类别均衡时精确率(Precision)TP/(TPFP)判为垃圾的里真垃圾占多少宁可放过不可错杀时冤枉好人代价大召回率(Recall)TP/(TPFN)真垃圾里抓到了多少宁可错杀不可放过时漏掉代价大F1值(F1-Score)精确率和召回率的调和平均综合平衡精确率和召回率都要兼顾时3. 不同场景看不同指标场景更看重哪个原因垃圾邮件精确率冤枉正常邮件的代价更大用户错过重要邮件癌症筛查召回率漏掉一个癌症病人的代价更大命比什么都重要风控反欺诈召回率漏掉一个欺诈交易的代价更大直接经济损失推荐系统精确率推错了用户不点就行影响不大选指标的本质是搞清楚假阳性和假阴性哪个代价更大。八、实践中的注意事项1. 数据质量 算法选择垃圾进垃圾出。再好的算法喂垃圾数据也出不了好结果。数据质量问题清单标签是否准确人工标注的标签有5-10%的错误率很常见特征是否有信息量用户ID对预测没有意义数据是否平衡99%正常1%异常模型会直接全判正常有没有数据泄漏把未来才知道的信息放进特征里2. 从简单开始黄金法则先用最简单的方案做baseline再逐步优化。简单baseline逻辑回归 ↓ 效果不够 加特征工程 ↓ 还不够 换随机森林/XGBoost ↓ 还不够 调参优化 ↓ 还不够 考虑深度学习每一步都要跟上一步对比确认确实有提升才继续。别跳过baseline直接上复杂模型——你不知道复杂模型带来的提升是来自模型本身还是来自你的调参。3. 注意数据泄漏数据泄漏是机器学习中最隐蔽也最致命的错误训练时不小心用了测试时才该知道的信息。经典案例预测用户是否会流失特征里包含了本月登录次数——但本月还没过完的时候你不可能知道这个数。结果模型在测试集上表现极好上线后效果极差。防范方法严格区分预测时点之前能知道的信息和之后才知道的信息。本章小结要点内容监督学习给带标签的数据让机器学规律两大任务分类答案是类别和回归答案是数字五大算法线性回归、逻辑回归、决策树、随机森林、XGBoost核心流程数据准备 → 特征提取 → 划分数据集 → 训练 → 评估 → 预测训练/测试集不能自己考自己必须分开过拟合/欠拟合死记硬背 vs 没学会都不行评估指标不能只看准确率按场景选精确率/召回率/F1实践原则数据质量算法选择从简单开始防数据泄漏下一章预告第6章「无监督学习没有标准答案怎么办」—— 当你的数据没有标签时机器怎么自己找规律聚类、降维、异常检测教你处理没有答案的数据。