📊 第4章 机器学习的基础知识
📄 一句话概括

一万笔交易里只有 100 笔有问题,抓住 90 笔、误报 890 笔:准确率 91%,精确率只有 9.2%。 一个「全说没问题」的模型,准确率 99.0%,一个都没抓到。 建模只占工程师两成时间,四成半花在准备数据上。

📝 本章和前面几章的关系

前两篇讲模型怎么训、怎么判断好坏。这一篇讲怎么评价、以及人怎么分工。 教材 4.6、4.7 两节:机器学习工具、科学分析类工程技术员的不同角色。 4.6 列了一堆工具名。 本篇不逐个介绍(工具版本一年一变),只讲选工具的标准和评价模型的四个指标。

一、先说工具:够用就好

教材 4.6 节提到的工具大致分四类:数值计算(numpy 这类)、数据处理(pandas 这类)、 传统机器学习(scikit-learn 这类)、深度学习框架(TensorFlow、PyTorch)。 选工具的标准只有三条:团队会不会用、能不能招到人、出问题能不能查到原因。 「哪个更先进」几乎不重要。一个团队用惯了 scikit-learn,硬换 PyTorch 只会拖慢进度。

这一课的所有 Demo 都没用这些库,全部手写。不是为了让你手写,是为了让你看清里面没有魔法。 知道内部在算什么,出问题时才知道该看哪。只会调 API 的人,遇到「模型不收敛」就只能瞎试。

二、准确率是最容易骗人的指标

演示造了一个场景:一万笔交易,真正有问题的只有 100 笔。 模型抓到了 90 笔,漏了 10 笔;同时误报了 890 笔(把正常的说成有问题)。 准确率 = (90 + 9010) / 10000 = 91.0%。看着还行。

但精确率只有 9.2%——它报了一千个警报,只有九十个是真的。运营的人会被这一千个警报淹没。 召回率 90.0%——一百个真问题里抓到了九十个,这个数字还不错。 现在换一个「什么都不做」的模型:所有交易都判没问题。准确率 99.0%。

比上面那个还高。可它一个都没抓到。 这就是为什么类别不平衡时不能只看准确率。样本里九成九都是正常的时候,全猜正常就是 99%。

三、四个指标各管什么

准确率:(TP + TN) / 全部。回答「总共判对了多少」。 精确率:TP / (TP + FP)。回答「报出来的警报里有多少是真的」。关心误报就用它。 召回率:TP / (TP + FN)。回答「真的问题里抓到了多少」。关心漏报就用它。

F1:精确率和召回率的调和平均。两个都要顾的时候用。 精确率和召回率是一对矛盾:想少误报就提高阈值,召回率掉;想多抓就降低阈值,精确率掉。 选哪个看代价。漏掉一笔欺诈的损失,和误报一次打扰用户的成本,哪个大就保哪个。 这个决定不能由工程师一个人做,得业务来定。

四、工程师的时间花在哪

演示最后给了一张时间分配表:搞清楚问题 15%、准备数据 45%、建模调参 20%、上线监控 20%。 这张表是按常见项目节奏写的经验值,不是测出来的。 但它的意思很实在:建模只占两成,其余八成是数据和工程。 这正好呼应第 1.3 篇那个关键路径:准备数据 10 天、工程化 14 天,建模验证只有 6 天。

所以教材 4.7 节专门讲「科学分析类工程技术员的不同角色」——研究和工程是两种活。 研究追的是效果上限:能不能再准一个点。工程保的是每天能跑:数据变了会不会崩、模型漂了有没有人发现。 这两件事需要的技能几乎不重叠。 一个人两样都强很罕见,所以团队里通常分开配人。

五、动手 Demo:准确率 91% 和 99%,哪个模型更有用

造一个极不平衡的场景:一万笔交易,100 笔真有问题。 算准确率、精确率、召回率、F1 四个指标。 再对比一个「全说没问题」的模型。

N, TP, FN, FP, TN = 10000, 90, 10, 890, 9010

acc  = (TP + TN) / float(N)
prec = TP / float(TP + FP)      # 报出来的有多少是真的
rec  = TP / float(TP + FN)      # 真的抓到了多少
f1   = 2 * prec * rec / (prec + rec)

print('准确率 %.1f%%' % (acc * 100))
print('精确率 %.1f%%' % (prec * 100))
print('召回率 %.1f%%' % (rec * 100))
print('F1     %.1f%%' % (f1 * 100))

