想象你有一座苹果园。春天一到,果树疯狂抽枝,枝条密密匝匝,叶子层层叠叠,把阳光挡得严严实实。有经验的园丁知道,不修剪的树结出的果子又小又涩——养分全被多余枝条抢走了。但怎么修,园丁们分成了两派:保守派园丁从树苗起身就拿尺子量,长到齐腰高就禁止再往上窜;豪放派园丁则任由果树长满一个夏天,到秋天才搬来梯子,大刀阔斧砍掉所有不结果的枝杈。两派手法截然相反,目标却出奇一致:让树冠通透、让阳光照进每一根枝条。 机器学习里的决策树,正是这棵“果树”。它贪婪地从数据中吸收规律,稍不留神连噪声都当成了宝贝,长得枝繁叶茂、深不见底,最后对新样本反而一头雾水——这就是过拟合。让决策树回归挺拔,靠的就是两位园丁的看家本领:预剪枝(生长中提前喊停)和后剪枝(长满后自底向上修剪)。掌握这两招,你就能在模型调优时一眼看穿“树越深越好”的陷阱,稳稳提升模型的泛化能力。

岗位关联

学懂预剪枝与后剪枝,你就能在树模型调优中快速定位过拟合根源、合理配置参数,这是衡量算法工程师基本功的核心技能,也是面试必考的高频考点。

目录
  1. 可视化演示
  2. 枝繁叶茂的隐患——过拟合现象
  3. 果树如何长大——决策树生长机制
  4. 第一招:预剪枝——生长中提前喊停
  5. 第二招:后剪枝——长满后自底向上修剪
  6. 验证集这把尺子——剪枝决策的依据
  7. 两招如何取舍——预剪枝与后剪枝的对比选型
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示决策树防过拟合的两种剪枝策略:预剪枝在树生长时提前停止分裂、后剪枝先长成满树再自底向上修剪。切换模式查看不同剪枝流程的分步演示。

本节配有交互动效(进入视口后自动加载,约 3KB)。

预剪枝 在树生长过程中,当分裂不满足准则(如最大深度、最小样本数)时提前停止 速度快但可能欠拟合,存在视野贪婪问题 stop if |D| < N_min or depth ≥ d_max

枝繁叶茂的隐患——过拟合现象

邻居家果园的主人从不修剪果树,我抬头一看,枝条密得像一团乱麻,果实又小又涩。园丁摇摇头说:“这棵树把劲儿全用在长没用的枝条上了,阳光照不进来,果子自然长不好。”决策树模型就是这棵疯狂的果树。它在训练集上“学得越努力”,越是把样本里的每一个特殊癖好都记下来——这叫做噪声学习。数据里的偶然噪声本不该当规律,树却照单全收。

更麻烦的是,树不断向下分裂,分支越来越细,每个叶子节点只覆盖几个样本——这就是分支过细。每条分支都像是为那两三个样本量身定制的“专属通道”,换个数据集立刻失效。于是出现一个诡异的反差:训练集上表现近乎满分,一到新数据就露馅,这个“训练好、实战差”的落差就是泛化变差。

这种现象在机器学习里叫过拟合。模型的泛化误差可以拆成训练误差和“泛化差距”两部分:

回到果园:树不是不想结果,是没人帮它修剪。过拟合的根子在于“只管长、不管收”——想让它果子结得好,就必须果断动剪刀。

Egen=Etrain+Egap\displaystyle E_{gen}=E_{train}+E_{gap}
泛化误差 = 训练误差 + 泛化差距。树越深越密,训练误差越低,但泛化差距疯狂膨胀,整体反而更差。
  1. 泛化误差模型在从未见过的新样本上的真实表现,是我们真正关心却无法直接测量的“期末成绩”。
    EgenE_{gen}
  2. 训练误差模型在训练集上的误差,树越长越深,它就越低,容易给人“学得很好”的错觉。
    EtrainE_{train}
  3. 泛化差距经验差距,是训练误差与真实误差之间的鸿沟。枝繁叶茂的决策树,这个沟会被越挖越深。
    EgapE_{gap}

果树如何长大——决策树生长机制

果树生长有个朴素的规律:哪边阳光好就往哪边长。决策树也有自己的“生长铁律”:每一步都选一个特征把当前数据劈成两半,让分裂后的两组数据尽可能“纯”——同类样本尽量聚在一起,这种一步步把数据切分得更干净的过程叫递归分裂。

