3、决策树原理(二):C4.5算法、CART算法、三种算法的对比与选择

上一节我们聊了ID3的基础逻辑,说白了就是用信息增益来选特征。但用过ID3的人都知道,它有个明显的毛病——偏爱取值多的特征。比如你有个“用户ID”列,ID3会傻乎乎地把它当成最佳分裂点,因为每个ID只对应一个样本,信息增益直接拉满。这显然不合理。

所以这一节,我们来聊聊它的两个改进版:C4.5CART。我个人在实际项目中,用得最多的其实是CART,但C4.5在某些场景下也有它的独到之处。

3.1 C4.5算法:用信息增益比来纠偏

C4.5 是 ID3 的升级版,核心改进就一句话:用信息增益比代替信息增益

信息增益比 = 信息增益 / 特征本身的熵(也叫“分裂信息”)。

你想想看,如果某个特征取值特别多,它的分裂信息就会很大,一除就把增益给压下去了。这样就能有效抑制ID3那种“偏爱多值特征”的倾向。

公式长这样:

GainRatio(D, A) = Gain(D, A) / SplitInfo(D, A)

其中 SplitInfo(D, A) = - Σ (|Di|/|D|) * log2(|Di|/|D|)

我在项目中遇到过这样一个场景:做用户画像时,有个“所在城市”特征,取值有300多个。用ID3的话,它几乎每次都会选这个特征做根节点,但实际效果很差。换成C4.5后,城市特征的信息增益比被压得很低,模型终于开始关注其他更有区分度的特征了。

避坑指南: 我曾经在某个金融风控项目里,直接用C4.5的默认参数跑数据,结果发现分裂信息接近0的特征会导致增益比无穷大。嗯,这里要注意——分母不能太小。一般做法是:先算信息增益,只对增益高于平均值的特征再算增益比。

C4.5 还有几个实用改进:

  • 支持连续值特征:比如年龄、收入,它会自动找最佳切分点
  • 能处理缺失值:用概率权重的方式把样本分到各个分支
  • 带剪枝功能:生成完整树后,用错误率评估来剪掉不可靠的分支

3.2 CART算法:二叉树的王者

CART(Classification And Regression Tree)是我个人最常用的决策树算法。它和ID3、C4.5最大的区别是:只生成二叉树

为什么要用二叉树?说白了,多叉树容易把数据切得太碎,泛化能力差。二叉树每次只做一个“是/否”的判断,更稳健。

CART 在分类任务中用基尼系数作为分裂标准,在回归任务中用均方误差

基尼系数公式:

Gini(D) = 1 - Σ (pk)^2

其中 pk 是第 k 类样本的比例

基尼系数越小,纯度越高。CART 会选让基尼系数下降最多的特征和切分点。

我记得有一次做电商的购买预测,特征有几十个,用C4.5生成了一棵深度15的树,看起来特别复杂。换成CART后,深度降到8,准确率反而提升了2%。为什么?因为二叉树更不容易过拟合。

注意: CART 的剪枝策略和 C4.5 不同。CART 用的是代价复杂度剪枝,它会生成一系列不同大小的子树,然后用交叉验证选最优的那个。我建议你在调参时重点关注 ccp_alpha 这个参数(在 sklearn 里),它直接控制剪枝力度。

3.3 三种算法的对比与选择

好了,三种算法都聊完了。我们来个直观的对比:

对比维度 ID3 C4.5 CART
分裂标准 信息增益 信息增益比 基尼系数 / 均方误差
树结构 多叉树 多叉树 二叉树
连续值处理 不支持 支持 支持
缺失值处理 不支持 支持 支持
剪枝 错误率剪枝 代价复杂度剪枝
适用场景 教学演示 中小数据集 工业级应用

那实际项目中怎么选?我个人的经验是:

  • 别用ID3,除非你是在给学生上课演示原理。它太原始了,连连续值都处理不了。
  • C4.5 适合数据量不大、特征以离散为主的场景。比如几百条样本、十几个离散特征的问卷分析。
  • CART 是默认选择。无论是分类还是回归,无论是小数据还是大数据,CART 都能打。而且它是随机森林、GBDT 这些集成方法的基础。

小技巧: 如果你用 sklearn 的 DecisionTreeClassifier,它默认就是 CART 算法。参数 criterion='gini' 就是基尼系数,改成 'entropy' 就相当于用了信息增益(类似ID3的思路,但树结构还是二叉的)。

最后说一句,决策树本身容易过拟合,但它是集成学习的基石。下一节我们会聊随机森林,你会发现——单棵树再强,也比不上一片森林