AI - 机器学习GBDT算法

目录

GBDT

提升树 

梯度提升树 

GBDT算法实战案例 

XGBoost  


😆😆😆感谢大家的观看😆😆

GBDT

梯度提升决策树(Gradient Boosting Decision Tree),是一种集成学习的算法,它通过构建多个决策树来逐步修正之前模型的错误,从而提升模型整体的预测性能

GBDT属于Boosting方法的一种,这种方法会顺序构建一系列弱学习器(通常是决策树),每个后续模型都侧重于纠正前一个模型的错误。在GBDT中,这些弱学习器是回归决策树。GBDT利用了泰勒级数展开和梯度下降法的思想,在函数空间中使用梯度下降法进行优化。GBDT可以应用于回归和分类问题,对于多分类问题,通常会使用类似于softmax回归中提到的损失函数和梯度。 

提升树 

📀提升树:通过拟合残差的思想来进行提升(真实值 - 预测值)

  • 预测某人的年龄为100岁
  • 第1次预测:对100岁预测,因单模型在预测精度上有上限,只能预测成80岁;100 – 80 = 20(残差)
  • 第2次预测:上一轮残差20岁作为目标值,只能预测成16岁;20 – 16 = 4 (残差) 
  • 第3次预测:上一轮的残差4岁作为目标值,只能预测成3.2岁;4 – 3.2 = 0.8(残差)
  • 若三次预测的结果串联起来: 80 + 16 + 3.2 = 99.2

对于提升树来说只需要简单地拟合当前模型的残差。

梯度提升树 

📀梯度提升树不再使用拟合残差,而是利用最速下降的近似方法,利用损失函数的负梯度作为提升树

算法中的残差近似值。 

  • 切分点1.5 将数据集分成两份 [5.56],[5.56 5.7 5.91 6.4 6.8 7.05 8.9 8.7 9. 9.05]

  • 第一份的平均值为5.56 第二份数据的平均值为(5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05)/9 = 7.5011

  • 第一份数据的误差为0,第二份数据的平方误差为目标值与预测值的差的平方再相加:15.7

根据计算以 6.5 作为切分点损失最小。

  • 当处理回归问题时,如果损失函数是均方误差(square error loss),那么负梯度就是残差,即真实值与当前模型预测值的差值。
  • 对于分类问题,特别是二元分类,通常会使用类似于逻辑回归的损失函数,如对数损失(log loss)或交叉熵损失(cross-entropy loss)。在这种情况下,负梯度是基于概率预测的梯度,而不是直接的残差。
  • 在GBDT中,无论是分类还是回归问题,都使用CART算法中的回归树来拟合负梯度。这是因为负梯度是连续值,需要用回归树来进行拟合。
  • 负梯度是GBDT中用来指导模型优化的方向,它根据当前模型的损失函数来计算,并通过拟合这些负梯度来训练新的决策树,从而逐步提升模型的性能。

构建第二个弱学习器

以 3.5 作为切分点损失最小

构建第三个弱学习器 

以 6.5 作为切分点损失最小

最终的强学习器 :

GBDT算法实战案例 

from sklearn.datasets import load_boston
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 加载波士顿房价数据集
data = load_boston()
X, y = data.data, data.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建GBDT回归模型
gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)# 训练模型
gbdt.fit(X_train, y_train)# 预测测试集
y_pred = gbdt.predict(X_test)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

小结:

  • 梯度提升树(Gradient Boosting Trees)是一种集成学习方法,通过迭代地构建多个决策树来逐步修正之前模型的错误,从而提升模型整体的预测性能。
  • 负梯度是一个重要的概念,它用于指导每棵树的学习方向。具体来说,负梯度是损失函数在当前模型预测值处的导数的相反数。对于不同的损失函数,负梯度的计算方式会有所不同。
  • GBDT算法的基本步骤包括初始化模型、迭代地添加新的决策树、拟合残差或负梯度、更新模型等。在每一步迭代中,GBDT通过拟合负梯度来训练新的决策树,然后将这些树组合起来更新模型,以减少总体损失。
  • GBDT算法的停止条件通常是达到预设的最大迭代次数或者模型性能达到一定的阈值。当模型性能不再显著提升时,可以提前停止迭代,以避免过拟合和过度训练的问题。

XGBoost  

🔊XGBoost,全称为eXtreme Gradient Boosting,是一种基于提升算法(Boosting)的机器学习算法,旨在通过组合多个弱分类器来生成一个强大的分类器