具体怎么选?树采用的是“今朝有酒今朝醉”的贪心选择:只考虑当前这一步哪个特征分裂后纯度提升最大,绝不回头反悔。纯度提升的量通常用信息增益来衡量。假设当前节点有样本集合 $D$,候选特征 $a$ 把 $D$ 划分成 $V$ 个子集,信息增益定义为:

那树什么时候停止生长呢?通常有三个终止条件:当前节点的样本全部属于同一类别、所有特征都已被用尽、或样本量已经少到没有继续分裂的意义。但问题恰恰在这里——这三个条件都非常“宽松”,放任不管的话树能一直长到每个叶子只剩一个样本。所以,树天生没有“适可而止”的智慧,必须靠园丁的外力约束,于是有了下面两招。

Gain(D,a)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)\displaystyle Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
信息增益 = 分裂前的混乱程度 - 分裂后的加权混乱程度。增益越大,说明这个特征切得越干净,树就越优先选它。
  1. 当前样本集$D$ 表示当前节点携带的全部样本,比如“这堆苹果里 60 个是甜的、40 个是酸的”。
    DD
  2. 经验熵$Ent(D)$ 是分裂前的混乱程度,样本类别越混杂,这个值越大,代表“越不知道该怎么分”。
    Ent(D)Ent(D)
  3. 加权子集熵$\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)$ 是分裂后各组混乱度的加权平均,子集样本越多,权重越大。
    ∑v=1V∣Dv∣∣D∣Ent(Dv)\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
  4. 相减即增益用分裂前的混乱减去分裂后的混乱,得到的就是这次分裂带来的“秩序增量”。
    Gain(D,a)Gain(D,a)

第一招:预剪枝——生长中提前喊停

保守园丁的方法很直接:树苗长到齐腰高,就拿来一把木尺横在头顶,超过格线的枝杈一律不留。果树的生长方向被提前锁死,树冠想失控都难。这就是预剪枝:在决策树分裂之前先问一句“这次分裂值不值得”,不值得就当场停止。

工程上预剪枝落地为几个最常见超参数:深度限制(max_depth),树最多长几层;样本阈值(min_samples_leaf),叶子节点样本数低于这个值就不允许再切;还有分裂增益阈值——信息增益提升不够大就放弃。只要任一条件满足,这个节点就原地变成叶子。如此操作,建树过程直接把所有“多余的枝杈”挡在门外,训练速度飞快。深度一旦被限制,整棵树的叶子数量就有了一个硬上界:

但保守园丁有个名声不好的副作用:欠拟合。有时候最有价值的分裂在第 4 层才出现——比如某个特征组合对甜苹果的区分能力极强,可预剪枝在第 3 层就一刀切断了,树永远没机会发现这个宝藏规律。预剪枝就是这样:它快、它省、它不容易过拟合,但可能因为“管得太早”而错过真正重要的分支。

Nleaf≤2dmax\displaystyle N_{leaf} \le 2^{d_{max}}
叶子节点的数量上限是 2 的“最大深度”次方。限制深度 3,叶子最多 8 片;限制深度 5,最多 32 片——这个上界随深度指数爆炸。
  1. 叶子数量上界$N_{leaf}$ 是整棵树的叶子节点总数,每次分裂一个节点就“生出”两个新节点,满二叉树的叶子数上限由此决定。
    NleafN_{leaf}
  2. 深度上限$d_{max}$ 是预剪枝设置的最大深度。深度每加 1,潜在的叶子数量翻一倍,所以限制深度是控制树规模最粗暴也最有效的手段。
    2dmax2^{d_{max}}

第二招:后剪枝——长满后自底向上修剪

与保守园丁相反,豪放园丁信奉“先让它长,长完了再收拾”。他让果树撒欢长满一个夏天,等枝杈铺天盖地时,才搬来梯子,从最底层的枝条开始,一根一根检查:这根光长叶不结果?剪掉。那根挡了旁边结果枝的阳光?也剪掉。这对应后剪枝:先不设限制,训练出一棵枝繁叶茂的满树,再自底向上逐个考察内部节点。

考察的方式很严谨,叫作子树替换。对每个非叶子节点,考虑把它下面那一整棵子树换成一片叶子——相当于把一大团枝条砍到只剩一个“结论”。然后关键问题来了:换完之后模型变好还是变坏?不能拍脑袋,要靠精度比较。如果替换后模型在验证集上的精度不下降甚至提升,说明这段子树本来就是在死记噪声,剪掉它!剪枝条件写成数学语言就是:

后剪枝的底气来自“见过全套再决定砍谁”,所以它的泛化能力通常比预剪枝更扎实——毕竟每一剪刀都有验证集实测背书。代价同样明显:先要花费大量算力把满树长出来,再自底向上对每个节点做一遍精度评估,计算量大得不是一星半点。但慢工出细活,在许多对精度要求苛刻的工业场景里,这份“细活”是值得的。

Acc(T′)≥Acc(T)\displaystyle Acc(T')\ge Acc(T)
剪掉后的树 $T'$ 在验证集上的精度不低于剪之前的 $T$,就执行这次修剪;否则保留原子树。每一次决策都用“没见过的数据”说话。
  1. 剪后精度$Acc(T')$ 是子树被替换成叶子后,新树在验证集上的分类准确率。
    Acc(T′)Acc(T')
  2. 剪前精度$Acc(T)$ 是保留整棵完整子树时,原树在验证集上的准确率。注意这里必须是验证集,而不是训练集。
    Acc(T)Acc(T)
  3. 比较裁定若剪后精度更高或持平,说明这段子树是“虚胖”,果断剪掉;若剪后明显变差,说明这段节点确实学到了有用规律,必须保留。
    ≥\ge

验证集这把尺子——剪枝决策的依据

两位园丁剪枝时手里都攥着一把卷尺:枝条多粗算合格、多长算超标,全凭尺子说话。后剪枝手里的“尺子”,就是验证集——一份模型在训练过程中从未偷看过的数据。没有这把尺子,剪枝就成了“自己考自己”:树在训练集上答过的题,再拿同样的题问它,它当然说“我都会”,根本测不出真实水平。

标准的做法是把一份完整数据切成三块:训练集负责让树学习,验证集负责在剪枝时当裁判,测试集留到最后做终考。典型的划分比例是:

有了验证集这把尺子,后剪枝的每个决策都变得“有理有据”:替换子树前先到验证集上跑一次,精度不降就剪。预剪枝虽然不一定每次都显式用验证集(许多实现直接用深度、样本数等经验规则),但更精细的做法也会在分裂前用验证集校验本次分裂是否有收益。没有尺子的园丁只能凭感觉瞎剪,有了尺子,每一剪刀都踩在数据说话的节奏上。

D=Dtrain∪Dval∪Dtest,∣Dtrain∣:∣Dval∣:∣Dtest∣≈8:1:1\displaystyle D = D_{train}\cup D_{val}\cup D_{test},\quad |D_{train}|:|D_{val}|:|D_{test}| \approx 8:1:1
数据全集被拆成训练、验证、测试三块,大致按 8:1:1 分配。验证集只在“剪不剪”的关键时刻出题,测试集只在训练完全结束后才碰一次。
  1. 数据全集$D$ 是最初拿到的全部标注数据,在动手建模之前就应该规划好怎么切分。
    DD
  2. 三集并集$D_{train}\cup D_{val}\cup D_{test}$ 表示训练集、验证集、测试集三者的并集恰好是全集,三者互不重叠。
    Dtrain∪Dval∪DtestD_{train}\cup D_{val}\cup D_{test}
  3. 近似比例$\approx 8:1:1$ 表示比例近似为八比一比一,具体比例可根据数据总量微调,数据少时验证集可以适当减少。
    8:1:18:1:1

两招如何取舍——预剪枝与后剪枝的对比选型

果园里两位园丁各有拥趸。大果园老板请保守园丁,因为他承包了几万亩果树,根本雇不起工人一棵棵上梯子精剪;精品果园老板请豪放园丁,因为他要的是“每颗果子都卖出天价”,多花点人力完全值得。决策树的选型同理,核心看三笔账。

第一笔是时间开销。预剪枝在建树过程中顺手就把多余的枝条掐了,训练时间短、内存占用小;后剪枝要先长出满树再逐节点评估,训练时间通常是前者的数倍甚至数十倍。第二笔是泛化对比。后剪枝因为每一步都有验证集实测背书,对哪些该剪、哪些该留判断得更准,泛化能力通常优于预剪枝;而预剪枝会因“提前停手”错过关键分裂,有欠拟合风险。第三笔是场景选型,可以记住这个口诀:

1. 数据量大、特征多、训练时间受约束(比如广告点击率预估的树模型):选预剪枝,它快、省、能控制线上推理延迟;

2. 数据量适中、追求极致的模型精度(比如信贷风控、医疗诊断):选后剪枝,它慢但稳,能榨干每一分泛化能力;

3. 两者并不互斥:实践中可以先预剪枝粗剪一轮控制规模,再后剪枝精修一轮,就像园丁先用大剪刀去枝,再用小剪刀修型。

回到果园,无论请哪位园丁,目的都一样:让树冠通透、让每一根枝条都结出实实在在的果子。预剪枝与后剪枝,一个在生长中喊停,一个在长成后修剪,殊途同归——用“给模型做减法”的方式,守住机器学习最珍贵的泛化能力。

AI 应用场景

广告点击率预估中的预剪枝

阶段:模型调优与推理部署

解决的问题:点击率预估常用 LightGBM、XGBoost 等树模型,特征稀疏且数据量高达千万级。若训练时不设深度限制,单棵树会深不见底,训练时间爆炸,线上打分延迟更是难以接受。预剪枝通过限制 single 树深度和叶子样本数,让训练和推理都轻装上阵。

具体案例:某广告平台将 LightGBM 的 max_depth 从无限改为 8、min_child_samples 设为 20 后,训练耗时下降约四成,AUC 几乎不变,线上单次打分耗时的 p99 明显回落,广告竞价系统得以在预算内平稳运行。

银行信贷风控中的后剪枝

阶段:模型验证与防过拟合

解决的问题:信贷坏样本占比往往极低,决策树极易把个别坏账客户的偶然特征当成“铁律”。后剪枝用验证集实测每个节点是否值得保留,把只对训练集灵验的噪声分支砍掉,让审批规则更稳健、更可解释。

具体案例:某消费金融公司用 CART 构建信用评分规则引擎,通过代价复杂度剪枝(CCP)对满树做后剪枝,砍掉约四成叶子节点后,模型在验证集上的 AUC 从 0.78 提升到 0.82,且留下的规则树肉眼可读,方便向监管解释。

医疗辅助诊断中的可解释剪枝

阶段:可解释 AI 与临床部署

解决的问题:医生需要知道模型“为什么这么判断”,深不可测的决策树根本无法向医生交代。预剪枝把树限制在 3 到 5 层以内,再辅以后剪枝细修,得到的规则简洁清晰,医生才敢把它当作参考。

具体案例:某糖尿病风险评估项目将决策树最大深度限制为 3,患者只需回答血糖、BMI、年龄三个问题即可得到风险分级,准确率相比满树仅下降不到两个百分点,但医生的使用意愿显著提升,因为每一条判断依据都一目了然。

Python 演示

python39 行
import numpy as npfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import accuracy_score data = load_breast_cancer()X, y = data.data, data.targetX_train, X_test, y_train, y_test = train_test_split(    X, y, test_size=0.2, random_state=42)X_train, X_val, y_train, y_val = train_test_split(    X_train, y_train, test_size=0.25, random_state=42) full_tree = DecisionTreeClassifier(random_state=42)full_tree.fit(X_train, y_train)acc_full = accuracy_score(y_val, full_tree.predict(X_val))print("满树 验证集精度: {:.3f}".format(acc_full)) pre_tree = DecisionTreeClassifier(max_depth=3, min_samples_leaf=10, random_state=42)pre_tree.fit(X_train, y_train)acc_pre = accuracy_score(y_val, pre_tree.predict(X_val))print("预剪枝(深度3) 验证集精度: {:.3f}".format(acc_pre)) prune_path = full_tree.cost_complexity_pruning_path(X_train, y_train)alphas = np.linspace(0, prune_path.ccp_alphas.max(), 50)best_acc, best_alpha, post_tree = 0.0, 0.0, Nonefor alpha in alphas:    tree = DecisionTreeClassifier(ccp_alpha=alpha, random_state=42)    tree.fit(X_train, y_train)    acc = accuracy_score(y_val, tree.predict(X_val))    if acc > best_acc:        best_acc, best_alpha, post_tree = acc, alpha, tree acc_test_full = accuracy_score(y_test, full_tree.predict(X_test))acc_test_pre = accuracy_score(y_test, pre_tree.predict(X_test))acc_test_post = accuracy_score(y_test, post_tree.predict(X_test))print("后剪枝最优 alpha: {:.3f} 验证集精度: {:.3f}".format(best_alpha, best_acc))print("测试集精度 满树/预剪枝/后剪枝: {:.3f} / {:.3f} / {:.3f}".format(    acc_test_full, acc_test_pre, acc_test_post))
目的:一份对照实验,演示“满树过拟合 → 预剪枝压规模 → 后剪枝精修”的全过程,用验证集裁定剪枝力度,最后用测试集验收泛化能力。
  1. X_train, X_val, y_train, y_val = train_test_split(...)把训练集再拆出一块当验证集,让剪枝决策“用没见过的数据”来裁断
  2. full_tree = DecisionTreeClassifier(random_state=42)不设任何限制,树使劲长到每个叶子只剩同类样本,这是过拟合的温床
  3. pre_tree = DecisionTreeClassifier(max_depth=3, min_samples_leaf=10, ...)预剪枝的两个经典参数:限制最大深度和叶子最少样本数
  4. full_tree.cost_complexity_pruning_path(X_train, y_train)sklearn 内置的后剪枝路径计算,返回一系列剪枝强度候选值 alpha
  5. DecisionTreeClassifier(ccp_alpha=alpha, ...)代价复杂度剪枝,alpha 越大剪得越狠,越小越接近原满树
  6. if acc > best_acc:在验证集上一轮一轮比较,找出泛化最好的剪枝强度,这正是“验证集当尺子”的工程落地
  7. accuracy_score(y_test, post_tree.predict(X_test))全部调优结束后才碰测试集,模拟真实场景的期末终考

常见误区

误区预剪枝训练速度快、代码只要设两个参数,肯定比后剪枝好用,以后所有决策树都默认预剪枝。

正解预剪枝最大的风险是“管得太早”。它可能在第 3 层就把树拦腰截断,而真正有价值的分裂恰好出现在第 4 层,导致欠拟合。后剪枝虽然慢,但每一步都拿验证集实测,通常泛化更稳。正确做法是看场景:数据量大、延迟敏感选预剪枝;追求精度、算力允许选后剪枝。

为何常见:因为预剪枝的收益(训练快、代码简单)在开发期立竿见影,而欠拟合的代价要等到上线换新数据时才暴露,新手很难把这两件事联系起来。

误区决策树在训练集上的精度会随着深度增加一路涨到 100%,所以调参时把 `max_depth` 放得越大越好。

正解训练集精度随深度单调上升是“背答案”的假象。深度一大,叶子节点越来越细,树把噪声也背得滚瓜烂熟,验证集精度先升后降,典型的过拟合曲线。限制深度时必须配合验证集观察“拐点”,而不是拍脑袋选一个很大的数。

为何常见:训练集准确率这个数字太直观了,人天然喜欢“越高越厉害”。看不到验证集表现时,深度越大越强的错觉就很容易滋生。

误区训练集是现成的,数据本来就少,再切一块验证集多浪费,直接拿训练集精度比较剪枝前后不就行了?

正解训练集精度会随树变复杂单调上升(或不变),用它判断“剪掉后变好还是变差”永远得不到剪枝的结论——树在训练集上当然不舍得剪掉任何一根枝条。后剪枝必须用验证集:只有在没见过的数据上精度不降,才说明这段子树真是“虚胖”。

为何常见:人容易高估“自己考自己”的参考价值,总觉得模型对自己学过的内容足够诚实,忽略了考试和实战的根本区别。

误区随机森林、梯度提升树有很多棵树求平均,单棵树过拟合无所谓,剪枝参数完全不用管。

正解集成模型的每一棵基树同样会过拟合,带病的小树多了照样拖垮整体。随机森林的 max_depth、min_samples_leaf 本质就是预剪枝;XGBoost/LightGBM 的 max_depth、min_child_weight 以及不同程度的正则项,也都有剪枝思想的身影。剪枝作为一种“给模型做减法”的思路,是所有树模型调优的共同底座。

为何常见:“三个臭皮匠顶个诸葛亮”的直觉让人以为集成能自动抹平一切过拟合,忽略了每棵树的质量才是集成的下限。

面试题

Q1. 预剪枝的核心思想是什么?

单选题 · easy

  • A.树长成后再剪掉冗余分支
  • B.树生长中提前停止分裂← 正确答案
  • C.用测试集重新训练一棵树
  • D.把训练集复制多份来扩充

答案:B。预剪枝的“预”字就体现在生长过程中提前终止分裂,属于“先发制人”的修剪策略。A 描述的是后剪枝;C、D 与剪枝无关。就像保守园丁在树苗期就限制高度,而不是等树长大了再动手。

Q2. 后剪枝通常比预剪枝泛化更好,最主要的原因是什么?

单选题 · easy

  • A.训练时使用了更多数据
  • B.用验证集实测决定剪不剪← 正确答案
  • C.剪枝时运行速度更快
  • D.不需要预先划分数据集

答案:B。后剪枝的每一次“剪不剪”决策都在验证集上实际跑过,用没见过的数据说话,这保证剪掉的都是确认无效的分支。A、C 与泛化能力无关,D 恰恰相反,后剪枝必须有验证集。就像豪放园丁每剪一根枝条前都要拿卷尺量一量。

Q3. 下列哪一项是典型的预剪枝参数?

单选题 · mid

  • A.代价复杂度参数
  • B.树的最大深度← 正确答案
  • C.学习率超参数
  • D.弱学习器数量

答案:B。max_depth(最大深度)直接限制树的生长层数,是最典型的预剪枝手段。A 的代价复杂度参数对应后剪枝;C、D 分别属于梯度提升和集成框架的参数,不属于单棵树的剪枝范畴。

Q4. 后剪枝过程中,将子树替换为叶节点的前提条件是什么?

单选题 · mid

  • A.训练集精度保持不下降
  • B.验证集精度保持不下降← 正确答案
  • C.树的深度必须减半才剪
  • D.叶子节点数量必须不变化

答案:B。后剪枝的裁定标准是“剪后验证集精度不低于剪前”。若满足则说明这段子树在真实分布中毫无贡献,剪掉还能降低复杂度。A 是典型误区,训练集精度永远支持不剪;C、D 是人为添加的无关限制。

Q5. 预剪枝若过早停止分裂,最可能带来什么问题?

单选题 · mid

  • A.在训练集上过拟合更严重
  • B.在训练集上欠拟合更明显← 正确答案
  • C.训练时间成倍地增加
  • D.模型内存占用急剧变大

答案:B。预剪枝管得太早,会错过后续才有区分力的关键分裂,导致模型对训练数据本身的规律都没学够,即欠拟合。A 是过度生长的问题,C、D 与预剪枝省时省内存的特性正好相反。

Q6. 验证集在剪枝决策中扮演的角色,最像下列哪一项?

单选题 · mid

  • A.考试出卷老师
  • B.考前的模拟试卷← 正确答案
  • C.课堂上的例题
  • D.复习用的错题本

答案:B。验证集是“考前的模拟卷”——模型在学习期间没见过这套题,用它来模拟真实考试、检验剪枝效果。出卷老师是人工设定标准的人,例题和错题本都是模型已经见过的内容,无法测出真实水平。

Q7. 以下属于后剪枝特点的有哪些?

多选题 · hard

  • A.自底向上逐个考察节点← 正确答案
  • B.需要额外的验证集数据← 正确答案
  • C.计算开销通常比预剪枝大← 正确答案
  • D.剪完之后叶子数量必定更少

答案:ABC。后剪枝自底向上考察每个内部节点,用验证集裁定,且要先长满树再逐点评估,时间和算力开销确实更大。D 太绝对——如果所有子树替换后验证集精度都下降,一片叶子都不会被剪掉。

Q8. 下列哪些手段可以有效缓解决策树的过拟合?

多选题 · hard

  • A.限制树的生长深度← 正确答案
  • B.提高叶子最少样本数← 正确答案
  • C.留验证集做后剪枝← 正确答案
  • D.增加树的特征数量

答案:ABC。限制深度、调高叶子样本阈值都是预剪枝,用验证集做后剪枝是精度导向的修剪,三者都能压缩树的复杂度、遏制噪声学习。D 增加特征数量通常会让树更长更复杂,反而加剧过拟合。

Q9. 当数据量很大且训练时间受严格约束时,优先选择哪种剪枝方式?

单选题 · mid

  • A.后剪枝方法
  • B.预剪枝方法← 正确答案
  • C.不剪枝方法
  • D.随机剪枝方法

答案:B。预剪枝在建树过程中直接掐掉多余分支,不需要先长满树、也不需要逐节点验证,训练开销最小,最契合大数据量、时间受限的场景。后剪枝虽准但过慢,不剪枝则过拟合风险高,随机剪枝则完全不可控。

Q10. 关于预剪枝与后剪枝的对比,下列说法正确的有哪些?

多选题 · hard

  • A.预剪枝实现简单且训练更快← 正确答案
  • B.后剪枝泛化能力通常更强← 正确答案
  • C.两者本质上都在抑制过拟合← 正确答案
  • D.后剪枝在所有场景都优于预剪枝

答案:ABC。预剪枝简单快速、后剪枝精度更高、两者共同目标都是做减法抑制过拟合,这些说法都对。D 过于绝对,数据量巨大、延迟敏感的在线场景中,预剪枝反而更合适。选型要看场景,而不是无脑选后剪枝。