跳到主要内容

问问题的家族与集体评审

这一章讲三件事: 决策树怎么把预测变成「问一串问题」; 两种攒队伍的方式(bagging 投票、boosting 纠错)各自怎么运作; 以及模型训完之后怎么验收——哪些数字能信、哪些数字会说谎。 读完你会拿到第 02 章「画线家族」之外的另一半经典工具箱。

1. 决策树:预测即问答

解决什么问题: 第 02 章的线性模型给不出「为什么」——它输出一个数, 人说不出模型是按什么理由判的。决策树(decision tree)反着来: 它学到的就是一个可以画出来的问题清单1

主走查:门诊分流树

原书举的例子是一个预测就诊行为的树,第一刀切在「过去一年就诊次数」上, 阈值是 4;第二层每支再各切一刀:一支切「平均就诊时长」阈值 2 天, 另一支切阈值 10 天2。走一遍:

病人:过去一年就诊 6 次
│ 问①:就诊次数 > 4?
├── 是 → 走右支
│ 问②:平均就诊时长 > 10 天?
│ ├── 是 → 叶子 A:预测「高频长住」
│ └── 否 → 叶子 B:预测「高频短访」
└── 否 → 走左支(问「时长 > 2 天」……)

图说:从根到叶就是一次问答。每个内部节点是一个「特征+阈值」,
每片叶子是一个预测结果。这一例的特征与阈值都是原书给的。

它怎么自己长出来

树是递归(自己重复同一套步骤、一层层往下做)分裂长出来的:从全部数据开始,每一层挑「最能分开数据的特征+阈值」切一刀, 把数据分成几支,每支继续挑、继续切,直到触发停止条件——树太深了,或某片叶子里的 样本太少3。分类树叶子放类别,回归树叶子放数值(第 02 章骨架不变)。

为什么有效: 每一刀都是局部最优(只保证这一步最好,不保证全局最好)的「信息筛选」,问题问得越准,后面的分支越干净。

边界在哪: 原书点名两条——树深不控就过拟合(把训练集背成一棵巨树)4; 训练数据稍微变一变,长出来的树就完全不同(不稳定)。经典解法是剪枝(把过深的分支剪掉), 以及——下一节的正解——别种一棵,种一片

2. 集成:一棵树的判断不可靠,就开评委会

解决什么问题: 单棵树(或任何一个「善变」的模型)方差(换一批训练数据,结果就大不一样)大。 集成方法(ensemble)的思路:训练多个模型,把它们的预测合并——分类投票、回归取平均, 用群体的稳定吃掉个体的善变5。两种攒法:

bagging:并行投票

bagging(bootstrap aggregating)并行训练多个模型,每个模型拿到的是 有放回随机抽样出来的训练子集——有的样本被抽中多次,有的落选。 每个模型见到的数据略有不同,于是犯错的地方也各不相同,投票时错误互相抵消6

随机森林(random forest)= bagging + 决策树,再加第三重随机。原书的构造步骤7:

  1. 从 1000 条数据里有放回抽子集(bootstrap);
  2. 每棵树在每次分裂只从随机一小撮特征里选分裂点(不是全部特征);
  3. 全部树投票(分类)/取平均(回归)。

为什么有效: 抽样让树们「各看各的数据」,特征随机让树们「各问各的问题」, 树与树之间的相关性被压低——相关性越低,投票抵消错误的效果越好。

小走查:三棵树审同一份门诊名单(从主走查的就诊数据续走;以下数字为演示编的): 从 1000 条门诊记录里有放回抽 1000 条,约六成三的不同记录入选、其余位置被抽中多次——得子集 A;再抽两次得 B、C,各训一棵树。新病人「就诊 6 次、时长 3 天」走进森林:树 A(抽样恰好偏向高频者)判「高频」,树 B(抽样偏向低频者)判「低频」,树 C 判「高频」——2 比 1,判「高频」。单信树 B 会误判;三棵树意见不一,恰恰是投票有意义的前提。boosting 版的对照:树 B 判错的那位病人,下一轮权重上调,树 C 盯着他纠错。

