Skip to content

决策树 (Decision Tree)


一句话定义:决策树是一种基于树结构的监督学习算法,通过一系列”是/否”问题将数据逐步分类或回归。

就像玩”20个问题”游戏:通过不断提问缩小范围,最终得出答案。


选择特征值,观察决策树如何沿路径做出分类决策。

🌳决策树可视化

天气样本: 14Gini: 0.459湿度样本: 5Gini: 0.480≤70%✅ 打球>70%❌ 不打阴/雨有风样本: 9Gini: 0.346❌ 不打✅ 打球
☀️ 天气
💧 湿度
💨 有风
🎓 关键概念
Gini 不纯度:衡量分裂前后的纯度提升
信息增益:衡量分裂带来的信息量增加
剪枝:防止过拟合,限制树的深度
叶子节点:最终的分类结果

[会飞吗?]
/ \
是/ \否
/ \
[有羽毛吗?] [有四条腿吗?]
/ \ / \
是/ \否 是/ \否
/ \ / \
[鸟] [蝙蝠] [狗/猫] [蛇]

每个节点是一个问题(特征判断),叶子节点是答案(分类结果)


决策树的核心是:选择能最好地区分数据的特征

1. 信息增益 (Information Gain) - ID3/C4.5

Section titled “1. 信息增益 (Information Gain) - ID3/C4.5”

基于熵(Entropy)

H(S)=i=1cpilog2piH(S) = -\sum_{i=1}^{c} p_i \log_2 p_i

信息增益 = 分裂前熵 - 分裂后加权熵

Gini(S)=1i=1cpi2Gini(S) = 1 - \sum_{i=1}^{c} p_i^2

直觉:随机抽两个样本,它们类别不同的概率。


天气温度湿度打球?

生成的决策树:

[天气?]
/ | \
晴/ 阴| \雨
/ | \
[湿度?] 是 [风?]
/ \ / \
高/ \低 强/ \弱
/ \ / \
否 是 否 是

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 训练决策树
clf = DecisionTreeClassifier(max_depth=3, random_state=42)
clf.fit(X, y)
# 可视化
plt.figure(figsize=(15, 10))
plot_tree(clf, feature_names=iris.feature_names,
class_names=iris.target_names, filled=True)
plt.show()
# 预测
print(f"准确率: {clf.score(X, y):.2%}")

🌲 集成方法:随机森林 & 梯度提升

Section titled “🌲 集成方法:随机森林 & 梯度提升”

单棵决策树容易过拟合,所以有了集成学习

方法原理代表算法
Bagging多棵树投票Random Forest
Boosting串行纠错XGBoost, LightGBM
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, max_depth=5)
rf.fit(X, y)

✅ 优点❌ 缺点
可解释性强(白盒模型)容易过拟合
不需要特征缩放对噪声敏感
能处理非线性关系不稳定(小变化大影响)
速度快难以捕捉复杂边界

  1. 限制深度max_depth=5
  2. 最小样本数min_samples_split=10
  3. 最小叶子节点min_samples_leaf=5
  4. 剪枝ccp_alpha=0.01(代价复杂度剪枝)