一、决策树的核心思想
- 本质:通过特征判断对数据集递归划分,形成树形结构。
- 目标:生成一组“若-则”规则,使数据划分到叶子节点时尽可能纯净。
- 关键流程:
- 特征选择:选择最佳分裂特征(如信息增益最大)。
- 节点分裂:根据特征取值划分子节点。
- 停止条件:节点样本纯度过高或样本数过少时终止。
二、数学公式与理论
1. 信息熵(Information Entropy)
衡量数据集的混乱程度:
H ( D ) = − ∑ k = 1 K p k log 2 p k H(D) = -\sum_{k=1}^{K} p_k \log_2 p_k H(D)=−k=1∑Kpklog2pk
- K K K:类别总数
- p k p_k pk:第 k k k 类样本的占比
- 熵值范围: 0 0 0(完全纯净)到 log 2 K \log_2 K log2K(完全混乱)
2. 信息增益(Information Gain)
特征 A A A 分裂后熵的减少量:
Gain ( D , A ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) \text{Gain}(D, A) = H(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} H(D^v) Gain(D,A)=H(D)−v=1∑V∣D∣∣Dv∣H(Dv)
- D v D^v Dv:特征 A A A 取值为 v v v 的子集
- 分裂标准:选择信息增益最大的特征
3. 基尼不纯度(Gini Impurity)
另一种纯度衡量指标:
Gini ( D ) = 1 − ∑ k = 1 K p k 2 \text{Gini}(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1−k=1∑Kpk2
- 特点:计算效率比熵高,常用于分类树
4. 回归树的均方误差(MSE)
节点内样本的预测误差:
MSE = 1 N ∑ i = 1 N ( y i − y ˉ ) 2 \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \bar{y})^2 MSE=N1i=1∑N(yi−yˉ)2
- y ˉ \bar{y} yˉ:节点样本的均值
- 分裂目标:最小化分裂后的加权 MSE
三、代码实现(Python)
示例:手动计算基尼系数
import numpy as np
def compute_gini(y):
# y: 样本标签数组
classes, counts = np.unique(y, return_counts=True)
proportions = counts / len(y)
gini = 1 - np.sum(proportions ** 2) # 对应公式 $Gini(D) = 1 - \sum p_k^2$
return gini
# 示例:计算基尼系数
y = np.array([0, 0, 0, 1, 1, 1, 1]) # 3个0类,4个1类
print("基尼系数:", compute_gini(y)) # 输出:1 - ( (3/7)^2 + (4/7)^2 ) ≈ 0.49
使用 Scikit-learn 实现分类树
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 加载数据
data = load_iris()
X, y = data.data, data.target
# 创建模型(使用基尼系数,限制树深度)
model = DecisionTreeClassifier(
criterion="gini", # 分裂标准:基尼系数 $Gini(D)$
max_depth=3, # 最大深度防止过拟合
min_samples_split=10 # 节点最少10样本才分裂
)
model.fit(X, y)
# 查看特征重要性(对应信息增益贡献)
print("特征重要性:", model.feature_importances_)
四、实际应用场景
1. 分类任务
- 信用卡欺诈检测
- 特征:交易金额、地点、时间间隔
- 标签:正常/欺诈
- 方法:计算特征的信息增益,选择关键特征(如“金额 > 阈值”)
2. 回归任务
- 房价预测
- 特征:面积、房间数、地理位置
- 标签:房价
- 方法:递归划分区域,使每个区域的房价 MSE 最小
3. 其他领域
- 医疗诊断:根据症状(特征)判断疾病类型(标签)
- 工业控制:根据传感器数据(特征)判断设备故障(标签)
五、决策树的优缺点
优点 | 缺点 |
---|---|
可解释性强(规则可视化) | 容易过拟合(需剪枝) |
支持类别和数值特征 | 对数据微小变化敏感 |
无需特征标准化 | 回归任务中预测不够平滑 |