首页 / 树与集成 / 决策树

决策树:一层一层把数据切干净

决策树做的事很朴素:在每个节点上挑一个特征和一道门槛,把样本分成两堆, 让两堆各自"更纯"一点,然后递归下去。这一页让你看着它一步一步长出来。

决策边界
树结构
节点里:切分条件 / 样本数 n / 本次切分带来的增益; 底部彩条是该节点的类别构成。

                
              
左边调出来的参数会实时同步到 ①;②③ 是当前这棵树的真实统计。 把这段代码粘进 notebook,用同样的数据能得到一样的准确率。

怎么衡量"纯不纯"

节点里有 个类别,第 类占比 。两种常用的不纯度:

纯节点(只有一类)两者都是 0;二分类且五五开时,Gini = 0.5,熵 = 1。 熵对"小众类"更敏感,实际中两者效果通常接近。

怎么挑切分点

对特征 的每一个候选门槛 (取排序后相邻取值的中点),算切完之后 左右两堆的加权不纯度,挑下降最多的那一个:

这是贪心:每一步只顾眼前最优,不保证全局最优——但因为每一步都是局部最优解, 它足够快,也足够好用。

什么时候停

  • 节点已经纯了(不纯度 = 0)
  • 深度达到
  • 样本数少于
  • 再也找不到能带来改善的切分
把 max_depth 一路拉到 10,看训练集准确率是不是冲到 100%—— 那不是变强了,是背答案。这就是过拟合,也是后来剪枝和随机森林要解决的问题。
1. 为什么决策树能分开"异或",而线性回归、Logistic 都做不到?
异或的正负样本在对角线上,任何一条直线都切不开。 决策树是一连串轴平行的切分:先按 x₁ 切一刀,再在两边各按 x₂ 切一刀, 四块区域各自归一类。它靠"分段的方块"逼近任意形状,代价是边界全是横平竖直的台阶。
2. 训练集准确率 100% 是好事吗?
通常是坏事。树长到能记住每个样本时,叶子会碎到只包住一两个点, 这些细碎的规则多半是在拟合噪声,换个数据集就失效。 判断标准要看没参与训练的样本——这也是为什么后面要讲交叉验证。
3. 为什么切分只能"轴平行",不能斜着切?
经典 CART 每次只用一个特征和一个门槛,条件形如 ,在二维平面上就是一条垂直于坐标轴的直线。 这让树极好解释("花瓣宽 ≤ 0.8 就是 setosa"), 但也让它在对角边界上要堆很多台阶。想斜着切,就得用线性组合切分( oblique tree),可解释性会打折。
4. 同一份数据,Gini 和熵切出来的树会一样吗?
大多数时候一样,偶尔不同。两者都是"越纯越小"的凹函数,排序高度一致; 但在几个候选切分的不纯度下降非常接近时,可能选出不同的那刀。 这一页的实现已经和 sklearn 逐节点对拍过:增益值一致,只是遇到完全打平的候选时选择可能不同。