想象这样一个夜晚:朋友说“我心里想了一个动物,你猜是什么?”候选只有六个——狗、猫、虎、鲸、企鹅、鹦鹉。你一脸茫然,六个答案完全平等。这时你问:“它是哺乳动物吗?”答案是“是”,候选瞬间收窄到四个;再问“它生活在海里吗?”,范围又缩小一半。你会发现,那些“不管答案是什么,都能让可能性大幅缩小的好问题”,正是整个决策树算法最核心的追求。这个猜谜游戏,就是理解信息增益的最佳入口。本文用这个游戏贯穿始终,从熵的定义讲起,带你走完 ID3、C4.5、CART 三大经典决策树的分裂准则,理解剪枝和工程实践中的关键取舍。
信息增益是决策树特征选择的“裁判尺”。掌握它,你就能读懂几乎所有树模型(ID3/C4.5/CART/随机森林)的分裂逻辑,这是机器学习面试与实战调参绕不开的基石。
目录
可视化演示
\u901a\u8fc7\u4e09\u9636\u6bb5\u4ea4\u4e92\u5c55\u793a\u71b5\u4e0e\u4fe1\u606f\u589e\u76ca\u8ba1\u7b97\u3001ID3\u51b3\u7b56\u6811\u5206\u88c2\u8fc7\u7a0b\u4e0e\u526a\u679d\u4f18\u5316\u7b56\u7565\u3002
本节配有交互动效(进入视口后自动加载,约 3KB)。
\u71b5\u4e0e\u4fe1\u606f\u589e\u76ca \u71b5H(D) IG=H-H\u2032 IG=H(D)-H(D|A) \u4fe1\u606f\u589e\u76ca\u8861\u91cf\u4e0d\u786e\u5b9a\u6027\u51cf\u5c11
信息熵基础——不确定性的度量
想象一下深夜的客厅,朋友微笑着说“我想到一个动物,你猜是什么?”候选只有六个:狗、猫、虎、鲸、企鹅、鹦鹉。你现在一头雾水,六个候选完全平等,这种“完全没头绪”的状态,正是信息论要度量的东西。熵(Entropy)就是给“没头绪”打分的一把尺子:候选越多、分布越平均,分数越高;你越接近答案,分数越低。如果朋友悄悄告诉你“我更喜欢养狗”,那么“猜狗”的胜算变大,你的不确定性也随之下降——熵衡量的正是这种“在已知概率分布下的平均惊讶程度”。
熵的正式定义来自香农:如果样本集合 S 里第 k 类样本所占的比例为 p_k,那么这个集合的熵是:
回到客厅:朋友还没开口,你的熵是 2.585 比特。你问“它是哺乳动物吗?”——这个问题的好坏,就要看它能把熵砍掉多少。这正是下一节的主角:信息增益。熵的两个极端值得记住:全部样本同一类时熵为 0(你完全确定);各类等概率时熵最大(你完全没底)。决策树的一切努力,都围绕“把高熵的节点劈成低熵的子节点”展开。
- 求和符号 Σ把所有类别依次遍历一遍,把每一项相加。比如二分类时只有 k=1 和 k=2 两项。
- p_k 类比例第 k 类样本占集合总数的比例。所有 p_k 之和等于 1,这是概率的归一化。
- log₂ p_k 信息量以 2 为底的对数把“惊讶程度”换算成比特;p_k 越小,−log₂p_k 越大,越稀奇的类别携带的信息越多。
- 整体求期望用概率 p_k 加权平均所有类别的信息量,得到平均不确定性。
信息增益——好问题的评选标准
“它是哺乳动物吗?”朋友说是,候选立刻从六个收窄到狗、猫、虎、鲸四个;说不是,候选变成企鹅、鹦鹉两个。无论哪种答案,你的“没头绪”都变少了。一个真正的好问题,是那种“不管答案是什么,都能大幅降低不确定性”的问题。信息增益(Information Gain)度量的正是:问完这个问题后,熵减少了多少。它是决策树选择特征时最重要的“裁判尺”。
信息增益需要先引入条件熵的概念。假设特征 A 把样本集 S 按取值 v 分成若干子集 S_v,“已知 A 的取值后”剩余的平均熵就是条件熵,它是各子集熵的加权平均,权重是子集大小占比:
信息增益就是父节点熵与条件熵的差:
回到猜谜例子:六个候选并非均匀(猫科红球 3 个、海洋绿球 1 个、鸟类蓝球 2 个),原始熵约为 1.459 比特。问“是哺乳动物吗?”后,左边四个(狗猫虎鲸)的熵约 0.811,右边两个(企鹅鹦鹉)完全纯净、熵为 0,条件熵 = (4/6)×0.811 ≈ 0.541,于是增益高达 0.918 比特。而“会飞吗?”只把鹦鹉单独挑出来,其余五个仍是混杂的,条件熵约 0.809,增益仅有 0.650 比特。两个问题一对比,信息增益清晰地告诉你:第一个问题更值得问。
现在你有了评判标准——下一次朋友说“再让你猜一个”,你不会再随口乱问,而是默默比较几个候选问题的信息增益,挑那个“稳赚不赔”的。计算机里的 ID3 算法,干的就是这件事:把信息增益当作唯一依据,在每个节点选择增益最大的特征来分裂。
- V(A) 特征取值集合特征 A 共有多少种取值,就会把数据集切成多少个子集。
- |S_v|/|S| 加权系数子集越大,在平均中占的权重越高,因为这代表“大部分样本会走这条路”。
- H(S_v) 子集熵每个子集内部的纯度。纯子集熵为 0,混杂子集熵大。
- 增益差父节点熵减去条件熵,就是这个问题帮你消除的不确定性,单位同样是比特。
ID3算法——贪心提问的策略
如果猜谜游戏要玩很多轮,策略就变得重要:是先把大类分开,还是先深挖细节?ID3 的答案是简单而坚定的贪心——每一轮都选择当前信息增益最大的特征来提问,绝不回头。它由 Quinlan 于 1986 年提出,是最早也最经典的决策树学习算法。所谓贪心,就是只看眼下最优,不做长远规划;这像个聪明的猜谜玩家,永远选“下一问收益最大”的问题,而不去纠结之后怎么样。
在每个节点,ID3 从尚未用过的特征集合中挑出使增益最大的特征 a*:
选好后,按特征 a 的每个取值把数据集切分成子集,每个子集递归地重复同样过程。递归停止条件有三个:一是子集内样本全部属于同一类别(纯度 100%);二是特征已经用完,无法继续分裂;三是子集为空或样本数不足。停止后,该节点成为叶子节点,通常用子集中占比最多的类别作为预测结果。ID3 天然只支持离散特征,它生成的树也不一定是二叉树——一个特征有四个取值,就分出四个叉,和多选题的直觉完全对应。
ID3 像一个聪明但有点“近视”的猜谜玩家:它永远只关心下一问能获得多少信息,从不考虑“这个问题会不会把局面引向死角”。大多数时候它表现不错,但有个致命毛病很快就暴露了——它特别偏爱取值特别多的特征。如果数据里有一个“编号”特征,每个样本一个值,ID3 会毫不犹豫地选择它。这个缺陷,将引出下一节的主角。
- argmax 含义从候选集中找出让括号里表达式最大的那个特征。argmax 返回的是“自变量”,而 max 返回的是“最大值”。
- A_remaining 剩余特征当前路径上还没有被问过的特征集合。已经用过的特征不会再被问第二次,这是 ID3 的一个硬性约束。
- 递归分裂选特征 → 切子集 → 对每个子集再选特征,直到触发停止条件,形成一棵树。
信息增益率——C4.5的修正之道
假设朋友允许你问这样的问题:“你心里想的是'狗'吗?”——答案只有两种,但连问六个这样的问题,每次都能把候选缩小到一个。糟糕的是,如果训练数据里有一个“用户 ID”这样的特征,每个样本独立取值,那么按 ID 分裂后每个子集只有一个样本,条件熵直接降到 0,信息增益取到最大值!ID3 会毫不犹豫地选它。然而这棵树除了背答案,什么规律都没学到。这就是著名的“取值越多、增益越大”的偏好缺陷。
C4.5 算法的对策是引入“分裂信息”(Split Information),先给特征 A 的取值分布本身算一个熵:
然后用信息增益除以分裂信息,得到信息增益率:
观察公式:特征取值越多,每个子集的样本越少、分布越散,SplitInfo 就越大,增益率被压低。ID 号这类“百发百中”的刁钻问题,虽然 Gain 满分,但 SplitInfo 也跟着拉满,增益率反而平平。C4.5 并没有直接选增益率最大的特征,而是用了一个启发式:先挑出信息增益高于平均水平的特征,再在其中选增益率最高的——既保住好特征,又避开取值怪癖。
猜谜游戏里,爱问“你是水星吗?”的玩家第一问就能把候选砍到零,但所有人都知道这很赖皮。C4.5 的增益率就像一条新规则——提问前先审查“这个问题本身有没有把候选切得太碎”,让游戏回归公平。这也是 C4.5 能取代 ID3 成为一代经典的核心原因。
- 分裂信息定义它和熵的公式一模一样,只是把“类别比例”换成了“特征取值比例”,衡量的是特征本身分布得有多散。
- 除法修正Gain 除以 SplitInfo,让“取值多”的特征被自动打折,取值少的特征反而不会吃亏。
- 与 ID 特征ID 特征有 N 个取值、每个子集 1 个样本,SplitInfo = log₂N,增益率被压缩到极小。
CART与基尼——另一条路线
如果说熵是“概率均匀程度的完美量尺”,那么基尼系数(Gini Index)就是它更务实、更便宜的表亲。基尼系数的直觉非常可爱:在集合 S 里随机抽一个样本,再按照当前类别的分布随机猜一个类别,你猜错的概率有多大?这个“随机猜错率”就是基尼系数:
当集合很纯时,某个 p_k = 1、其余为 0,Σp_k² = 1,基尼系数为 0;当各类等概率时,Σp_k² = 1/K,基尼系数 = 1 − 1/K 达到最大值。它和熵一样在“纯→0、均匀→大”之间变化,但不需要算对数——平方运算在计算机里比对数快得多,这是它被大规模工程选中的现实理由。
CART(Classification And Regression Tree)选择了基尼系数作为分类树的特征选择准则。CART 的另一个显著特点是它只生成二叉树:即使特征有多个取值,也通过“是/否”的方式切分,例如“温度 ≤ 30°C 吗?”。这样,一个多值特征可以被多次使用,每次切出不同的阈值。这种二分结构让 CART 既能做分类(叶子输出类别),又能做回归(叶子输出均值),还方便 sklearn 等库实现统一接口,因此成为目前应用最广的树模型。
同样的猜谜游戏,熵派心算对数,基尼派只用加减乘除——结论往往差不多,但后者在千万行数据上省下不少时间。至此,分裂准则的三大天王——增益、增益率、基尼系数——全部登场,它们分别把 ID3、C4.5、CART 推上了历史舞台。
- p_k² 随机同类概率随机抽两个样本恰好都是第 k 类的概率。所有类别求和后就是“抽到同类”的总概率。
- 1 减去总和用 1 减去“抽到同类”概率,剩下的就是“抽到不同类”即随机猜错的概率。
- 与熵对比两者都从 0(纯)单调增长到最大值(均匀),基尼最大值为 1−1/K,熵最大值为 log₂K,选特征时排序通常一致。
剪枝策略——给树做减法
一个“记忆力超群”的猜谜玩家,可能把 100 个训练样本的答案全部背下来:训练过的题目秒答,来个新动物就彻底懵了。决策树也有同样的毛病——如果放任它一直分裂,树会膨胀到每个叶子只有一个样本,训练集准确率 100%,测试集却惨不忍睹。这就是过拟合(Overfitting):模型记住了数据的噪声,而不是规律。树越深、叶子越多,“背答案”的倾向就越严重。
剪枝(Pruning)就是给树做减法。CART 后剪枝的经典做法是引入带复杂度惩罚的目标函数:
其中 R(T) 是训练误差(或基尼加权和),|T| 是叶子节点数,α 是复杂度惩罚系数。α 越大,树越受压减枝;通过交叉验证选一个合适的 α,就能在“拟合”和“简洁”之间找到平衡。实际工程中常见的预剪枝手段包括限制最大深度、设置最小叶子样本数等,它们在建树过程中随时喊停,比后剪枝更快但可能“短视”。
真正的高手猜谜,靠的是记住“鲸鱼是哺乳动物、企鹅是鸟类”这类规律,而不是背下每一局的答案。剪枝就是逼着决策树丢掉那些只对训练集有效的死记硬背,换回对新样本的泛化能力。需要强调的是,剪枝会在训练集上“降分”,但目的是在测试集上“提分”,理解这一点是权衡预剪枝与后剪枝的前提。
- R(T) 经验误差树在训练数据上的分类错误代价,反映模型对训练集的拟合程度。
- |T| 叶节点数叶子越多说明树越复杂,越容易死记硬背训练样本,需要付出更多代价。
- α 复杂度惩罚系数α 从 0 调到大,最优树会从“巨树”逐步被压到“单节点”,α 是平衡拟合与简洁的旋钮。
- 最小化目标在拟合与复杂度之间取折中,选择让 R_α(T) 最小的子树作为最终模型。
工程实践——从游戏到生产
当决策树从“六个动物的猜谜游戏”走进真实机器学习工程,会发现现实世界远比客厅残酷:特征有连续的(温度 25.3°C)、有缺失的(患者没做某项检查)、有成千上万维的(文本词频)。工程化使用决策树,必须在这几方面做足功课。
第一,连续特征的处理。C4.5 和 CART 都支持连续特征,做法是先把取值排序,再在相邻两值的中点枚举候选切分阈值,例如“温度 ≤ 26.1°C”:
其中 a_{≤θ} 是把连续特征按阈值 θ 二值化后得到的特征。排序后只需遍历 n−1 个候选点,复杂度为 O(n log n)。第二,缺失值与编码:样本缺失某特征时,常用做法是“把样本按比例分到各分支”或“分到最频繁分支”;sklearn 的 CART 实现会忽略缺失样本的分裂计算并在预测时归入样本多的一侧。分类特征需做离散编码,但要注意一个决策树经典悖论:独热编码(One-Hot)会把一个多值特征拆成多列,每一列都变回“是否”二分,反而削弱了该特征一次分裂多组的能力。
第三,单棵树的局限与集成。单棵决策树方差大、不稳定——训练数据稍微扰动,树结构可能面目全非。所以工程上很少直接用一棵树,而是把它当作弱学习器,放进随机森林(对特征和样本随机抽样再投票)或梯度提升树(GBDT,逐轮拟合残差)中。这也是“树模型 + 集成”成为表格数据上黄金组合的根本原因。
猜谜游戏的六个候选变成现实中的百万样本,但底层逻辑没变——每一层都用分裂准则挑选“能把不确定性砍得最狠的问题”,只是多加了连续切分、缺失处理和集成这些趁手的工具。理解了信息增益这条主线,你会发现随机森林和 GBDT 也不过是“很多棵会用信息增益提问的树”在集体决策。
- 阈值二值化连续特征用“≤θ“和”>θ”把区间劈成两半,θ 遍历相邻样本的中值。
- 最优阈值搜索在所有候选阈值中找使分裂准则最优的那个,本质是一维搜索问题。
AI 应用场景
银行信贷审批中的可解释风控
阶段:特征选择与监督学习建模
解决的问题:传统人工审核依赖经验,规则库僵硬且难以解释;AI 决策树通过信息增益自动挑选“月收入”“负债率”“历史逾期次数”等区分度最高的特征,审批结论透明可复现,满足金融合规要求。
具体案例:某消费金融公司用 CART 树做审批辅助,模型先按“负债率 ≤ 0.4”分裂,再按“近 3 个月逾期次数”分裂。客户经理能直接向客户解释拒绝原因,既合规又高效,坏账率比纯规则审下降 18%。
急诊分诊中的诊断决策树
阶段:特征选择与辅助决策
解决的问题:急诊资源有限,需要在最短时间内判断患者风险等级。信息增益帮助医生筛选出最有判别力的检查指标,避免对每个病人都做全套检查。
具体案例:某医院急诊科用决策树对胸痛患者分级,根节点选择“心电图 ST 段抬高”(信息增益最高的特征),第二层是“肌钙蛋白水平”,几层之后就能划入高危/中危/低危通道,平均分诊时间缩短 40%。
电商用户流失预警
阶段:特征重要性分析与预测建模
解决的问题:海量用户行为特征中,哪些最能预示流失?信息增益排序可直接作为特征重要性的第一手参考,指导运营团队聚焦关键指标。
具体案例:电商团队用梯度提升树(GBDT)预测 30 日复购概率,特征重要性 Top3 为“最近一次登录距今天数”“优惠券使用间隔”“浏览深度”。据此制定召回策略,营销 ROI 提升 35%。
Python 演示
import mathfrom collections import Counter def entropy(labels): total = len(labels) if total == 0: return 0.0 prob = [c / total for c in Counter(labels).values()] return -sum(p * math.log2(p) for p in prob) def info_gain(data, labels, feat_idx): gain = entropy(labels) n = len(data) for value in set(row[feat_idx] for row in data): sub = [labels[i] for i, row in enumerate(data) if row[feat_idx] == value] gain -= (len(sub) / n) * entropy(sub) return gain def id3(data, labels, feat_names, used=None): if used is None: used = set() if len(set(labels)) == 1: return labels[0] if len(used) == len(feat_names): return Counter(labels).most_common(1)[0][0] best_idx = -1 best_gain = -1.0 for j in range(len(feat_names)): if j in used: continue g = info_gain(data, labels, j) if g > best_gain: best_gain = g best_idx = j used.add(best_idx) tree = {feat_names[best_idx]: {}} for value in set(row[best_idx] for row in data): sub_data = [row for row in data if row[best_idx] == value] sub_labels = [labels[i] for i, row in enumerate(data) if row[best_idx] == value] tree[feat_names[best_idx]][value] = id3(sub_data, sub_labels, feat_names, used.copy()) return tree def predict(tree, sample, feat_names): if not isinstance(tree, dict): return tree feature = next(iter(tree)) branch = tree[feature].get(sample[feat_names.index(feature)]) return branch if branch is not None else "No" data = [ ["Sunny", "Hot", "High", "Weak"], ["Sunny", "Hot", "High", "Strong"], ["Overcast", "Hot", "High", "Weak"], ["Rain", "Mild", "High", "Weak"], ["Rain", "Cool", "Normal", "Weak"], ["Rain", "Cool", "Normal", "Strong"], ["Overcast", "Cool", "Normal", "Strong"], ["Sunny", "Mild", "High", "Weak"], ["Sunny", "Cool", "Normal", "Weak"], ["Rain", "Mild", "Normal", "Weak"], ["Sunny", "Mild", "Normal", "Strong"], ["Overcast", "Mild", "High", "Strong"], ["Overcast", "Hot", "Normal", "Weak"], ["Rain", "Mild", "High", "Strong"]]labels = [ "No", "No", "Yes", "Yes", "Yes", "No", "Yes", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "No"]features = ["Outlook", "Temperature", "Humidity", "Wind"]tree = id3(data, labels, features)print(tree)test = ["Overcast", "Mild", "Normal", "Weak"]print("预测", test, "->", predict(tree, test, features))
prob = [c / total for c in Counter(labels).values()]用计数器统计每个类别的样本数,转成概率列表。-sum(p * math.log2(p) for p in prob)熵的公式一行实现:对每个概率取对数、乘以概率、取负求和。sub = [labels[i] for i, row in enumerate(data) if row[feat_idx] == value]按特征取值筛出对应子集的标签,这是条件熵计算的基础。gain -= (len(sub) / n) * entropy(sub)用加权子集熵去减父节点熵,逐步累出信息增益。if len(set(labels)) == 1所有样本同类别时直接返回该类别,这是递归出口之一。tree[feat_names[best_idx]][value] = id3(...)递归构造子树,字典的嵌套结构自然对应一棵树。used.copy()每个分支独立复制一份“已用特征集合”,防止兄弟分支之间互相污染。
常见误区
误区我在建模时打印每个特征的信息增益,增益最大的那列肯定预测能力最强,直接用它准没错。
正解信息增益偏向取值多的特征。像“用户 ID”这种唯一标识,条件熵为 0,增益几乎等于整体熵,但在新数据上毫无泛化价值,只会导致过拟合。工程上应结合增益率(C4.5 的做法)或限制特征取值数(分箱、卡方检验筛除)来判断特征重要性。就像猜谜时“你是第 7 个候选吗”这种问题虽然一次问中,但换一局就作废。
为何常见:增益计算只看当前训练集,ID 特征确实能让训练子集变纯,初学者常把“在训练集上有效”误当作“泛化有效”。
误区我的分类标签里 A 类占 99%、B 类占 1%,熵很小,说明数据很干净、很有序。
正解熵度量的是随机变量的不确定性或期望信息量,不是直观的“有序程度”。99%/1% 意味着“我几乎确定是 A”,所以熵很小;如果 A/B 各占 50%,你完全无法预测,熵最大。这和日常语言里的“熵=混乱度”是两回事——100 个红球和 100 个编号彩球,前者熵低,后者熵高。
为何常见:热力学“熵增”概念深入人心,信息论熵虽然是不同定义,但初学者容易混为一谈。
误区预剪枝在训练时就提前停,省时间又防过拟合,肯定比后剪枝更优。
正解预剪枝是“边建边看验证集”,可能因为当前分裂收益不大而提前停止,错过后面的好结构——这是短视问题;后剪枝让树长完整再自底向上修剪,精度通常更高但计算开销大。二者是时间与精度的权衡,没有绝对优劣。就像猜谜时,你可能因为前三问收益不大就放弃追问,结果错过第四问直接锁定的机会。
为何常见:预剪枝省事、直观,初学者容易误以为省时方案总更优,忽视了后剪枝在全局面上的优势。
误区基尼和熵都是衡量纯度,选出来的特征结果一样,随便用哪个都行。
正解两者单调相关但不等价:基尼最大值是 1−1/K,熵最大值是 log₂K,数值不同;在部分高维数据集上选出的特征排序可能有细微差异。CART 用基尼主要是省去对数计算,在大数据上更快。可以理解为两位裁判打分风格略有不同,但绝大多数情况排名接近。
为何常见:两者都从“纯→小、均匀→大”变化,不对比具体公式时很容易当成一回事。
误区训练集里有缺失值,sklearn 的决策树也没报错,说明它自动处理了所有缺失场景。
正解sklearn 的 CART 实现并不填充缺失值,而是在节点分裂时不使用含缺失的样本计算不纯度,预测时把缺失样本分到样本更多的一侧。这是一种简化策略,不代表“自动处理”所有缺失问题。真实工程中仍建议先做填充(均值/众数/模型预测),或使用像 XGBoost 那样学习缺失方向的算法。
为何常见:“默认能跑”的现象让不少人误以为库替你处理了一切,实际上模型只是做了最朴素的隐式处理。
面试题
Q1. 二分类数据中,正类占 50%、负类占 50%,该数据集的熵为多少比特?
- A.0
- B.1← 正确答案
- C.1.5
- D.2
答案:B。熵 = −(0.5×log₂0.5 + 0.5×log₂0.5) = 1 比特。等概率二分类的不确定性最大,熵恰好为 1,这是最经典的基准值。B 正确,A 是纯节点的熵,C 和 D 对应非等概率或更多类别的情形。
Q2. ID3 决策树选择分裂特征时采用的准则是什么?
- A.基尼指数最小
- B.信息增益最大← 正确答案
- C.增益率最大
- D.均方误差最小
答案:B。ID3 在每个节点选择信息增益最大的特征做分裂,B 正确。A 是 CART 的准则,C 是 C4.5 的准则,D 是回归树的准则。三个经典算法的分裂准则要记牢:ID3→增益、C4.5→增益率、CART→基尼。
Q3. 若一个特征使每个样本唯一取值(如 ID 号),则其信息增益等于什么?
- A.恒等于 0
- B.等于数据集熵← 正确答案
- C.趋近无穷大
- D.无法被计算
答案:B。ID 特征每个取值只对应一个样本,子集全部纯净、条件熵为 0,所以增益 = 父节点熵 − 0 = 父节点熵,B 正确。这正是 ID3 偏爱取值多特征的缺陷根源。A 错,C 错,D 错——增益可以计算,只是没泛化价值。
Q4. C4.5 相比 ID3,主要把分裂准则改成了什么?
- A.基尼指数最小
- B.信息增益率最大← 正确答案
- C.信息增益最大
- D.均方误差最小
答案:B。C4.5 用信息增益率代替信息增益,通过除以分裂信息来惩罚取值过多的特征,B 正确。A 是 CART 的做法,C 是 ID3 的做法,D 是回归树的损失函数。记忆口诀:增益找 ID3,增益率找 C4.5,基尼找 CART。
Q5. 关于信息增益,以下说法正确的是?
- A.等于子节点熵之和
- B.等于父熵减条件熵← 正确答案
- C.与父熵没有任何关系
- D.取值越大表示特征越差
答案:B。信息增益 = 父节点熵 − 条件熵(子节点加权熵和),B 正确。A 漏掉了加权和父熵,C 明显错误,D 说反了——增益越大通常表示特征划分能力越强,但要注意排除“取值多”的偏好陷阱。
Q6. 下面属于 CART 决策树特点的有哪些?
- A.采用基尼指数← 正确答案
- B.生成二叉树结构← 正确答案
- C.支持回归任务← 正确答案
- D.只用熵做准则
答案:ABC。CART 用基尼指数、只生成二叉树、既能分类也能回归,A、B、C 都正确。D 错误,CART 分类树用基尼而不是熵,回归树用均方误差。CART 的全称 Classification And Regression Tree 就暗示了分类回归双用。
Q7. 信息增益率中的分裂信息 SplitInfo 作用是什么?
- A.惩罚取值多的特征← 正确答案
- B.惩罚取值少的特征
- C.替代样本的数量
- D.提高分裂的速度
答案:A。SplitInfo 衡量特征取值的分布散度,取值越多、分布越均匀,SplitInfo 越大,增益率被压得越低,从而惩罚取值多的特征,A 正确。这化解了 ID3 对 ID 类特征的偏好,是 C4.5 的核心改进。
Q8. 关于预剪枝与后剪枝的区别,说法正确的是?
- A.前者边建树边停止← 正确答案
- B.前者建完树再修剪
- C.后者边建树边停止
- D.两者效果完全相同
答案:A。预剪枝在建树过程中验证“继续分裂是否有收益”,不行就提前停止,A 正确。B 和 C 正好说反了,后剪枝是先建完整棵树再自底向上修剪。D 错误,两者在精度和效率上各有取舍,一般后剪枝精度更高。
Q9. 缓解决策树过拟合的常见手段有哪些?
- A.限制最大深度← 正确答案
- B.设置最小叶节点样本← 正确答案
- C.后剪枝用验证集← 正确答案
- D.让特征取值更多
答案:ABC。限制最大深度、设置最小叶节点样本数、用验证集做后剪枝都能限制树复杂度,提升泛化能力,A、B、C 正确。D 会让特征切得更碎,反而加剧过拟合。可以把过拟合理解为“背答案”,以上手段都是逼模型少背答案、多学规律。
Q10. 当数据中存在 ID 类唯一特征时,ID3 选择它的原因与影响是?
- A.增益最大被优先选← 正确答案
- B.子集纯度高被选中← 正确答案
- C.泛化能力强被选中
- D.增益率可缓解问题← 正确答案
答案:ABD。ID 特征每个子集仅一个样本、纯度 100%,条件熵为 0,所以增益最大、被优先选中,A 和 B 正确。但这样建出的树只会背训练样本,泛化能力很差,C 错误。用增益率(C4.5)除以分裂信息可以压低这种特征的得分,D 正确。四者合起来,就是 ID3 偏好缺陷与 C4.5 修正的完整图景。