决策树 (Decision Tree)
🎬 视频详解 (Video)
Section titled “🎬 视频详解 (Video)”📌 核心定义 (What)
Section titled “📌 核心定义 (What)”一句话定义:决策树是一种基于树结构的监督学习算法,通过一系列”是/否”问题将数据逐步分类或回归。
就像玩”20个问题”游戏:通过不断提问缩小范围,最终得出答案。
🎨 交互演示 (Interactive)
Section titled “🎨 交互演示 (Interactive)”选择特征值,观察决策树如何沿路径做出分类决策。
🌳决策树可视化
☀️ 天气
💧 湿度
💨 有风
🎓 关键概念
Gini 不纯度:衡量分裂前后的纯度提升
信息增益:衡量分裂带来的信息量增加
剪枝:防止过拟合,限制树的深度
叶子节点:最终的分类结果
🏠 生活类比 (Analogy)
Section titled “🏠 生活类比 (Analogy)”🎮 猜动物游戏
Section titled “🎮 猜动物游戏” [会飞吗?] / \ 是/ \否 / \ [有羽毛吗?] [有四条腿吗?] / \ / \ 是/ \否 是/ \否 / \ / \ [鸟] [蝙蝠] [狗/猫] [蛇]每个节点是一个问题(特征判断),叶子节点是答案(分类结果)。
🎯 关键概念 (Key Concepts)
Section titled “🎯 关键概念 (Key Concepts)”如何选择”最佳问题”?
Section titled “如何选择”最佳问题”?”决策树的核心是:选择能最好地区分数据的特征。
1. 信息增益 (Information Gain) - ID3/C4.5
Section titled “1. 信息增益 (Information Gain) - ID3/C4.5”基于熵(Entropy):
信息增益 = 分裂前熵 - 分裂后加权熵
2. 基尼不纯度 (Gini Impurity) - CART
Section titled “2. 基尼不纯度 (Gini Impurity) - CART”直觉:随机抽两个样本,它们类别不同的概率。
📊 决策树示例
Section titled “📊 决策树示例”判断是否打网球
Section titled “判断是否打网球”| 天气 | 温度 | 湿度 | 风 | 打球? |
|---|---|---|---|---|
| 晴 | 热 | 高 | 弱 | 否 |
| 晴 | 热 | 高 | 强 | 否 |
| 阴 | 热 | 高 | 弱 | 是 |
| 雨 | 温 | 高 | 弱 | 是 |
| … | … | … | … | … |
生成的决策树:
[天气?] / | \ 晴/ 阴| \雨 / | \ [湿度?] 是 [风?] / \ / \ 高/ \低 强/ \弱 / \ / \ 否 是 否 是💻 代码实现 (Code)
Section titled “💻 代码实现 (Code)”from sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import load_irisimport matplotlib.pyplot as pltfrom 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%}")from sklearn.tree import DecisionTreeRegressorimport numpy as np
# 生成数据X = np.sort(np.random.rand(100, 1) * 6, axis=0)y = np.sin(X).ravel() + np.random.randn(100) * 0.1
# 训练reg = DecisionTreeRegressor(max_depth=4)reg.fit(X, y)
# 预测X_test = np.linspace(0, 6, 100).reshape(-1, 1)y_pred = reg.predict(X_test)🌲 集成方法:随机森林 & 梯度提升
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)✅ 优点 vs ❌ 缺点
Section titled “✅ 优点 vs ❌ 缺点”| ✅ 优点 | ❌ 缺点 |
|---|---|
| 可解释性强(白盒模型) | 容易过拟合 |
| 不需要特征缩放 | 对噪声敏感 |
| 能处理非线性关系 | 不稳定(小变化大影响) |
| 速度快 | 难以捕捉复杂边界 |
🔧 防止过拟合
Section titled “🔧 防止过拟合”- 限制深度:
max_depth=5 - 最小样本数:
min_samples_split=10 - 最小叶子节点:
min_samples_leaf=5 - 剪枝:
ccp_alpha=0.01(代价复杂度剪枝)