与传统的梯度提升方法类似,XGBoost基于加法模型,通过不断地添加决策树来逐步优化模型的预测性能。每个新加入的树都致力于纠正之前所有树的累积误差。XGBoost定义了一个具有两个主要部分的目标函数。第一部分是衡量模型预测值与实际值之间差异的损失函数,第二部分则包括了控制模型复杂度的正则化项,以防止过拟合。正则化项由树的叶子节点数量和叶子节点分数的L2模组成,分别由超参数γ和λ控制。XGBoost使用的基学习器是CART(Classification and Regression Trees)回归树。在每一步迭代中,算法选择分裂特征和切分点以最大程度地降低目标函数的值。这种优化过程涉及到遍历所有可能的特征和切分点,以找到最佳的分裂方案。

  • 基本原理与GBDT相同,属于Gradient Boosting 类型的机器学习算法,是对GBDT的优化
  • 在训练每一棵树的时候GBDT采用了并行的方式进行训练,提高了模型训练速度

XGBoost 属于Boosting类集成学习模型, 要串行的训练多个模型逐步逼近降低损失,我们很难找到一个函数通过梯度下降的套路来解决这个问题。 

  • 与传统的梯度下降法只使用一阶导数信息不同,XGBoost采用了二阶导数的泰勒展开,这不仅使用了一阶导数,还利用了二阶导数信息,从而可以更精准地找到损失函数的最小值。
  • XGBoost支持在每一轮提升迭代中进行交叉验证评估,方便用户实时监控模型的性能并进行调优。

sklearn的XGBoost使用参数

booster

  1. gbtree:使用树模型
  2. gblinear:使用线性模型
  3. dart:使用树模型

num_feature

  • 在boosting中使用特征的维度,设置为特征的最大维度

案例 

import joblib
import numpy as np
import xgboost as xgb
import pandas as pd
import numpy as np
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.model_selection import StratifiedKFolddef test01():data = pd.read_csv('wine.csv')x = data.iloc[:, :-1]y = data.iloc[:, -1] - 3x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size=0.2, stratify=y, random_state=22)# 存储数据pd.concat([x_train, y_train], axis=1).to_csv('data-train.csv')pd.concat([x_valid, y_valid], axis=1).to_csv('data-valid.csv')# 模型训练
def test02():train_data = pd.read_csv('data类-train.csv')valid_data = pd.read_csv('data-valid.csv')# 训练集x_train = train_data.iloc[:, :-1]y_train = train_data.iloc[:, -1]# 测试集x_valid = valid_data.iloc[:, :-1]y_valid = valid_data.iloc[:, -1]estimator = xgb.XGBClassifier(n_estimators=100,objective='multi:softmax',eval_metric='merror',eta=0.1,use_label_encoder=False,random_state=22)estimator.fit(x_train, y_train)y_pred = estimator.predict(x_valid)print(classification_report(y_true=y_valid, y_pred=y_pred))# 模型保存joblib.dump(estimator, 'model/xgboost.pth')

除了'multi:softmax',XGBoost中还有其他的objective损失函数参数选项。以下是一些常见的选项:

  1. 'binary:logistic':用于二分类问题,使用逻辑回归损失函数。
  2. 'reg:linear':用于回归问题,使用线性回归损失函数。
  3. 'reg:squarederror':用于回归问题,使用平方误差损失函数。
  4. 'reg:squaredlogerror':用于回归问题,使用平方对数误差损失函数。
  5. 'count:poisson':用于计数问题的泊松回归,使用泊松分布损失函数。
  6. 'rank:pairwise':用于排序问题,使用成对排序损失函数。
  7. 'rank:ndcg':用于排序问题,使用NDCG(Normalized Discounted Cumulative Gain)评估指标。
  8. 'rank:map':用于排序问题,使用MAP(Mean Average Precision)评估指标。
  9. 'survival:cox':用于生存分析问题,使用Cox比例风险模型。
  10. 'multi:softprob':用于多分类问题,输出每个类别的概率。
  11. 'multi:softmax':用于多分类问题,输出每个类别的预测结果。

 模型参数调优