走查记账: 本章两条承重主线各有走查——「树怎么长」走门诊分流树(§1),「集成怎么投票」走上面的三棵树;「验收仪表」(过拟合/交叉验证/各项评分)是全章共用的另一处走查,在第 3 节——另起共两处,在一章两处的上限之内。

boost:接力纠错

boosting串行的:第 N 个模型专攻前 N−1 个模型答错的题8。 两个代表,哲学不同:

AdaBoostGBM(梯度提升)
纠错方式改样本权重:答错的样本权重上调,下一个模型被迫盯住它们9拟合残差:下一个模型直接去预测「上一个模型的答案与真相差多少」10
一句话换考卷重点补差价
风险对噪声敏感(噪声被反复加权)11重做的遍数太多、或每步幅度太大,就过拟合12

Extra Trees(极端随机树)是随机森林的近亲,差别两处:抽样不放回; 分裂点不看最优、直接随机选13。随得更狠,单树更差、群体差异更大, 原书说实践中常与随机森林打平、偶尔略好14

3. 验收:模型训完之后看什么

这一节解决「怎么知道模型是好是坏」。 原书把它放在第 2 章末尾,我们原样保留, 因为它对后面所有章都有效。

三种病:过拟合、欠拟合、偏差-方差

  • 过拟合:训练集上漂亮、新数据上露馅——背题15;
  • 欠拟合:训练集和新数据上都差——模型太简单,连规律都没学到;
  • 偏差-方差权衡:偏差=假设太死板导致的系统性跑偏(欠拟合那头); 方差=对训练数据太敏感导致的摇晃(过拟合那头)。目标是两者的平衡点16

k 折交叉验证:把「一次运气」变成「平均成绩」

问题: 只留一次测试集,成绩好坏有一半是运气。 做法: k 折交叉验证(k-fold cross-validation)把数据切成 k 份, 轮流拿其中 1 份当考卷、其余 k−1 份当教材,训练 k 次,k 个成绩取平均。 每条数据都当过一次考题,成绩的偶然性被摊平17。代价明摆着:训练 k 倍的时间18

指标:准确率会说谎

先立四个数:TP(真阳性:真是、判是)/ FP(假阳性:不是、判是)/ TN(真阴性)/ FN(假阴性:是、判不是)19

指标算法回答的问题什么时候看它
accuracy(TP+TN)/全部总体判对了几成类别大致平衡时
precisionTP/(TP+FP)判「是」的里面多少真是误报贵(拦截正常客户)
recallTP/(TP+FN)真是里面逮住了几成漏报贵(漏掉一个癌症)
F1(调和平均:两头都高它才高)两头都要顾的单一分数快速比较模型
AUC-ROC阈值扫一遍下的面积换阈值时整体表现比较不同模型的排序能力

准确率的陷阱: 1000 条数据里只有 10 条正类,一个无脑全判「否」的模型准确率 99%—— 数字漂亮,一事无成。这就是「类不平衡时 accuracy 无意义」的全部机制, 原书原话是「在类不平衡数据集上可能产生误导」20

4. 作者的判断与证据

  • 有出处、可核的: 决策树例子的特征与阈值(就诊次数 4、时长 2/10 天)是原书图 2.7 的内容; 随机森林「1000 条数据」的 bootstrap 走查、AdaBoost 八步流程、GBM 六步流程, 都是完整的算法描述,与主流教材一致21
  • 代码层的问题(要如实标): 2.14 节的 Extra Trees 示例用 load_boston() 加载数据—— Boston 房价数据集自 2022 年起已从 scikit-learn 移除,照抄必报错22。 这是本章(乃至全书)代码时效性的缩影:概念部分大体稳,代码部分要自己过一遍。
  • 前后矛盾一处: 2.18 的小结把 2.2 节的四种数据分析类型 (description/detection/prediction/behavior change)换写成了另一套 (descriptive/diagnostic/predictive/prescriptive)——同一本书里对不上23
  • 无出处的断言: 「AdaBoost 天然做特征选择」「Extra Trees 常与随机森林打平」这类话, 书里不给实验也不给引用,当经验记忆即可。