print('全说没问题:准确率 %.1f%%' % (9900 / float(N) * 100))

实跑输出:

--------------------------------------------------------------------
准确率 99% 也可能一个都没抓到
--------------------------------------------------------------------

  ① 造一个极不平衡的场景
  --------------------------------------------------------------------
  一万笔交易,真正有问题的 100 笔

|  | 模型说是问题 | 模型说没问题 |
|---|---:|---:|
| 真的有问题 | TP = 90 | FN = 10 |
| 真的没问题 | FP = 890 | TN = 9010 |

  看准确率:91.0%。看着还行。
  但精确率只有 9.2%——它报了一千个警报,只有九十个是真的。
  召回率 90.0%——一百个真问题里抓到了九十个。

  ② 换个「全说没问题」的模型
  --------------------------------------------------------------------
  一个什么都不做的模型:所有交易都判「没问题」
  准确率 99.0%
  准确率 99.0%,比上面那个还高一点点。可它一个都没抓到。
  这就是为什么类别不平衡时不能只看准确率。样本里九成九都是正常的时候,全猜正常就是 99%。

  ③ 四个指标各管什么
  --------------------------------------------------------------------

| 指标 | 算法 | 回答的问题 |
|---|---|---|
| 准确率 | (TP+TN) / 全部 | 总共判对了多少 |
| 精确率 | TP / (TP+FP) | 报出来的警报里有多少是真的 |
| 召回率 | TP / (TP+FN) | 真的问题里抓到了多少 |
| F1 | 2PR / (P+R) | 精确率和召回率的折中 |

  精确率和召回率是一对矛盾:想少误报,就提高阈值,召回率掉;想多抓,就降低阈值,精确率掉。
  选哪个看代价。漏掉一笔欺诈的损失,和误报一次打扰用户的成本,哪个大就保哪个。

  ④ 工程师的时间花在哪
  --------------------------------------------------------------------

| 环节 | 占比 | 干什么 |
|---|---|---|
| 搞清楚问题 | 15% | 指标怎么定义、标签从哪来 |
| 准备数据 | 45% | 取数、清洗、对齐、造标签 |
| 建模调参 | 20% | 试模型、调参数 |
| 上线与监控 | 20% | 工程化、看效果衰减 |

  这张表是按常见项目节奏写的经验值,不是测出来的。
  但它的意思很实在:建模只占两成,其余八成是数据和工程。
  所以教材 4.7 节专门讲「科学分析类工程技术员的不同角色」——研究和工程是两种活,前者追效果上限,
  后者保每天能跑。

第一段的混淆矩阵只有四个格子,但所有的分类指标都是从这四个数算出来的。 先把这四个数摆对,再谈指标。 第二段那个「全说没问题」的对比是本篇的核心。它不需要任何模型,准确率却比正经模型还高。 第三段那张指标表建议存下来。面试、评审、写报告都用得上,而且很多人真的分不清精确率和召回率。 最后那张时间表是经验值,不是测出来的。 但它和前面第 1.3 篇的关键路径对得上,说明这个比例不是拍脑袋的。

30 秒实验

  1. 把 FP 从 890 改成 90,重算四个指标,看精确率跳到多少。
  2. 把正样本从 100 改成 1000(其他不变),看准确率变成多少——这说明准确率对类别比例极其敏感。
  3. 把 TP 从 90 改成 50(少抓一半),看召回率和 F1 各掉多少。

常见误区

  1. 「准确率 95% 就是个好模型。」类别不平衡时,全猜多数类就能到 99%。必须同时看精确率和召回率。
  2. 「精确率越高越好。」精确率高的代价通常是召回率低。两个都要看,按业务代价取舍。
  3. 「工具越新越好。」团队不会用、出问题查不到原因,再新也是负担。
自测三问(点开对答案) 1. 为什么「全说没问题」的模型准确率反而更高? —— 因为一万笔里 9900 笔确实没问题。全猜「没问题」就对了 9900 个,准确率 99%。 但它一个真问题都没抓到。 2. 精确率和召回率分别回答什么问题? —— 精确率问「你报的警报里有多少是真的」,召回率问「真的问题里你抓到了多少」。 前者关心误报,后者关心漏报。 3. 为什么建模只占工程师两成时间? —— 因为把数据取到、洗干净、对齐口径,比调模型难得多也慢得多。 而且模型上线后还要持续监控,这也算工程活。

下一篇进第 5 章:数据怎么进来——批与流两种收法。

相关笔记