from sklearn.utils import class_weight
classes_weights = class_weight.compute_sample_weight(class_weight='balanced',y=y_train)estimator.fit(x_train, y_train,sample_weight = classes_weights)
y_pred = estimator.predict(x_valid)
print(classification_report(y_true=y_valid, y_pred=y_pred))# 交叉验证网格搜索
train_data = pd.read_csv('data-train.csv')
valid_data = pd.read_csv('data-valid.csv')x_train = train_data.iloc[:, :-1]
y_train = train_data.iloc[:, -1]x_valid = valid_data.iloc[:, :-1]
y_valid = valid_data.iloc[:, -1]spliter = StratifiedKFold(n_splits=5, shuffle=True)
param_grid = {'max_depth': np.arange(3, 5, 1),'n_estimators': np.arange(50, 150, 50),'eta': np.arange(0.1, 1, 0.3)}
estimator = xgb.XGBClassifier(n_estimators=100,objective='multi:softmax',eval_metric='merror',eta=0.1,use_label_encoder=False,random_state=22)
cv = GridSearchCV(estimator,param_grid,cv=spliter)
y_pred = cv.predict(x_valid)
print(classification_report(y_true=y_valid, y_pred=y_pred))

使用网格搜索(GridSearchCV)来优化XGBoost模型的超参数。首先定义了一个参数网格(param_grid),包含了三个超参数:max_depth(树的最大深度)、n_estimators(弱学习器的数量)和eta(学习率)。然后使用GridSearchCV进行交叉验证,最后对验证集进行预测。

📀 classification_report 是一个用于评估分类模型性能的函数,它可以计算并显示主要的分类指标,如准确率、召回率、F1分数等。StratifiedKFold 是一个用于分层抽样的交叉验证方法,它确保每个折叠中类别的比例与整个数据集中的比例相同。

from sklearn.metrics import classification_report
from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression# 加载数据集
data = load_iris()
X, y = data.data, data.target# 创建分层抽样的交叉验证对象
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)# 初始化分类器
clf = LogisticRegression()# 存储预测结果和真实标签
y_true = []
y_pred = []# 进行交叉验证
for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 训练模型clf.fit(X_train, y_train)# 预测测试集y_pred_test = clf.predict(X_test)# 更新预测结果和真实标签y_true.extend(y_test)y_pred.extend(y_pred_test)# 输出分类报告
print(classification_report(y_true, y_pred))

 🏷️关于交叉验证的参数问题

spliter 是一个用于数据分割的参数,它指定了交叉验证的策略。在 GridSearchCV 中,cv 参数用于控制交叉验证的折数或具体的交叉验证策略。

如果 cv 是一个整数,那么它将表示进行多少折交叉验证。例如,cv=5 表示将数据集分成 5 份,然后进行 5-fold 交叉验证。每次迭代时,其中一份数据作为测试集,其余的数据作为训练集。

如果 cv 是一个交叉验证对象(如 KFoldStratifiedKFold 等),那么它将直接指定交叉验证的策略。这些对象可以根据特定的需求对数据进行分割,例如按照一定比例划分训练集和测试集,或者根据类别的比例进行分层抽样。

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

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

相关文章

手机投屏到电脑

手机投屏到电脑 Github 有2个开源的手机投屏项目: Scrcpy: https://github.com/Genymobile/scrcpy QtScrcpy: https://github.com/barry-ran/QtScrcpy 这2个项目都很好用,我这里用的是 Scrcpy: 官方文档中介绍了如何在windows上使用 Scrcpy…

基于龙芯2k1000 mips架构ddr调试心得(一)

1、基础知识 DDR2的I/O频率是DDR的2倍,也就是266、333、400MHz。 DDR3传输速率介于 800~1600 MT/s之间 DDR4的传输速率目前可达2133~3200 MT/s 2k1000内存:板载2GB DDR3 ,可选4GB 使用龙芯芯片最好用他们自己的Bo…

C++特性三:多态的基本语法及原理剖析

一、多态的基本语法 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运…

设计模式(结构型设计模式——桥接模式)

设计模式(结构型设计模式——桥接模式) 桥接模式 基本定义 桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。 降低了类与类之间的耦合度:脱耦就是将…

三国游戏.

问题描述 小蓝正在玩一款游戏。游戏中魏(X)、蜀(Y)、吴()三个国家各自拥有一定数量的士兵X,Y, (一开始可以认为都为 0)。游戏有n个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第个事件发生时会分别让X,Y,乙 增加Ai,Bi,Ci。 当游戏结束时…

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…

keithley2612A数字源表

