决策树 GBDT XGBoost LightGBM

一、决策树

1. 决策树有一个很强的假设:

    信息是可分的,否则无法进行特征分支

2. 决策树的种类:

2. ID3决策树:

ID3决策树的数划分标准是信息增益:

信息增益衡量的是通过某个特征进行数据划分前后熵的变化量。但是,它没有考虑到特征本身的熵,因此容易偏向于取值较多的特征

3. C4.5决策树:

C4.5决策树的数划分标准是信息增益比:

信息增益比则是 信息增益 除以 该特征自身的熵(也称为分裂信息)。这种方法旨在纠正信息增益对于取值较多特征的偏爱,通过将信息增益与特征自身的熵相除来惩罚那些拥有大量取值的特征。

C4.5并没有直接偏向于取值少的特征,而是通过分裂信息来调整信息增益,使得特征的基数大小影响其最终的选择概率。这种方式帮助算法避免了仅仅基于信息增益选择特征可能导致的过拟合问题,特别是当存在高基数特征时。

4. CART 回归树 和 分类树:

回归树:每个子树的输出是该子树节点值的均值:

步骤(1):选择最优切分变量和切分点

步骤(2):划分区域并决定输出值 

根据特征jj和切分点ss将数据集划分为两个子区域

计算子区域内的样本目标值的平均值作为该区域的预测值

这两个步骤描述了递归地应用上述过程,直到满足停止条件,并最终生成决策树的过程。

5. CART 的参数: 

6. CART 训练后的回归树常用属性:

为什么获取树的叶子节点数 就可以用于评估泛化能力?

       叶子节点数量越多,意味着决策树越复杂。每个叶子节点代表一个具体的预测规则或输出值。如果一棵树的叶子节点过多,说明它可能已经学习了训练数据中的很多细节甚至是噪音,这种现象通常被称为过拟合。过拟合模型在训练集上表现很好,但在未见过的数据(测试集)上的表现较差。

7. 回归树demo展示,可视化回归树:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeRegressor, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt# 1. 加载数据
data = load_iris()
X = data.data
y = X[:, 0]  # 用 sepal length 做回归目标# 2. 数据划分
X_train, X_test, y_train, y_test = train_test_split(X[:, 1:], y, test_size=0.2, random_state=42)# 3. 建立模型
reg = DecisionTreeRegressor(max_depth=3, random_state=42)
reg.fit(X_train, y_train)# 4. 模型预测与评估
y_pred = reg.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"\n【模型评估】\n均方误差 MSE: {mse:.4f}")# 5. 打印常用属性
print("\n【模型属性展示】")
print("特征重要性 feature_importances_:", reg.feature_importances_)
print("使用特征数 n_features_in_:", reg.n_features_in_)
print("输出维度数 n_outputs_:", reg.n_outputs_)
print("实际使用的 max_features_:", reg.max_features_)
print("树最大深度 get_depth():", reg.get_depth())
print("叶子节点数 get_n_leaves():", reg.get_n_leaves())# 6. 可视化特征重要性
feature_names = data.feature_names[1:]
plt.figure(figsize=(6, 4))
plt.bar(feature_names, reg.feature_importances_, color='teal')
plt.title("Feature Importances")
plt.ylabel("Importance")
plt.grid(axis='y')
plt.tight_layout()
plt.show()# 7. 可视化树结构
plt.figure(figsize=(10, 6))
plot_tree(reg, feature_names=feature_names, filled=True, rounded=True)
plt.title("Decision Tree Structure")
plt.show()

8. 分类树:

sklearn 的模型参数:

模型属性对比:

demo:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 1. 数据准备
iris = load_iris()
X = iris.data
y = iris.target# 2. 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 3. 构建模型(使用信息增益)
clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=42)
clf.fit(X_train, y_train)# 4. 预测与评估
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"准确率: {acc:.4f}")# 5. 展示分类专有属性
print("\n【分类树专有属性】")
print("类别标签 classes_:", clf.classes_)
print("类别数量 n_classes_:", clf.n_classes_)
print("每个测试样本的预测概率 predict_proba():\n", clf.predict_proba(X_test[:5]))

 二、Boosting:

Boosting 中文是“提升方法”,是一种集成学习方法,它只是一个“策略思想”。

AdaBoost、GDBT、 XGBoost、LightGBM 都是这个思想的具体实现。

Boosting 将多个弱学习器(weak learner),如小决策树,串行地组合在一起,每一轮都“纠正”上一轮的错误,最终得到一个强大的集成模型。

Gradient Boosting:英文缩写 GDBT ,中文是“梯度提升树”或“提升树”、“提升树模型”。

(2)Gradient Boosting:英文缩写 GDBT ,中文是“梯度提升树”或“提升树”、“提升树模型”。