判断(我们的,不是书里的): 本章的树与集成,和第 02 章的线模型, 是两种相反的哲学:线性模型把「人的判断」写进函数形状(你定的线,系数可读), 树把判断外包给数据(它自己挑问题,你只管限制树深)。集成再进一层: 承认单个模型必错,改押注「错误不重叠的群体」。 如果错,会错在: 如果某个任务里错误天然高度相关(比如所有模型都在同一处数据噪声上翻车), 「群体抵消错误」的前提就不成立,集成的收益会远小于本章的讲法。

5. 边界与局限

  • 这一族仍不学特征。 特征还是人递进来的;深度学习要取代的正是这一步(第 04 章起)。
  • ** boosting 系的代价书里讲了但讲得轻:** GBM 对超参数敏感、训练串行难并行; 原书只给一句「proper parameter tuning is crucial」24
  • 原书没讲、也不该由这本书讲的: XGBoost/LightGBM 这两个工业界主流实现 (原书只在 4.2 节顺带提名)的工程细节;类别特征的处理;单调性约束。 这些属于「经典机器学习工程」的另一个书架。
  • 评估一节的盲区: 没有讲「测试集只能用一次」的纪律——反复在测试集上调模型, 等于把考卷背下来了。这一条原书漏了,但它是实践中最常见的自欺。

6. 可带走的

  1. 决策树 = 学出来的问题清单;主走查记住一刀:就诊次数 > 4;
  2. 树的病是不稳定 + 过拟合,药是别种一棵、种一片;
  3. bagging 并行投票(随机森林 = bagging + 树 + 每刀随机特征);boosting 串行纠错;
  4. AdaBoost 改考卷重点(样本权重),GBM 补差价(拟合残差)——两种纠错哲学;
  5. Extra Trees 比随机森林多一重随机:不放回抽样 + 随机分裂点;
  6. 验收看三样:过拟合/欠拟合的病相、k 折交叉验证的平均成绩、按业务选的指标;
  7. 类不平衡时准确率会说谎:99% 准确率的模型可能一个正类都没逮到;
  8. 误报贵看 precision,漏报贵看 recall——这句话能解决一半的「该看哪个指标」争论;
  9. 原书代码有死亡陷阱:load_boston() 已从 sklearn 移除,照抄必报错。

7. 原文地图