181/2461/8938产品概述: Keithley 2612A源表既可用作台式I-V表征工具,也可用作多通道I-V测试系统的构建模块组件。对于台式使用,吉时利2612ASourceMeter具有嵌入式TSP Express软件工具,允许用户快速轻松地执行常见的I-V测试&…

微信小程序开发学习笔记——4.2showModal和showLoading界面交互操作

>>跟着b站up主“咸虾米_”学习微信小程序开发中,把学习记录存到这方便后续查找。 课程连接:https://www.bilibili.com/video/BV19G4y1K74d?p27&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showModal 显示模态对话框 1、属性 https:/…

基于springboot+vue的摄影网站(源码+部署说明+系统介绍+数据库)

作者主页:Java程序员老张 主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:…

C# double类型计算精度问题解决

问题:res 的值0.112450000001,精度不对,预期是0.11245 double force112.45; double res force / Math.Pow(10, index * 3); double force112.45; double res force / Math.Pow(10, index * 3); string str res.ToString(&qu…

cuda从入门到精通(五)CUDA实现AI模型中的softmax

本文系转载&#xff0c;出处&#xff1a;https://mp.weixin.qq.com/s/BbmjiE_qemmnlTC3ue2wiw CUDA常被用于加速各种AI计算密集型任务&#xff0c;如Softmax函数的计算。 以下是一个简单的CUDA实现的Softmax函数 #include <cuda_runtime.h> #include <device_launc…

Flutter,点击图标后,显示下拉条目选框

这里给出两种方式&#xff0c;一种是点击时没有动画效果的IconGestureDetector&#xff0c;另一种是点击时带动画的Material Widget自带的IconButton。 第一种&#xff1a; MouseRegion( // 用于鼠标移动到区域&#xff0c;出现小手cursor: SystemMouseCursors.click,child: T…

SSTI漏洞详解

目录 前备知识 模块引擎&#xff1a; 模块渲染函数&#xff1a; 继承关系&#xff1a; SSTI漏洞简介 SSTI漏洞成因 SSTI漏洞原理 一些常见模块介绍 php Twig模块引擎 代码演示1 Twig模块引擎代码演示2 python flask模块 代码演示1&#xff1a; python jinja模块 代…

深入理解Java并发工具包中的CyclicBarrier

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java的并发编程世界中&#xff0c;协调和管理多个线程的执行是一项复杂而关键的任务。为了简化这一挑战&#xff0c;Java并发包…

数据分析-Pandas序列滑动窗口配置参数

数据分析-Pandas序列滑动窗口配置参数 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

初探Springboot 参数校验

文章目录 前言Bean Validation注解 实践出真知异常处理 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 前言 工作中我们经常会遇到验证字段是否必填&#xff0c;或者字段的值是否…

Docker使用之java项目工程的部署

Docker使用之java项目工程的部署 若容器存在请先停止&#xff0c;在删除&#xff0c;然后删除镜像重新编译 //停止容器 sudo docker stop datatransfer//删除容器 sudo docker rm datatransfer//删除镜像 sudo docker rmi hrtransfer复制java项目工程文件jar包到 /apps/demo.…

Android线程池

一、Android中的异步方式 AsyncTask 底层用到了线程池。AsyncTask封装了线程池和Handler 主要是为了方便开发者在子线程中更新UI AsyncTask内的Handler是一个静态的Handler对象&#xff0c;为了能够将执行环境切换到主线程&#xff0c;这就要求Handler这个对象必须在主线程中创…

极客早报第3期:罗斯否认插足凯特王妃婚姻;清明放假调休3天;国产伟哥去年销售近13亿

一分钟速览新闻点&#xff01; 每日简报 罗斯否认插足凯特王妃婚姻清明放假调休3天国产伟哥去年销售近13亿男子持台球杆殴打2名女店员被抓今日春分淀粉肠小王子带货日销售额涨超10倍[高中生被打伤下体休学 邯郸通报](https://www.baidu.com/s?wd高中生被打伤下体休学 邯郸通报…

nginx 中 user 配置的作用

在 Nginx 配置文件中&#xff0c;user 指令用于指定 Nginx 运行时所使用的用户和用户组。默认情况下&#xff0c;Nginx 会以 nobody 用户的身份运行(即使使用 root 用户运行nginx进程, nginx运行过程中线程的用户还是用的nobody)&#xff0c;这是一个低权限用户&#xff0c;专门…