首页 > 编程语言 >细说机器学习算法之XGBoost及代码实现

细说机器学习算法之XGBoost及代码实现

时间:2025-01-21 23:32:14浏览次数:3  
标签:plt 细说 函数 模型 XGBoost 算法 train test

系列文章目录

第一章:Pyhton机器学习算法之KNN

第二章:Pyhton机器学习算法之K—Means

第三章:Pyhton机器学习算法之随机森林

第四章:Pyhton机器学习算法之线性回归

第五章:Pyhton机器学习算法之有监督学习与无监督学习

第六章:Pyhton机器学习算法之朴素贝叶斯

第七章:Pyhton机器学习算法之XGBoost


目录

系列文章目录

文章目录

前言

一、基本概念:

五、避免过拟合:

六、特点与优势:

七、代码实战:

八、模型调优:

九、应用领域:

总结



前言

XGBoost是一个优化的分布式梯度增强库,它在Gradient Boosting框架下实现了机器学习算法,广泛应用于分类、回归等任务中。以下是对XGBoost的详细介绍:


一、基本概念:

XGBoost,全称为eXtreme Gradient Boosting,是一个可扩展的、分布式的梯度提升决策树(GBDT)机器学习库。它提供并行树提升,并且是用于回归、分类和排序问题的领先机器学习库。

二、基本原理:

XGBoost的原理基于梯度提升算法,它通过迭代地添加预测树,每棵树都尝试纠正前一棵树的错误。XGBoost的核心思想是通过加速树的构建过程,减少计算时间,避免过拟合,并提高模型的准确性。在损失函数的优化中,XGBoost使用了二阶泰勒展开,这使得算法在处理非线性问题时更加精确。同时,为了防止过拟合,XGBoost在目标函数中加入了正则项,以控制模型的复杂度。

以下是 XGBoost 的一些关键特性:

1.目标函数:

XGBoost 通过最小化目标函数来训练模型,目标函数通常包括两部分:损失函数和正则化项。

  • 损失函数:用于衡量模型预测的误差

  • 正则化项:用于控制模型复杂度,避免过拟合

假设训练数据为 {(xi,yi)}(其中xi为特征, yi是目标变量),模型预测为 y^i,XGBoost 的目标函数可以表示为:

                      

其中:l(yi,y^i)是损失函数,通常使用平方误差(MSE)或者对数损失(log loss)

对于回归任务,损失函数为:

对于分类任务,损失函数可以为:

Ω(fk)是正则化项,用于控制模型的复杂度,防止过拟合,即对于每棵树fk ,正则化项通常包括树的叶子节点数和叶子节点的权重:

其中 T 是树的叶子数, γ是控制树复杂度的参数, λ是控制权重大小的参数, wj是第 j个叶子的权重。

2.模型原理:

XGBoost 是基于加法模型的,每一次迭代都会生成一个新的模型(树),并将其与现有模型的预测结果结合。

具体来说,假设当前模型为 fm(x),第 m 次迭代中拟合的树为hm(x) ,最终的预测模型为:

                          

其中,αm是学习率(步长),其控制每棵树的影响力。

3.二阶梯度优化:

XGBoost 的一个关键创新是在训练过程中使用了二阶梯度信息(即Hessian矩阵),而传统的 GBDT 通常只使用一阶梯度。

通过引入二阶梯度,XGBoost 能够进行更精确的优化,加速模型的收敛。

具体来说,XGBoost 的损失函数在每次迭代时采用泰勒展开(二阶近似)来简化优化过程。

设当前模型为 ,Ft-1(x)损失函数  l(yi,F(xi))关于当前预测值的梯度分别为一阶导数 gi和二阶导数 hi,那么在第 t 轮迭代中,XGBoost 的目标是最小化以下二阶近似的损失函数:

                      

通过使用二阶梯度,XGBoost 能够更精确地捕捉损失函数的曲率,提高优化效率。

4.树的构建和增益:

XGBoost 在构建树时,通过优化分裂点的增益来选择最优的分裂。树的分裂增益定义为:

其中:

  • GL 和  GR分别是左子树和右子树的梯度和。

  • HL 和  HR分别是左子树和右子树的 Hessian 和。

  • G 和 H 是当前节点的梯度和 Hessian。

通过计算增益,XGBoost 可以在每个节点选择最优的分裂特征,最大化模型的分辨能力。

五、避免过拟合:

XGBoost作为由多个弱分类器(决策树)所组成的强分类器,依旧需要剪枝来优化,通常采用后剪枝。传统的 GBDT 通常通过深度控制来避免树过深,但 XGBoost 通过构建完整的树后,才进行剪枝操作,去除一些无效的分支,从而减少模型复杂度,提高泛化能力。