主题原书章原文位置
决策树递归分裂2.11 Decision Treestext/17-ch02-11-2-11-decision-trees.txt:20(搜「built recursively」)
就诊次数阈值 42.11 Decision Treestext/17-ch02-11-2-11-decision-trees.txt:28(搜「number of visits」) · text/17-ch02-11-2-11-decision-trees.txt:31(搜「average length」)
停止条件2.11 Decision Treestext/17-ch02-11-2-11-decision-trees.txt:35(搜「stopping criterion」)
树易过拟合2.11 Decision Treestext/17-ch02-11-2-11-decision-trees.txt:98(搜「prone to overfitting」)
bagging 定义2.12 Ensemble Modelstext/18-ch02-12-2-12-ensemble-models.txt:9(搜「Bagging」)
boosting 定义2.12 Ensemble Modelstext/18-ch02-12-2-12-ensemble-models.txt:18(搜「Boosting」)
随机森林三步2.13 Random Foresttext/19-ch02-13-2-13-random-forest.txt:28(搜「1,000 instances」) · text/19-ch02-13-2-13-random-forest.txt:35(搜「random subset」)
投票与平均2.13 Random Foresttext/19-ch02-13-2-13-random-forest.txt:40(搜「majority voting」)
Extra Trees 两差异2.14 Extra Treestext/20-ch02-14-2-14-extra-trees.txt:35(搜「without replacement」) · text/20-ch02-14-2-14-extra-trees.txt:32(搜「random splits」)
load_boston 已废弃2.14 Extra Treestext/20-ch02-14-2-14-extra-trees.txt:53(搜「load_boston」)
AdaBoost 八步2.15 AdaBoosttext/21-ch02-15-2-15-adaboost.txt:39(搜「Initialize the Weights」) · text/21-ch02-15-2-15-adaboost.txt:51(搜「Update the Sample Weights」)
弱学习器定义2.15 AdaBoosttext/21-ch02-15-2-15-adaboost.txt:41(搜「weak learner」)
AdaBoost 怕噪声2.15 AdaBoosttext/22-ch02-16-2-16-gradient-boosting-method.txt:4(搜「Sensitive to Noisy」)
GBM 拟合残差2.16 Gradient Boosting Methodtext/22-ch02-16-2-16-gradient-boosting-method.txt:26(搜「residuals」)
GBM 过拟合风险2.16 Gradient Boosting Methodtext/22-ch02-16-2-16-gradient-boosting-method.txt:51(搜「prone to overfitting」)
过拟合/欠拟合/偏差方差2.17 Model Performance Evaluationtext/23-ch02-17-2-17-model-performance-evaluation.txt:18(搜「Overfitting:」) · text/23-ch02-17-2-17-model-performance-evaluation.txt:32(搜「Bias-Variance」)
k 折交叉验证2.17 Model Performance Evaluationtext/23-ch02-17-2-17-model-performance-evaluation.txt:69(搜「K-Fold」) · text/23-ch02-17-2-17-model-performance-evaluation.txt:88(搜「computational cost」)
TP/FP/TN/FN2.17 Model Performance Evaluationtext/23-ch02-17-2-17-model-performance-evaluation.txt:159(搜「True Positives」)
accuracy 会误导2.17 Model Performance Evaluationtext/23-ch02-17-2-17-model-performance-evaluation.txt:180(搜「misleading」)
precision/recall 适用面2.17 Model Performance Evaluationtext/23-ch02-17-2-17-model-performance-evaluation.txt:186(搜「Precision」) · text/23-ch02-17-2-17-model-performance-evaluation.txt:195(搜「Recall」)
AUC-ROC 与 log loss2.17 Model Performance Evaluationtext/24-ch02-18-2-18-summary.txt:2(搜「AUC-ROC」) · text/24-ch02-18-2-18-summary.txt:4(搜「Log Loss」)
小结与 2.2 矛盾2.18 Summarytext/24-ch02-18-2-18-summary.txt:26(搜「diagnostic」) · text/08-ch02-02-2-2-types-of-data-analysis.txt:6(搜「description, detection」)
表格数据上树仍强4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:121(搜「Decision Trees」) · text/41-ch04-4-convolutional-neural-networks.txt:127(搜「Gradient Boosting Machines」)