注意:提升树 GBDT(及其变种) ≠  AdaBoost 

1. AdaBoost:

注意:不同于GDBT,AdaBoost 在第 t 轮不直接使用前一轮训练出的模型,而是通过样本权重的改变,间接地反映之前模型的表现。

AdaBoost 每一轮都是从头训练一个新的弱学习器  h_{t}(x) ,只是通过每次迭代将 训练样本分布进行调整,令错分样本权重更大

2. GDBT:

GBDT 是一种通过迭代拟合损失函数负梯度(即残差)的方式训练多个决策树并进行加权求和的Boosting 方法。GDBT使用回归树作为弱学习器(哪怕是分类任务)。

GBDT 的“Gradient”不是装饰,它真的是在做梯度下降,只是回归时,常用的损失函数是平方误差(MSE)的公式为:

\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 

对于MSE 的负梯度为:

MSE的负梯度刚好有一个可描述的名字,就是残差,因此可以理解为一种巧合hh

再举个例子:

GBDT 用于二分类,使用对数损失(Log Loss):

那么,在 GBDT 的每一轮中,就是用这些 负梯度 gi​ 作为新的“伪标签”来训练一个 回归树。在新的一轮迭代中,这个回归树试图学习xi → gi 。该回归树不是去做分类,而是用回归树去逼近这个负梯度值(伪残差)

你看到的是“残差”,其实它背后是“负梯度”;
这个巧合让 GBDT 在回归问题上看起来像“残差堆树”,但本质上是一种通用的函数空间梯度优化方法。

1. 集成学习:

2. Boosting 工作机制:

Boosting 的每一轮训练模型都试图学习 当前预测值与真实值之间的差值(残差),从而逐步缩小误差。 

Boosting 不是一开始就拟合目标,而是每次都只拟合 还没学会的部分,就像学生每天复习昨天不会的题,反复训练,直到掌握。

 

提升树算法通过逐次拟合残差并不断优化模型,能够有效地提高模型的预测精度,且避免模型过拟合,具体来说,原因如下:

(1)逐步拟合残差,避免直接过拟合目标
每一步学习的目标是上一步的误差(残差),不是一次性“猜中全部”。
这种“加法模型”方式可以让模型以小步慢走的方式逐渐逼近真实目标。

(2)模型弱但组合强
Boosting 通常使用弱学习器(如深度很浅的决策树)。
单个模型能力弱,不容易过拟合,但组合起来又能表现强。

总结参考:

感谢大佬的无私分享,同时加入了一些自己的总结和理解,欢迎批评指正,相互交流~

决策树(ID3、C4.5、CART)的原理、Python实现、Sklearn可视化和应用 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础学习(十四)

文章目录 4-1 面向过程与面向对象4-2 Java语言的基本元素:类和对象面向对象的思想概述 4-3 对象的创建和使用内存解析匿名对象 4-1 面向过程与面向对象 面向过程(POP) 与 面向对象(OOP) 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程&…

TCP 三次握手,第三次握手报文丢失会发生什么?

文章目录 RTO(Retransmission Timeout)注意 客户端收到服务端的 SYNACK 报文后,会回给服务端一个 ACK 报文,之后处于 ESTABLISHED 状态 因为第三次握手的 ACK 是对第二次握手中 SYN 的确认报文,如果第三次握手报文丢失了,服务端就…

deepseek告诉您http与https有何区别?

有用户经常问什么是Http , 什么是Https ? 两者有什么区别,下面为大家介绍一下两者的区别 一、什么是HTTP HTTP是一种无状态的应用层协议,用于在客户端浏览器和服务器之间传输网页信息,默认使用80端口 二、HTTP协议的特点 HTTP协议…

openresty如何禁止海外ip访问

