第九篇:决策树——像人在一步步做判断的机器学习算法

KNN 很直观,我们是靠“看邻居”来判断样本属于哪类。
决策树(Decision Tree)则是另一种思路,它更像人在做判断:

“如果这个条件成立,就走左边;如果不成立,就走右边。最后判断结果是什么?”

直觉上,你可以把决策树想成一个二叉分支的问答流程
每个节点都是一个问题,每条分支都是可能的答案,最后到达叶子节点得到预测结果。


1. 决策树的直观例子

假设你要预测一个学生这次考试是否通过,你手里有三个特征:

  1. 每天学习时长(小时)
  2. 作业完成率(百分比)
  3. 是否参加辅导班(0=不参加,1=参加)

一个简单的决策树可能是这样的逻辑:

  1. 第一个问题:每天学习时长 >= 5 小时?

    • 是 → 下一个问题
    • 否 → 预测不通过
  2. 第二个问题:作业完成率 >= 70%?

    • 是 → 预测通过
    • 否 → 预测不通过

这样一棵树就可以把样本分类了。
你可以看到,这和我们人自己判断很像:一步步问条件,然后根据答案走不同分支。


2. 决策树是如何决定“问哪个问题”的

树的每个节点都要问一个特征问题,但问题怎么选呢?

核心原则是:信息增益最大,也就是每一步尽量让数据分得更干净。

假设某个节点有 10 个样本,其中 7 个通过,3 个没通过。
如果某个特征可以把这 10 个样本分成:

  • 左边:6 个通过,1 个没通过
  • 右边:1 个通过,2 个没通过

那么这次分裂之后,左右两边的数据纯度提高了很多。
这就是选择这个特征作为分裂条件的原因。

信息增益、Gini 系数或者熵都是用来衡量“分裂效果”的数学方法。
你不用一开始记公式,先抓住核心概念就好:

选择最能让数据“干净分开”的特征做分裂。


3. 决策树的优势

  • 直观可解释
    你可以把树画出来,清楚看到模型的决策路径。
  • 无需标准化
    不像 KNN 或逻辑回归,决策树对特征尺度不敏感。
  • 处理数值和类别特征都方便
    对于类别型特征,直接按类别分裂即可。
  • 可以捕捉非线性关系
    决策树天然适合非线性边界,不需要你事先手工构造多项式或特征交互。

4. 决策树的劣势

  • 容易过拟合
    如果树长得太深,会把训练数据完全记住,但泛化能力差。
  • 对小波动敏感
    数据中一个样本的变化可能导致整个树结构改变。
  • 高维数据表现一般
    当特征很多时,决策树容易变得复杂而不稳。

这也解释了为什么实际应用中,我们会用随机森林或梯度提升树来改进:
它们本质上是用多个树做组合,让模型更稳健。


5. 一个简单 Python 示例

下面用 scikit-learn 建立一棵决策树,延续前面学生考试的数据例子:

import numpy as np
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

# 特征:每天学习时长、作业完成率、是否参加辅导班
X = np.array([
    [2, 50, 0],
    [3, 60, 0],
    [4, 65, 0],
    [5, 70, 1],
    [6, 75, 1],
    [7, 80, 1]
])

# 标签:0=不通过,1=通过
y = np.array([0, 0, 0, 1, 1, 1])

# 建立决策树
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

# 可视化决策树
plt.figure(figsize=(8,6))
plot_tree(tree, feature_names=["学习时长","作业完成率","辅导班"], class_names=["不通过","通过"], filled=True)
plt.show()

你可以看到每个节点的决策条件,以及每条分支的样本分布。这就是决策树的直观魅力。
在这里插入图片描述

gini:节点纯度,越小越纯

samples:这个节点里有多少样本

value:每个类别各有多少样本

class:这个节点当前预测的类别

这棵决策树学到的规则非常直接:它先看“作业完成率”这个特征。
如果作业完成率不超过 67.5,就预测为“不通过”;如果超过 67.5,就预测为“通过”。从图里也能看出来,左右两个叶子节点的 gini 都已经变成了 0,说明这一步划分之后,两边的数据已经被完全分开了。
这也是决策树最直观的地方:它会不断找一个最合适的问题,把样本一点点分开。


6. 如何防止过拟合

决策树容易过拟合,但有几种常用方法可以控制:

  • 限制树的深度max_depth
    树太深容易记住噪声
  • 限制叶子节点最小样本数min_samples_leaf
    避免分裂到只有一个样本
  • 随机选择特征
    随机森林就是用这个思路,让每棵树只看一部分特征

简单来说,就是不要让树在训练集上“做得太完美”,否则泛化能力会差。


7. 决策树与 KNN 的对比

特性KNN决策树
可解释性
是否需要标准化
训练时间快(单棵)
预测时间慢(要算距离)
对噪声敏感高(K 小)高(树深)
捕捉非线性可以,但受 K 限制天然支持

可以看出,决策树的优势在于解释性强、预测快,适合入门和特征探索。


8. 小结

  • 决策树把机器学习流程形象化为一步步判断
  • 每个节点问一个问题,分支走不同路径,最后叶子给结果
  • 树可以捕捉非线性、混合特征,缺点是容易过拟合
  • 控制树深度、叶子最小样本数、随机选择特征是常用防过拟合手段
  • 决策树直观,后续的随机森林、梯度提升树都是在它基础上的改进

决策树讲清楚以后,读者就可以自然理解为什么“随机森林”要用多棵树去投票,以及为什么梯度提升树要一步步加树优化损失。

更多推荐