Footnotes

  1. 出处:「2.11 Decision Trees」第 16 段(text/17-ch02-11-2-11-decision-trees.txt:16,搜「popular machine learning algorithm」)。原文:决策树从训练数据学出一组规则,构成树状结构,表示一系列决策及其可能结果。

  2. 出处:「2.11 Decision Trees」第 28 段(text/17-ch02-11-2-11-decision-trees.txt:28,搜「number of visits」)与第 31 段(搜「average length」)。原文图 2.7 的例子:第一刀按「过去一年就诊次数」阈值 4 分两支;第二层一支按「平均就诊时长」阈值 2 天、另一支按 10 天再切。

  3. 出处:「2.11 Decision Trees」第 35 段(text/17-ch02-11-2-11-decision-trees.txt:35,搜「stopping criterion」)。原文:递归持续直到触发停止条件,例如达到最大深度或每个叶节点最少样本数。

  4. 出处:「2.11 Decision Trees」第 98 段(text/17-ch02-11-2-11-decision-trees.txt:98,搜「prone to overfitting」)与第 100 段(搜「sensitive to small changes」)。缺点列表还含类不平衡与「弱学习器」两条。

  5. 出处:「2.12 Ensemble Models」第 3 段(text/18-ch02-12-2-12-ensemble-models.txt:3,搜「combining their」)。原文:集成靠多模型的多样性与集体智慧换更好的泛化与稳健。

  6. 出处:「2.12 Ensemble Models」第 9 段(text/18-ch02-12-2-12-ensemble-models.txt:9,搜「Bagging」)。原文:有放回抽样造成模型间的多样性,分类多数投票、回归取平均;对高方差模型(如决策树)特别有效。

  7. 出处:「2.13 Random Forest」第 28 段(text/19-ch02-13-2-13-random-forest.txt:28,搜「1,000 instances」)、第 33 段(搜「random subset」)、第 38 段(搜「majority voting」)。

  8. 出处:「2.12 Ensemble Models」第 18 段(text/18-ch02-12-2-12-ensemble-models.txt:18,搜「Boosting」)。原文:每个后续模型受训去纠正前面模型的错误;训练数据逐轮重加权,难例越来越被重视。

  9. 出处:「2.15 AdaBoost」第 51 段(text/21-ch02-15-2-15-adaboost.txt:51,搜「Update the Sample Weights」)。原文:错分样本权重上调、对分样本下调;第 41 段定义弱学习器为「略好于随机猜测」的简单模型。

  10. 出处:「2.16 Gradient Boosting Method」第 26 段(text/22-ch02-16-2-16-gradient-boosting-method.txt:26,搜「residuals」)。原文:与改样本分布的 AdaBoost 不同,GBM 让后续模型去拟合残差(预测值与真实值之差)。

  11. 出处:「2.16 Gradient Boosting Method」第 4 段(text/22-ch02-16-2-16-gradient-boosting-method.txt:4,搜「Sensitive to Noisy」)。这条缺点列表属于 AdaBoost(文件跨段接续)。

  12. 出处:「2.16 Gradient Boosting Method」第 51 段(text/22-ch02-16-2-16-gradient-boosting-method.txt:51,搜「prone to overfitting」)。原文:迭代(弱学习器)太多或学习率太大时 GBM 易过拟合。

  13. 出处:「2.14 Extra Trees」第 35 段(text/20-ch02-14-2-14-extra-trees.txt:35,搜「without replacement」)与第 38 段(搜「random splits」)。原文:与随机森林选最优分裂(Gini/信息增益)不同,Extra Trees 每个节点直接随机选分裂点。

  14. 出处:「2.14 Extra Trees」第 24 段(text/21-ch02-15-2-15-adaboost.txt:24,搜「exhibits comparable performance」)。原文:实践中 Extra Trees 常与随机森林表现相当,视数据集不同偶尔略好。

  15. 出处:「2.17 Model Performance Evaluation」第 18 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:18,搜「Overfitting:」)。

  16. 出处:「2.17 Model Performance Evaluation」第 32 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:32,搜「Bias-Variance」)。原文:高偏差导致欠拟合,高方差(模型过于复杂、学了噪声)导致过拟合。

  17. 出处:「2.17 Model Performance Evaluation」第 69 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:69,搜「K-Fold」)。原文:数据分 k 份,每次留一份做验证、其余 k−1 份训练,重复 k 次后取平均。

  18. 出处:「2.17 Model Performance Evaluation」第 88 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:88,搜「computational cost」)。原文:交叉验证要训练评估多次,大数据集或复杂模型上费时;但可靠估计的收益通常大于算力成本。

  19. 出处:「2.17 Model Performance Evaluation」第 159 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:159,搜「True Positives」)起。四条定义各占一段。

  20. 出处:「2.17 Model Performance Evaluation」第 180 段(text/23-ch02-17-2-17-model-performance-evaluation.txt:180,搜「misleading」)。原文:accuracy 直白,但在类不平衡数据集上可能误导。

  21. 出处:「2.15 AdaBoost」第 39 段(text/21-ch02-15-2-15-adaboost.txt:39,搜「Initialize the Weights」)(八步流程);「2.16 Gradient Boosting Method」第 28 段(搜「following steps」)(六步流程)。

  22. 出处:「2.14 Extra Trees」第 53 段(text/20-ch02-14-2-14-extra-trees.txt:53,搜「load_boston」)。代码从 sklearn.datasets 导入并调用 load_boston()。补充(不在书里,来自通用知识):Boston Housing 数据集因伦理争议自 scikit-learn 1.2(2022 年 12 月)起被移除,该调用在现代版本上抛异常。

  23. 出处:「2.18 Summary」第 26 段(text/24-ch02-18-2-18-summary.txt:26,搜「diagnostic」)与「2.2 Types of Data Analysis」第 6 段(text/08-ch02-02-2-2-types-of-data-analysis.txt:6,搜「description, detection」)。

  24. 出处:「2.16 Gradient Boosting Method」第 53 段(text/22-ch02-16-2-16-gradient-boosting-method.txt:53,搜「parameter tuning is crucial」)。原话:「proper parameter tuning is crucial to ensure optimal performance and prevent overfitting」。