当前位置: 首页 > news >正文

决策树(Decision Tree)完整解析:原理 + 数学推导 + 剪枝 + 实战

1️⃣ 什么是决策树?

决策树(Decision Tree)是一种常见的监督学习方法,可用于分类回归
其基本思想是:

通过特征条件的逐层划分,将数据集分割成越来越“纯净”的子集,直到子集中的样本几乎属于同一类别。

最终输出是一个树形结构,每个叶节点对应一个类别或预测值。

2️⃣ 决策树的构建思想

  1. 从根节点开始,选择一个最佳特征来划分数据集

  2. 对划分后的子集递归构建子树

  3. 当满足停止条件时(子集纯净、特征用尽或达到深度限制)终止

3️⃣ 特征选择指标

决策树核心在于:如何选择最优的划分特征?

(1) 信息增益(ID3算法)

熵(Entropy)定义:

H(D) = - \sum_{k=1}^K p_k \log_2 p_k 

其中 p_k​ 是类别 k 在数据集 D 中的概率。 

信息增益定义: 

\text{Gain}(D, A) = H(D) - \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} H(D_v) 

  • A:特征

  • D_v:在特征A=v下的数据子集

优点:选择信息增益最大的特征,降低数据的不确定性。

(2) 信息增益率(C4.5算法)

信息增益率定义:

\text{GainRatio}(D, A) = \frac{\text{Gain}(D, A)}{H_A(D)} 

其中 

H_A(D) = - \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|} 

(3) 基尼指数(CART算法)

基尼指数定义:

\text{Gini}(D) = 1 - \sum_{k=1}^K p_k^2 

某特征 A 的基尼指数: 

\text{GiniIndex}(D, A) = \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \text{Gini}(D_v) 

4️⃣ 决策树生成与剪枝

4.1 生成过程

  • 递归划分数据集

  • 根据指标(信息增益/基尼指数)选择最优特征

  • 当样本数量小于阈值或特征用尽,生成叶节点

4.2 剪枝(Pruning)

防止过拟合,主要有两类:

  • 预剪枝(Pre-Pruning)
    在生成树时提前终止划分,例如:

    • 最大深度限制

    • 节点最小样本数限制

    • 信息增益小于阈值

  • 后剪枝(Post-Pruning)
    完整生成树后,再自底向上删除不必要的分支。

5️⃣ 决策树的完整数学表达

分类决策函数为:

f(x) = \arg \max_{k} p(y = k \mid x) 

回归任务可输出均值: 

f(x) = \frac{1}{|D_{\text{leaf}}|} \sum_{x_i \in D_{\text{leaf}}} y_i 

6️⃣ Python实现(Sklearn) 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text# 加载数据
X, y = load_iris(return_X_y=True)# 构建决策树
clf = DecisionTreeClassifier(criterion="gini", max_depth=3, random_state=0)
clf.fit(X, y)# 输出结构
print(export_text(clf, feature_names=["sepal_length","sepal_width","petal_length","petal_width"]))

如果需要可视化: 

from sklearn import tree
import matplotlib.pyplot as pltplt.figure(figsize=(12,8))
tree.plot_tree(clf, filled=True, feature_names=["sepal_length","sepal_width","petal_length","petal_width"])
plt.show()

7️⃣ 优缺点总结

✅ 优点

  • 可解释性强,输出清晰的规则

  • 不需要大量特征工程(无需归一化)

  • 能同时处理数值型和离散型特征

❌ 缺点

  • 容易过拟合,需要剪枝

  • 对数据微小波动敏感

  • 贪心选择特征,可能不是全局最优

8️⃣ 应用场景

  • 风控评分卡(可解释性需求高)

  • 医学诊断、临床辅助

  • 客户细分、市场营销

  • 与集成学习(RandomForest、XGBoost)结合

📚 总结

  • ID3 用信息增益,C4.5 用信息增益率,CART 用基尼指数

  • 剪枝是防止过拟合的关键步骤

  • 决策树是集成学习方法的核心基学习器

http://www.dtcms.com/a/301435.html

相关文章:

  • 无向图的连通性问题
  • Qt C++ GUI 函数参数速查手册:基础与布局
  • Android 调试桥 (adb) 基础知识点
  • 通过knn算法实现识别数字
  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——5.4 计算预订订单数量和总金额 (Calculating booked orders)
  • nacos连接失败,启动失败常见问题
  • OpenCV-图像预处理③【图像梯度计算、边缘检测算法(如 Canny)、轮廓提取与分析、凸包特征检测,以及 轮廓的外接几何特征(如最小外接矩形、外接圆等)】
  • 硅基计划3.0 学习总结 肆 二叉树 初版
  • [每周一更]-(第148期):使用 Go 进行网页抓取:Colly 与 Goquery 的对比与思路
  • QT---概览
  • 优化Linux高并发:文件描述符与端口范围的协同调优
  • SPSC无锁环形队列技术(C++)
  • FreeRTOS—空闲任务
  • 【Python系列】Flask 应用中的主动垃圾回收
  • idea打开后project窗口未显示项目名称的解决方案
  • LangGraph快速入门项目部署
  • C++ 中实现 `Task::WhenAll` 和 `Task::WhenAny` 的两种方案
  • 从0搭建YOLO目标检测系统:实战项目+完整流程+界面开发(附源码)
  • jenkins只能运行2个任务,提示:“等待下一个可用的执行器”
  • Redis C++客户端——命令使用
  • 实战演练1:实战演练之命名实体识别
  • Docker 的数据持久化-数据卷
  • (AC)架子鼓
  • 基于Java的KTV点歌系统的设计与实现
  • 【CF】Day112——杂题 (逆向思维 | 二分 + 贪心 | 单调队列优化DP | 二进制 + 前缀和 | 二分图判断 | 暴力枚举)
  • JavaEE--3.多线程
  • python-装饰器
  • 【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
  • QT6 源,七章对话框与多窗体(15)多文档 MDI 窗体 QMdiArea 篇一:属性,公共成员函数,信号与槽函数
  • 多智能体架构