收益:
- 能够根据工作的实际成本定义问题类型(分类、回归、聚类)和成功标准
- 能够诚实地划分数据(不接触测试集;按时间序列的时间顺序)并建立无泄漏的评估基础
- 能够通过从简单的基线开始并仅在需要时增加复杂性来选择可解释的模型。
到目前为止,我们已经收集了数据、清理了数据、探索了数据并生成了特征。现在我们开始真正的工作,构建模型。模型是一种数学结构,它从数据中学习模式并为新情况生成预测。但构建模型最关键的部分不是代码本身,而是其之前的两个决策:定义正确的问题和正确分割数据。 AI是算法选择、代码编写、参数调优的有力顾问;但预测什么以及成功意味着什么,则由人决定。即使使用完美编写的模型,定义不明确的问题也无法解决。
首先定义问题:我们预测什么
每个建模工作都从一个问题开始,这个问题决定了模型的类型。分类——输出是一个类别:“这个客户会离开还是留下?”,“这笔交易是假的吗?”。回归(英语回归 - 输出是一个数字):“这栋房子值多少钱?”,“下个月会有多少订单?”。聚类(将未标记的数据划分为自然组):“我的客户被划分为多少个自然细分?”。
问题陈述的第二部分是成功标准:这个模型“好”意味着什么?在欺诈模型中,错过欺诈者比意外阻止诚实客户的代价要高得多;因此,最重要的不是“一般准确率”,而是“抓获欺诈者的率”。如果您不从一开始就与企业主一起定义此标准,您最终将得到一个不起作用的“高度准确”模型(我们将在第 7 单元中更深入地讨论指标)。
注意:“准确性”可能会产生误导。如果 1000 笔交易中有 10 笔是欺诈性的,那么一个愚蠢的模型会给出 99% 的准确率,但不会捕获任何欺诈者。根据问题的实际成本选择成功标准。
训练/测试分割:诚实地检查模型
使用所学到的数据测试模型就像向学生询问他/她在考试中学习的相同问题;他得到了高分,但没有表现出他真正知道的东西。所以我们将数据分成两部分(通常是三部分):
- 训练集(英文训练集,通常为70-80%):模型以此为基础进行学习。
- 测试集(测试集,通常为20-30%):模型根本看不到这一点;真正的性能是在这里衡量的。
- 验证集:用于模型设置的中间集(哪个参数更好);保持测试集“干净”。
最基本的规则:训练期间永远不会触及测试集。缩放、编码、特征选择——所有这些都只是从训练集中学习,然后应用于测试(第 5 单元的泄漏原理)。测试集是模型第一次看到现实世界;如果你太早打开它,你将永远不会知道真实的性能。
时间序列例外:如果您的数据与时间相关(销售、股票市场、需求),则不会进行随机分割。因为随机分裂导致模型看到未来并预测过去——这就是泄漏。相反,按时间顺序划分:用旧时期训练,用新时期测试。
算法选择:从简单到复杂
初学者最常见的错误是从最复杂的模型开始。正确的做法是相反的:首先建立一个简单的基线。 “总是猜测分类中的多数类别”;回归中“始终估计平均值”。这个愚蠢的模型给出了一个基线;如果你的实际模型不能通过这个,那就有问题了。然后转向简单且可解释的模型。
模型
问题类型
强项
弱点
基线(大多数/平均)
两者
给出基准
不学习
逻辑回归
分类
简单、可解释
仅线性关系
线性回归
回归
简单、快速
线性假设
决策树
两者
可解释的
容易记忆
随机森林
两者
坚固、耐用
难以解释
梯度提升(XGBoost 等)
两者
非常强
调整困难,有记忆风险
规则:选择最简单的“足够好”模型。在大多数商业环境中,可解释性比权力更有价值;最好将贷款拒绝解释为“因为你的债务与收入比率很高”,而不是“因为黑匣子是这么说的”。
三个迷你箱子
案例 1 — 问题定义不正确。一个团队建立了一个基于“客户是否满意”的分类模型,但选择“准确性”作为成功标准。数据显示,88%的客户感到满意;该模型通过称每个人都“满意”而获得了 88% 的准确率,并且从未发现不满意的人——尽管真正的目标是找到他们。教训:根据真实目的选择成功标准。
案例 2 — 车厢内时间泄漏。在需求预测项目中,数据被随机分割。该模型的准确率达到 93%,但在生产中崩溃了,因为在训练中它用 12 月的数据预测了 1 月、11 月——它已经预见了未来。当我们切换到按时间顺序划分时,实际性能提高到了 74%。课程:时间序列中的时间顺序划分。
案例 3 — 不必要的复杂性。一位分析师直接开始使用深度神经网络,对其进行了数周的调整,并获得了 81% 的准确率。然后,一位同事通过 20 行逻辑回归得到了 80% 的结果——速度更快、可解释且更易于维护。教训:从基线和简单模型开始,在需要时增加复杂性。
四个可复制模板
1)明确问题定义:
你的角色:模特顾问。帮助我定义这项工作:“我想减少客户流失。”问我并澄清:(1)这是分类还是回归,(2)目标变量到底是什么以及应该如何定义,(3)成功标准应该是什么以及为什么。决定权在我;你提出问题和选项。
2)安全训练/测试舱:
将我的 df 分为训练/测试 80%/20%。维持类别分布(stratify).random_state=42。这不是时间序列(独立观察)。打印划分后每组的类别比例。只需将分割代码提供给测试集,而不应用任何转换。
3)时间序列时间顺序划分:
数据与时间相关(日期列:order_date)。非随机,按时间顺序划分:最旧的 80% 训练,最新的 20% 测试。打印出培训和测试日期范围,以便我可以验证未来是否泄露。
4)设定基线:
我有一个分类问题(目标:流失 0/1)。首先建立基线:使用 DummyClassifier 测量训练/测试准确性,它始终预测多数类别。然后训练一个简单的逻辑回归并比较它是否超过基线。并排显示两者的指标。
弱提示/强提示
弱提示:
利用这些数据构建最佳模型。
“最佳”没有定义;没有问题类型,没有目标,没有成功标准,也没有划分策略。 AI 生成一个随机模式,可能存在泄漏。
强力提示:
你的角色:模特助理。问题:分类,目标“流失率”(0/1),存在类别不平衡(~12% 流失率)。成功标准:召回那些流失的人是首要任务。数据独立观察(非时间序列)。任务:(1) 80/20% 分层分割,(2) DummyClassifier 基线,(3) 逻辑回归,所有转换都在管道中并且仅从训练中学习。分割前请勿触摸测试装置。
这里问题类型、不平衡性、判据和泄漏措施都很清楚。
常见错误
- 没有根据真实目的选择成功标准。不平衡数据的“准确性”具有误导性;如果你想占领少数阶层,回忆就显得尤为重要。
- 在训练期间触摸测试集。在分割之前进行缩放/编码是有漏洞的并且隐藏了真实的性能。
- 时间序列中的随机分割。模型看到了未来,却在生产中崩溃;按时间顺序划分是必要的。
- 在没有建立基线的情况下跳入复杂的模型。没有基准,你就无法知道模型是否真的好。
- 忽略可解释性。在业务决策中,简单的可解释模型通常比黑匣子更有价值。
提示:在开始构建模型之前,写一句话:“该模型将预测 _____,其成功将通过指标 _____ 来衡量,因为工作的真实成本是 _____。”如果你不能填写这句话,那么你还没有准备好编写代码。
综上所述
构建模型最关键的部分不是代码,而是其之前的决策:定义正确的问题(分类或回归,目标是什么,成功标准是什么)并公平地分割数据(不触及测试集;按时间顺序排列)。始终从简单的基线开始,仅在需要时才增加复杂性;在大多数商业环境中,可解释性比权力更重要。人工智能是算法选择和代码方面的强大顾问,但人类决定你的预测和原因。
应用任务
定义一个预测问题并以书面形式完成以下句子:“该模型将预测 ___(分类/回归),目标是 ___,成功标准是 ___ 因为 ___。”然后使用正确的策略分割数据(如果是时间序列,则按时间顺序),建立基线,并测量简单模式是否打破该基线。
清单
- [ ] 我是否明确定义了问题类型(分类/回归)和目标?
- [ ] 我是否根据工作的实际成本选择了成功标准?
- [ ] 我在训练期间是否未更改测试集?
- [ ] 如果是时间序列,我是按时间顺序划分的吗?
- [ ] 在继续复杂模型之前我是否建立了基线?