决策树(机器学习)
分裂准则=argminA,s[∑xi∈Dleft(yi−yˉleft)2+∑xi∈Dright(yi−yˉright)2]分裂准则=argA,sminxi∈Dleft∑(yi−yˉleft)2+xi∈Dright∑(yi−yˉright)2。决策树是机器学习的基础模型,理解其原理和细节是掌握集成方法(如随机森林、XGBoost)的关键。IV(A)IV(A) 是特征
1. 决策树的核心思想
目标:通过对数据特征的分层提问(树的分支),将数据集逐步划分到同质性更高的子集(叶节点)。
本质:一种递归分割的贪心算法,每一步选择当前最优的特征和分割点。
2. 数学基础与分裂准则
分类任务
-
信息熵(Entropy):
-
衡量数据的不确定性:
H(D)=−∑k=1Kpklog2(pk)H(D)=−k=1∑Kpklog2(pk) -
pkpk 为第 kk 类样本在数据集 DD 中的比例。
-
-
信息增益(Information Gain):
-
分裂后熵的减少量(ID3算法使用):
IG(D,A)=H(D)−∑v∈Values(A)∣Dv∣∣D∣H(Dv)IG(D,A)=H(D)−v∈Values(A)∑∣D∣∣Dv∣H(Dv) -
AA 是特征,DvDv 是特征 AA 取值为 vv 的子集。
-
-
增益率(Gain Ratio)(C4.5算法使用):
-
解决信息增益对多值特征的偏好:
GR(D,A)=IG(D,A)IV(A),IV(A)=−∑v∣Dv∣∣D∣log2∣Dv∣∣D∣GR(D,A)=IV(A)IG(D,A),IV(A)=−v∑∣D∣∣Dv∣log2∣D∣∣Dv∣ -
IV(A)IV(A) 是特征 AA 的固有值(Intrinsic Value)。
-
-
基尼指数(Gini Index)(CART分类树使用):
-
衡量数据的不纯度:
Gini(D)=1−∑k=1Kpk2Gini(D)=1−k=1∑Kpk2 -
选择使基尼指数下降最大的特征进行分裂。
-
回归任务
分裂目标:最小化子集的方差(MSE):
分裂准则=argminA,s[∑xi∈Dleft(yi−yˉleft)2+∑xi∈Dright(yi−yˉright)2]分裂准则=argA,sminxi∈Dleft∑(yi−yˉleft)2+xi∈Dright∑(yi−yˉright)2
ss 是特征 AA 的分割点,yˉyˉ 是子集的均值。
3. 关键算法对比
| 算法 | 任务类型 | 分裂准则 | 树结构 | 特点 |
|---|---|---|---|---|
| ID3 | 分类 | 信息增益 | 多叉树 | 只能处理离散特征,易过拟合 |
| C4.5 | 分类 | 增益率 | 多叉树 | 处理连续特征,支持缺失值 |
| CART | 分类/回归 | 基尼指数(分类) 方差减少(回归) |
二叉树 | 生成二叉树,支持剪枝 |
4. 决策树的构建步骤
-
特征选择:根据分裂准则选择最优特征。
-
数据分割:按特征值将数据集划分到子节点。
-
递归终止条件:
-
节点样本数小于阈值(如
min_samples_split)。 -
所有样本属于同一类别(分类任务)。
-
特征已用完或无法进一步分裂。
-
-
生成叶节点:返回多数类别(分类)或均值(回归)。
5. 防止过拟合的方法
剪枝(Pruning)
预剪枝:
提前停止树的生长(如限制最大深度 max_depth、设置最小样本数 min_samples_leaf).
后剪枝:
用验证集评估剪枝前后的泛化性能,决定是否保留子树。
正则化参数
max_depth:树的最大深度。
min_samples_split:节点分裂所需最小样本数。
min_impurity_decrease:分裂需达到的最小不纯度下降。
6. 决策树的优缺点
优点
可解释性:决策规则清晰(符合人类决策逻辑)。
非参数化:无需假设数据分布。
高效性:训练和预测速度快(时间复杂度 O(nlogn)O(nlogn))。
多任务支持:分类、回归、多输出任务。
缺点
高方差:对训练数据敏感,易过拟合。
局部最优:贪心算法无法保证全局最优。
忽略特征相关性:独立处理每个特征。
7. 实际应用与优化
-
特征工程:
-
离散化连续特征(如分箱)。
-
处理缺失值(C4.5支持直接处理,CART通过代理分裂)。
-
-
超参数调优:
-
使用网格搜索(Grid Search)或随机搜索(Random Search)优化剪枝参数。
-
-
集成学习:
-
通过随机森林(Random Forest)、梯度提升树(GBDT)等集成方法降低方差。
-
8. 示例代码(Python)
python
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)
# 训练决策树(分类)
clf = DecisionTreeClassifier(
criterion="gini", # 基尼指数
max_depth=3, # 预剪枝:限制深度
min_samples_split=5 # 节点最少样本数
)
clf.fit(X_train, y_train)
# 评估
print("Test Accuracy:", clf.score(X_test, y_test))
9. 高级话题
-
增量学习:通过部分拟合(
partial_fit)逐步更新树。 -
多输出决策树:同时预测多个目标变量。
-
可视化工具:使用
graphviz或matplotlib绘制树结构。
总结
决策树是机器学习的基础模型,理解其原理和细节是掌握集成方法(如随机森林、XGBoost)的关键。通过合理剪枝和参数调优,决策树可以在实际任务中达到良好的效果。
更多推荐


所有评论(0)