前几天,我有一个徒弟问我,如何禁止海外ip访问他的网站系统?操作系统采用的是centos7.9,发布服务采用的是openresty。通过日志他发现,有很多类似以下数据 {"host":"172.30.7.95","clientip&q…

理解 Redis 事务-20 (MULTI、EXEC、DISCARD)

理解 Redis 事务:MULTI、EXEC、DISCARD Redis 事务允许你将一组命令作为一个单一的原子操作来执行。这意味着事务中的所有命令要么全部执行,要么全部不执行。这对于在需要一起执行多个操作时保持数据完整性至关重要。本课程将涵盖 Redis 事务的基础知识…

Milvus分区-分片-段结构详解与最佳实践

导读:在构建大规模向量数据库应用时,数据组织架构的设计往往决定了系统的性能上限。Milvus作为主流向量数据库,其独特的三层架构设计——分区、分片、段,为海量向量数据的高效存储和检索提供了坚实基础。 本文通过图书馆管理系统的…

Kettle 远程mysql 表导入到 hadoop hive

kettle 远程mysql 表导入到 hadoop hive (教学用 ) 文章目录 kettle 远程mysql 表导入到 hadoop hive创建 对象 执行 SQL 语句 -mysql 导出 CSV格式CSV 文件远程上传到 HDFS运行 SSH 命令远程登录 run SSH 并执行 hadoop fs -put 建表和加载数据总结 创…

Linux输出命令——echo解析

摘要 全面解析Linux echo命令核心功能,涵盖文本输出、变量解析、格式控制及高级技巧,助力提升Shell脚本开发与终端操作效率。 一、核心功能与定位 作为Shell脚本开发的基础工具,echo命令承担着信息输出与数据传递的重要角色。其主要功能包…

Windows系统下 NVM 安装 Node.js 及版本切换实战指南

以下是 Windows 11 系统下使用 NVM 安装 Node.js 并实现版本自由切换的详细步骤: 一、安装 NVM(Node Version Manager) 1. 卸载已有 Node.js 如果已安装 Node.js,请先卸载: 控制面板 ➔ 程序与功能 ➔ 找到 Node.js…

【leetcode】977. 有序数组的平方

有序数组的平方 题目代码1. 使用sorted2. 双指针 题目 977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输…

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统 一、核心架构解析 本系统基于 Obsidian 的 DataviewJS 和 Charts 插件,实现日报数据的自动采集、可视化分析及智能回溯功能(系统架构原理见)。其技术…

深入解析Spring Boot与Kafka集成:构建高效消息驱动应用

深入解析Spring Boot与Kafka集成:构建高效消息驱动应用 引言 在现代分布式系统中,消息队列是实现异步通信和解耦的关键技术之一。Apache Kafka作为一款高性能、分布式的消息队列系统,广泛应用于大数据和实时数据处理场景。本文将详细介绍如…

Rust 学习笔记:关于生命周期的练习题

Rust 学习笔记:关于生命周期的练习题 Rust 学习笔记:关于生命周期的练习题生命周期旨在防止哪种编程错误?以下代码能否通过编译?若能,输出是?如果一个引用的生命周期是 static,这意味着什么&…

word解决不同文档同样的字体段落设置下看起来行距不同的问题

问题: 有时候我们照着模板修改文档格式,明明字体和段落设置一模一样,但是看起来行距不一样。 解决办法: 一般照着模板修改文档内容,要注意以下几点,如果以下几点与模板设置相同时就可解决上述问题 1、纸…

Jenkins实践(9):配置“构建历史的显示名称,加上包名等信息“

Jenkins实践(9):配置“构建历史的显示名称,加上包名等信息“ 版本:Jenkins 4.262.2 需求:想要在构建历史中展示,本次运行的是哪个版本或哪个包 操作步骤: 1、先安装插件Build Name and Description Setter 2、Set Build Name 3、构建历史处查看展示 插件特性说明 安装依赖…

matIo库及.mat数据格式介绍

一.概述 1..mat数据格式 (1).mat 是 MATLAB 软件的标准二进制数据存储格式,用于保存变量、矩阵、数组、结构体等数据类型。其名称源于 “MATLAB Data” 的缩写,最初设计为高效存储和加载 MATLAB 环境中的数据,后来逐…

企业级调度器LVS (面试版)

1. 什么是 LVS?有什么作⽤? LVS ( Linux Virtual Server )是⼀个基于 Linux 内核实现的⾼性能、可扩展和可靠的负载均衡。它将多个服务器组成⼀个⾼可⽤、⾼性能和⾼可靠的虚拟服务器集群,通过将客户端的请求转发到不同的后端服务器,实现负载均衡和⾼可⽤性。 2.什么是 …

用python制作一个简易的聊天室软件

文章目录 效果图python源码使用说明效果图 只需要一百多行的python代码,就能制作一个简易的聊天室软件。效果如下: 操作说明: 1、先运行server.py启动服务器; 2、每运行一次client.py可以创建一个聊天用户(需要输入用户昵称); 3、输入对方的昵称即可与其聊天,输入“a…

Android13 开机时间优化

前言 在实际应用场景中,特定领域对 Android 系统的启动时间有着极为严苛的要求,车载领域便是典型代表。想象一下,当车辆已经行驶出数公里之遥,车内的信息娱乐系统(IVI)却仍未完成启动,这无疑会…

08SpringBoot高级--自动化配置

目录 Spring Boot Starter 依赖管理解释 一、核心概念 二、工作原理 依赖传递: 自动配置: 版本管理: 三、核心流程 四、常用 Starter 示例 五、自定义 Starter 步骤 创建配置类: 配置属性: 注册自动配置&a…