六、特点与优势:

  1. 高效性:XGBoost能够利用多核处理器进行并行计算,加速模型训练过程。同时,它使用了剪枝技术来减小树的规模,降低模型的复杂度,提高泛化能力。
  2. 准确性:由于XGBoost在损失函数的优化中使用了二阶泰勒展开,并加入了正则化项,因此它能够取得更高的预测准确性。
  3. 灵活性:XGBoost支持多种类型的损失函数,可以用于回归、分类、排序等多种问题。同时,它还支持特征维度的并行处理,提高了算法的训练效率。
  4. 鲁棒性:XGBoost对缺失值有较好的处理能力,能够自动学习最优的分裂点来处理缺失数据。此外,它还能够通过调整参数来控制模型的复杂度,以防止过拟合。

七、代码实战:

#导入所需的库
from sklearn.datasets import load_iris
from xgboost.sklearn import XGBClassifier
from xgboost import plot_importance
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 加载鸢尾花数据集
iris = load_iris()
x, y = iris.data, iris.target
# 数据集分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=12345)
# 创建XGBoost模型
clf = XGBClassifier(booster='gbtree', #给定模型求解方式 可选参数gbtree、gblinear、dart
                    objective='multi:softmax',  #设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)
                    num_class=3,
                    gamma=0.1,   #指定节点分裂所需的最小损失函数下降值
                    max_depth=6,  #最大树深
                    reg_lambda=2, # 权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。
                    subsample=0.7, #对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
                    colsample_bytree=0.7, #控制每棵随机采样的列数的占比(每一列是一个特征)
                    min_child_weight=3, #用于控制子节点中样本的最小权重和
                    eta=0.1,  #每一步迭代的步长
                    seed=1000,
                    nthread=4,  #使用的线程数
                    eval_metric=['mlogloss','merror'], #设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)
                    #   n_estimators=10 #弱分类器的数量
                    #   learning_rate=0.3 #学习率
                    #   reg_alpha=0  #L1正则化权重项,增加此值将使模型更加保守
                   )




clf=clf.fit(x_train,y_train)


# 输出准确率
y_pred = clf.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print('accuracy:%.2f%%'%(accuracy*100))
 

绘制损失曲线:

# 创建训练和测试数据集评估
evals = [(x_train, y_train), (x_test, y_test)]
# 训练模型并记录每一轮的评估指标
history=clf.fit(x_train, y_train,eval_set=evals,verbose=True)


# 获取训练过程中的 loss 和 accuracy 曲线
eval_result = clf.evals_result()
train_merror = eval_result['validation_0']['merror']
test_merror = eval_result['validation_1']['merror']
train_mlogloss = eval_result['validation_0']['mlogloss']
test_mlogloss = eval_result['validation_1']['mlogloss']


plt.figure(figsize=(12,6))
# 绘制损失曲线
plt.subplot(1, 2, 1)
plt.plot(range(len(train_mlogloss)), train_mlogloss, label='Train mlogloss', color='#F7A8B8')
plt.plot(range(len(test_mlogloss)), test_mlogloss, label='Test mlogloss', color='#A1E6A1')
plt.xlabel('Iterations')
plt.ylabel('Log Loss')
plt.title('Log Loss vs Iterations')
plt.legend()

效果如下:

绘制准确率曲线:

# 绘制准确率曲线
plt.subplot(1, 2, 2)
plt.plot(range(len(train_merror)), 1 - np.array(train_merror), label='Train Accuracy', color='#87CEFA')
plt.plot(range(len(test_merror)), 1 - np.array(test_merror), label='Test Accuracy', color='#E1B0D7')
plt.xlabel('Iterations')
plt.ylabel('Accuracy')
plt.title('Accuracy vs Iterations')
plt.legend()
plt.tight_layout()
plt.show()

效果如下:

# 可视化分类结果
def visualize_classification(X_train, y_train, X_test, y_test, y_pred, iris):
    plt.figure(figsize=(12, 6))
    colors = ['#F7A8B8','#FFFACD','#A1E6A1']
    # 子图 1: 训练集分类结果
    plt.subplot(1,2,1)
    for i,color in zip(range(3),colors):
        plt.scatter(X_train[y_train==i,0], X_train[y_train ==i,1],color=color,edgecolors='k',label=iris.target_names[i])
    plt.title('Training Set Classification')
    plt.xlabel(iris.feature_names[0])
    plt.ylabel(iris.feature_names[1])
    plt.legend()
    # 子图 2: 测试集分类结果
    plt.subplot(1,2,2)
    for i,color in zip(range(3),colors):
        plt.scatter(X_test[y_test ==i,0], X_test[y_test ==i,1],color=color,edgecolors='k',label=iris.target_names[i])
    plt.title('Test Set Classification')
    plt.xlabel(iris.feature_names[0])
    plt.ylabel(iris.feature_names[1])
    plt.legend()
    plt.tight_layout()
# 调用可视化函数
visualize_classification(x_train,y_train,x_test,y_test,y_pred,iris)

效果如下:

八、模型调优:

  1. 数据预处理:在使用XGBoost之前,需要对原始数据进行清洗和预处理,包括处理缺失值、处理异常值、特征选择、数据标准化等操作。
  2. 划分训练集和测试集:为了评估模型的性能,需要将数据集划分为训练集和测试集。通常,80%的数据用于训练,20%的数据用于测试。
  3. 参数调优:XGBoost模型中有许多参数可以调整,如学习率、树的数量、树的深度等。通过交叉验证和网格搜索等技术,可以找到最优的参数组合。
  4. 训练模型:使用训练集进行模型训练。XGBoost模型会根据损失函数的定义逐步优化分类器,生成多个决策树模型。
  5. 模型评估:使用测试集对训练好的模型进行评估。常见的评估指标包括准确率、精确率、召回率、F1值等。

九、应用领域:

XGBoost在多个领域都有广泛的应用,包括但不限于:

  1. 金融风控:如信用卡欺诈检测、信贷审批等。
  2. 推荐系统:如商品推荐、新闻推荐等。
  3. 生物医学:如基因表达数据分析、疾病诊断中构建精确的模型等。
  4. 中医药领域:常被用于复发预测研究,如针对缺血性脑卒中患者中医药治疗的复发构建XGBoost模型进行预测。

总结

综上所述,XGBoost是一个功能强大、灵活性高的机器学习算法,它通过梯度提升的方法构建了一系列的决策树,每棵树都在尝试减少前一棵树的残差。XGBoost的正则化项和二阶泰勒展开是其核心技术,使得它在各种数据集上都能取得很好的性能。同时,它对缺失值的有效处理和并行化支持也使得它在处理大规模数据时更加高效。

标签:plt,细说,函数,模型,XGBoost,算法,train,test
From: https://blog.csdn.net/qq_65664454/article/details/145290424

相关文章

  • GRFB UNet——基于多尺度注意网络盲道检测算法实现与模型C++部署
    GRFBUNet——基于多尺度注意网络盲道检测算法实现与模型C++部署1.概述盲道是视障人士安全出行的重要辅助设施。识别盲道的形状和位置,对于增强视障人士的自主移动能力至关重要,而视觉分割技术正是应对这一挑战的有效工具。为了显著提升盲道分割的精确度和稳定性,本文提出了......
  • 2.优化算法
    2.1小批量梯度下降应用:深度学习处理大数据集的时候会选用小批量梯度下降算法深度学习在大数据领域应用广泛,但是海量数据的训练又涉及速度问题,所以选择算法就尤其重要。批量梯度下降:可以同时处理整个训练集(完整的训练集X,Y)举例:把一个500w的训练集分成1000份,每份5000个......
  • 2025牛客寒假算法基础集训营1
    A.茕茕孑立之影题意:给你\(n\)个数,你要找一个数使得这个数和数组的任意一个数都不成倍数关系。如果数组里有\(1\)肯定不行,\(1\)是所有数的因子。其他情况我们只需要找一个大质数就行,因为值域只有\(1e9\),可以输出\(1e9+7\)。点击查看代码voidsolve(){ intn; std::cin>>......
  • 2025牛客寒假算法基础集训营1 ptlks的题解
    A.茕茕孑立之影题意:给定序列,找出一个数x,满足x和数组中任意一个元素都互不为倍数关系思路x范围为1e18以内,序列元素范围为1e9以内,选大于1e9的质数即可,特判序列中有1的情况。代码点击查看代码voidsolve(){ intn; cin>>n; intf=1; for(inti=1;i<=n;i++){ cin>>a[......
  • 头歌实训作业 算法设计与分析-贪心算法(第2关:最优装载问题)
    任务描述有一批集装箱要装上一艘载重量为C的轮船,共有n个集装箱,其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。测试说明输入和输出说明:第1行为集装箱数目n和载重限制C第2行~第n+1行为n个集装箱的重量输出最优装载......
  • 将机器学习算法移植到低端MCU上的实用指南
    将机器学习算法移植到低端MCU上的实用指南在物联网(IoT)和边缘计算迅猛发展的今天,将智能功能嵌入到资源有限的低端单片机(MicrocontrollerUnit,MCU)上,已经成为许多开发者和工程师追求的目标。然而,这一过程充满挑战,但只要掌握正确的方法,也能在低端MCU上实现高效的机器学习应用。......
  • 元强化学习算法—— EMCL —— 《Adapting to Dynamic LEO B5G Systems Meta-Critic L
    原文地址:https://orbilu.uni.lu/bitstream/10993/52996/1/Adapting_to_Dynamic_LEO-B5G_Systems_Meta-Critic_Learning_Based_Efficient_Resource_Scheduling.pdfPS:大概距离这个论文是fake的,无法做验证,其中对引用的算法的描述也是错的,基于一堆错误的东西能搞错对的东......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • osgearth夜视效果(粗步实现,夜视算法后续改进)
    夜视效果关键代码 //后期资源 std::string strVertShaderFile="../EarthData/Shaders/Post/Post.vert.glsl"; std::string strFragShaderFile="../EarthData/Shaders/Post/Post.frag.glsl"; std::string strPostImageFile="../EarthData/Texture/Ra......
  • 数据结构与算法之递归: LeetCode 39. 组合总和 (Ts版)
    组合总和https://leetcode.cn/problems/combination-sum/description/描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合candid......