决策树简介
1 课程概览
本课介绍决策树算法。决策树既可以做分类,也可以做回归。讲解三种决策树:ID3(信息增益)、C4.5(信息增益率)、CART(分类回归树,基尼值)。重点掌握CART决策树。
2 核心概念与定义
- 决策树:一种基本的分类与回归方法,呈树形结构。
- ID3:使用信息增益划分节点,只能做分类。
- C4.5:使用信息增益率划分节点,只能做分类。
- CART:分类回归树(Classification and Regression Tree),既能做分类又能做回归。
- 基尼值:CART决策树用于划分节点的指标。
- 剪枝:对过于庞大的树进行裁剪。
3 算法与模型详解
3.1 决策树简介
定义:决策树是一种基本的分类与回归方法,呈树形结构
特点:
- 既可以做分类,也可以做回归
- 每个分支类似于二分类(要么A,要么B)
3.2 三种决策树
| 决策树 | 划分标准 | 任务 | 说明 |
|---|---|---|---|
| ID3 | 信息增益 | 分类 | 有弊端 |
| C4.5 | 信息增益率 | 分类 | 解决ID3弊端 |
| CART | 基尼值 | 分类+回归 | 重点掌握 |
说明:
- ID3有弊端,C4.5解决其弊端
- C5.0已存在但不开源
- CART既能分类又能回归
3.3 CART决策树
全称:Classification and Regression Tree(分类回归树)
C = Classification(分类) A = And R = Regression(回归) T = Tree(树)
特点:
- 既能做分类,又能做回归
- 使用基尼值划分节点
- 重点掌握
3.4 决策树构建步骤
示例:女孩相亲决策树
年龄 > 30?
├── 是 → 不见
└── 否 → 长相丑?
├── 是 → 不见
└── 否 → 收入高?
├── 是 → 见
└── 否 → 公务员?
├── 是 → 见
└── 否 → 不见
决策过程:
- 年龄 > 30?→ 不见
- 年龄 ≤ 30 → 长相丑?
- 长相丑 → 不见
- 长相不丑 → 收入高?
- 收入高 → 见
- 收入一般 → 公务员?
- 公务员 → 见
- 非公务员 → 不见
3.5 学习重点
重点掌握(红色):
- CART分类案例
- CART回归案例
面试重点(绿色):
- 底层原理理解
- ID3:信息增益
- C4.5:信息增益率
- CART:基尼值
- CART与传统回归的区别
3.6 CART vs 传统回归
| 对比 | CART回归 | 线性回归/逻辑回归 |
|---|---|---|
| 任务 | 回归 | 回归/分类 |
| 原理 | 基尼值 | 梯度下降 |
| 使用 | 一般不用 | 常用 |
说明:虽然CART支持回归,但一般不用,会用线性回归处理回归任务。
4 数学原理与推导
4.1 信息增益(ID3)
$$\text{Gain}(D, A) = \text{Ent}(D) - \text{Ent}(D|A)$$
4.2 信息增益率(C4.5)
$$\text{GainRatio}(D, A) = \frac{\text{Gain}(D, A)}{\text{IV}(A)}$$
4.3 基尼值(CART)
$$\text{Gini}(D) = 1 - \sum_{k=1}^{K} p_k^2$$
4.4 基尼指数
$$\text{GiniIndex}(D, A) = \frac{|D_1|}{|D|} \text{Gini}(D_1) + \frac{|D_2|}{|D|} \text{Gini}(D_2)$$
5 代码示例
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 1. CART分类示例
def cart_classification():
"""CART分类"""
# 生成示例数据:女孩相亲决策
# 特征:[年龄, 长相(0丑1中等2帅), 收入(0低1中2高), 是否公务员(0否1是)]
X = np.array([
[28, 2, 2, 0], # 年轻、帅、高收入、非公务员 → 见
[35, 1, 1, 0], # 年龄大、中等、中收入、非公务员 → 不见
[25, 0, 1, 1], # 年轻、丑、中收入、公务员 → 不见
[27, 1, 1, 1], # 年轻、中等、中收入、公务员 → 见
[32, 2, 2, 0], # 年龄大、帅、高收入、非公务员 → 不见
[26, 2, 2, 0], # 年轻、帅、高收入、非公务员 → 见
])
y = np.array([1, 0, 0, 1, 0, 1]) # 1:见, 0:不见
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建CART分类树
# criterion: gini(基尼) 或 entropy(信息增益)
clf = DecisionTreeClassifier(criterion='gini', random_state=42)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 评估
print("=== CART分类 ===")
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
# 预测新样本
new_sample = np.array([[28, 2, 2, 0]]) # 年轻、帅、高收入、非公务员
prediction = clf.predict(new_sample)
print(f"新样本预测: {'见' if prediction[0] == 1 else '不见'}")
# 2. CART回归示例
def cart_regression():
"""CART回归"""
# 生成示例数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建CART回归树
reg = DecisionTreeRegressor(criterion='squared_error', max_depth=3, random_state=42)
reg.fit(X_train, y_train)
# 预测
y_pred = reg.predict(X_test)
# 评估
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)
print("\n=== CART回归 ===")
print(f"MSE: {mse:.4f}")
print(f"R²: {reg.score(X_test, y_test):.4f}")
# 运行
if __name__ == '__main__':
cart_classification()
cart_regression()
输出示例:
=== CART分类 ===
准确率: 1.0000
新样本预测: 见
=== CART回归 ===
MSE: 0.0123
R²: 0.8765
6 重难点与易错提醒
- ❗重点:CART决策树既能分类又能回归。
- ❗重点:ID3用信息增益,C4.5用信息增益率,CART用基尼值。
- ❗重点:重点掌握CART分类和回归案例。
- ❗重点:CART回归一般不用,用线性回归。
- ⚠️易错:混淆三种决策树的划分标准。
- ⚠️易错:认为决策树只能分类。
- 💡深入理解:决策树通过一系列判断规则进行决策。
7 课堂问答精选
Q: 决策树有哪几种?
A: 决策树主要有三种:
- ID3:使用信息增益划分节点,只能做分类
- C4.5:使用信息增益率划分节点,解决ID3的弊端,只能做分类
- CART:分类回归树,使用基尼值划分节点,既能做分类又能做回归 重点掌握CART决策树。
Q: CART决策树和传统回归有什么区别?
A:
- CART:使用基尼值划分节点,支持分类和回归
- 线性回归/逻辑回归:使用梯度下降,分别处理回归和分类 虽然CART支持回归,但一般不用,会用线性回归处理回归任务。
8 本课小结
- 决策树:分类与回归方法,呈树形结构。
- 三种:ID3(信息增益)、C4.5(信息增益率)、CART(基尼值)。
- CART:分类回归树,重点掌握。
- 示例:女孩相亲决策树。
- 重点:CART分类和回归案例。
9 延伸思考与实践
- 实践:用sklearn实现CART分类和回归。
- 预习:信息熵简介。
- 思考:为什么CART回归一般不用?