从信息增益到CART,从剪枝到收入预测,这篇把决策树的"课下内容"一次说透
做机器学习学到决策树,很多人都有一种"看懂了但用不起来"的感觉。理论书翻了一遍,信息增益会算了,基尼指数也会背了,但一打开sklearn就只会写一行DecisionTreeClassifier(),剩下的全靠默认参数硬扛。等模型过拟合了不知道怎么调,面试被问到"剪枝具体怎么做"支支吾吾,到了期末复习又发现课本跟实验平台上的题对不上。这篇文章就是来补这些窟窿的——默认你已经知道决策树的基本概念,所以直接从三种划分标准的身世讲起,再深入到sklearn里的剪枝实操、连续值与缺失值处理、回归树和多输出树这些容易被忽略的地方,最后用一个收入预测的完整案例,把从数据到调参到可视化的流程走一遍。
这篇文章适合几类人:正在上机器学习课程、临近考试需要系统梳理决策树知识点的学生;准备算法岗面试、想弄明白剪枝和特征重要性背后逻辑的求职者;以及那些用sklearn做分类/回归任务,但决策树效果始终不理想,想搞明白到底哪里出了问题的实战党。我会尽量把原理讲得通俗,把代码写得能直接跑,也会分享一些网上教程里很少提到的细节。
1. 三种划分标准:信息增益、增益率、基尼指数背后的选型逻辑
1.1 手算一次信息增益,你就理解了ID3的核心
先别急着跳到sklearn,我强烈建议你至少手算过一次信息增益。因为很多人在课堂上听懂了公式,遇到具体题目还是不会算,期末复习更是无从下手。
信息增益的核心是"划分后不确定性减少得越多越好"。假设我们要预测周末是否去户外活动,14个样本里9次去了、5次没去,那么根节点的熵就是:
[
Ent(D) = -\frac{9}{14}\log_2\frac{9}{14} - \frac{5}{14}\log_2\frac{5}{14} \approx 0.940
]
现在用"湿度"这个属性划分:湿度高的一组有7个样本,其中3个去、4个不去;湿度正常的一组也是7个样本,6个去、1个不去。划分后的加权条件熵是:
[
\frac{7}{14} \times H(3去,4不去) + \frac{7}{14} \times H(6去,1不去)
]
算出来大约是0.788。于是湿度这个属性的信息增益就是0.940减去0.788,约0.152。信息增益越大,说明这个属性让数据变得更"纯"的能力越强,ID3算法就选它作为当前节点的划分属性。
是不是很简单?但问题也跟着来了。如果有一个属性叫"样本编号",每个样本的编号都不同,按它划分后每个子节点只剩一条数据,纯度直接拉满,信息增益达到最大值。ID3会毫不犹豫地选它,可这样的划分毫无泛化能力。这就是ID3著名的"偏好取值较多属性"的缺陷。
1.2 增益率补了什么漏洞,CART又为什么更适合工程落地
C4.5针对ID3的缺陷做了修正,提出了增益率。它的思路是给信息增益除以一个"固有值"。固有值的计算跟当前属性的取值数量有关,取值越多,固有值越大,相当于给信息增益打了一个折扣:
[
Gain_ratio(D, a) = \frac{Gain(D, a)}{IV(a)},\quad IV(a) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|}
]
还是用湿度举例:湿度的两个取值各占7个样本,(IV = -(\frac{7}{14}\log_2\frac{7}{14} + \frac{7}{14}\log_2\frac{7}{14}) = 1)。而"样本编号"的每个取值只含1个样本,IV就大得多,于是增益率被拉低,偏好被抑制了。
但增益率也不是完美无缺,它对取值较少的属性反而存在偏好。所以C4.5实际使用中不是直接选增益率最大的,而是先从信息增益高于平均水平的属性里再挑增益率最高的,做一个折中。
到了CART算法,干脆换了个指标——基尼指数。基尼指数衡量的是"从数据集中随机抽取两个样本,类别不一样的概率",数值越小代表纯度越高。它的最大优势在于计算更快,不需要算对数,而且CART天生就是二叉树,每个节点只做一次二分。注意,CART的基尼指数同样可能存在对取值较多属性的偏好,因为候选切分点更多,更容易把数据切碎、让子节点变纯。这一点后面讲feature_importances_的时候还会再提。
那sklearn的DecisionTreeClassifier用的是哪一种?标准答案是:CART,也就是基于基尼指数的二叉划分树。为什么sklearn不实现ID3或C4.5?很大一部分原因是工程效率——二叉树实现简单,在splitter的搜索上也能更高效,而且像OneHotEncoder产生的多列特征,树在实际划分时天然需要对每一列单独做二分判断,二叉树的组织方式更契合。
三种标准放在一起对比更清楚:
| 算法 | 划分指标 | 树的形态 | 主要偏好/缺陷 | 是否被sklearn实现 |
|---|---|---|---|---|
| ID3 | 信息增益 | 多叉树 | 偏好取值多的属性 | 否 |
| C4.5 | 增益率 | 多叉树 | 对取值少的属性有偏好,需折中 | 否 |
| CART | 基尼指数 | 二叉树 | 计算快,同样存在一定特征偏好 | 是(分类) |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 剪枝的两个路线,以及sklearn里真正推荐的工程做法
2.1 预剪枝参数:从哪个值开始调最靠谱
决策树是机器学习里最容易过拟合的模型之一。理论上,如果不加任何限制,树可以一直分到每个叶子节点只剩一个样本,训练集准确率100%,测试集一塌糊涂。剪枝就是为了治这个病。
预剪枝是在树的生长过程中提前叫停。sklearn里对应的参数主要有几个:
