如果有人问我,机器学习所有算法里哪个最像人做决策,我会毫不犹豫说是决策树。这个机器学习系列笔记写到第八篇,前面聊过的线性回归、逻辑回归、支持向量机,无论推导多漂亮,在预测的那一刻基本都还是"一把尺子量到底";决策树则完全换了思路,它把判断拆成一连串的 if-else 问题:花瓣长度小于 2.45 就归为这一类,否则继续问花瓣宽度,一路问到叶子节点,最后给出结论。正因为它天然自带可解释性,直到今天,决策树依然活跃在风控、医疗辅助诊断、业务规则提取这些"既要准、又要能解释"的场景里。
想要真正吃透决策树,翻来覆去其实就两件事:划分选择和剪枝处理。划分选择决定了树往哪个方向长,剪枝处理决定了树应该长多深。无论你是期末复习、准备面试,还是想把决策树用在真实的收入预测、鸢尾花分类这类任务里,这两块不讲清楚,后面调参、集成全都会踩坑。这篇我就把划分选择和剪枝处理从头到尾拆开讲,最后再带代码跑一棵真实决策树,看看不剪枝和带约束的树到底差在哪。
1. 决策树凭什么不是"手动写 if-else"?
很多初学者会问一个问题:决策树本质不就是 if-else 的组合吗?我会写 if-else,为什么还要学它?这个疑问其实切中了要害,但答案也很简单:你确实能写出一堆 if-else,但你没法靠手工找到一个最优的 if-else 组合。
一个分类问题如果有几百个特征,每个特征又有多种取值,那么所有可能规则组合起来是指数级爆炸的。人肉枚举根本不可能,经验再丰富也只能排除几个明显没用的特征,剩下的依然只能靠模型去搜。决策树算法做的事情,本质上就是自动搜索一套 if-else 规则,并且让这套规则尽量小、尽量准。它把这个过程拆成了两个子问题:选择哪些特征、按什么顺序问;每个节点上按什么阈值切分。
1.1 一颗划分选择的问题为什么这么难
决策树的树形结构本身并不复杂:根节点代表全体样本,内部节点代表一次判断,叶子节点代表最终类别。从根到叶子的每一条路径,翻译过来就是一条"如果满足条件 A,再看条件 B,最后判定为类别 C"的规则。
但问题的关键不在结构,而在划分顺序。打个很生活化的比方,假如让你玩二三十个问题的猜物游戏,先问"是动物吗"和先问"它有毛吗",搜索效率完全不一样。同样的道理放在数据里:如果第一步就把数据切成几个比较纯的子集,后面的树会又矮又平;如果第一步胡乱切,树就会长得又深又乱,每个叶子只剩一两个样本,训练集上全对,测试集上一塌糊涂。所以,划分选择的本质是在每一步寻找让子节点类别纯度提升最快的特征。
通常的解法是贪心。决策树不追求全局最优,而是每到一个节点,就只看当前的数据,选出一个"当前最优"的特征,然后切开,再对每个子节点重复这个过程。这个过程听起来直接,但有一个前提:你需要一把尺子,能量化"切开前后纯度到底提升了多少"。这把尺子就是下一章要说的信息熵、信息增益、基尼指数这些概念。
1.2 为什么不能"每个特征都用一次"
还有一个常见误区是:既然特征都要考虑,干脆把每个特征都用于一次划分不就行了?这个想法听起来公平,实际行不通。
如果用上所有特征,每个叶子到最后只会剩下极少数样本,树被拉得特别深。尤其当特征很多时,为了让每个特征都用上,某些节点会被迫选择一个对分类根本没有帮助的特征,结果是模型把训练数据里的噪声一并记住了。这正好呼应了标题里的"剪枝"——树不是越长越壮,反而容易长过头。
所以学习决策树,第一关要先接受一个反直觉的事实:树的目标不是把训练数据分得干干净净,而是归纳出可泛化的规则。 后面所有划分指标和剪枝策略,其实都在围着这个目标转。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种划分指标:信息增益、增益率、基尼指数到底怎么选
先说结论:不同算法用的划分指标不一样,但不能简单说谁更高级。ID3 用信息增益,C4.5 用增益率,CART 分类树用基尼指数。它们都围绕同一个底层概念展开,就是"纯度"。
2.1 信息熵:先有一把测量纯度的尺子
信息熵这个概念来自信息论,用来度量一个系统的混乱程度。对于分类数据,熵的计算公式为:
Ent(D) = -∑ p_k · log2(p_k)
其中 p_k 表示第 k 类样本所占比例。熵越小,数据越纯,全部样本属于同一类时熵为 0;类别五五开时熵最大,等于 1。二分类时最容易记:如果正例和负例各占一半,Ent = -(0.5·log20.5 + 0.5·log20.5) = 1,这是最混乱的情况。
注意log的底数用2,是因为信息论里以 bit 为单位。如果你用自然对数,得到的数值不同但排序效果一样,所以不用死记底数,关键是理解"熵大 =
