XGBoost基本介绍(机器学习ML神器)

这篇具有很好参考价值的文章主要介绍了XGBoost基本介绍(机器学习ML神器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍:

XGBoost整体思想就是直接把损失函数和正则项加起来合成一个整体的损失函数,对这个损失函数求二阶导,得到最终的obj,通过obj计算得到一个分数,这个分数越小越好,最终通过obj计算得到的分数确定了树的结构和整个强学习器的分数。所以XGBoost不是通过拟合残差实现的,而是计算obj函数直接得到的树结构。

XGBoost基本介绍(机器学习ML神器)

基于Boosting(梯度提升)思想,利用梯度下降思想,XGBoost在机器学习里面所有算法里面算效果很好的了,对于很多竞赛,都是用XGBoost获得了很好的名词,XGboost中所有的树都是二叉树,以CART树算法作为主流。

对于回归树:预测结果会落在每片叶子上,回归树会将叶子上的数值求平均就是这片叶子结点的回归结果。

对于分类树:最终类别号会落在每篇叶子上,叶子会遵循少数服从多数的结果,给出最终预测结果。

对于梯度提升树来说,整体思想就是将每棵树的预测结果加权后将所有的树分值求和就是这个样本在整个继承算法上的预测结果。

XGBoost基本介绍(机器学习ML神器)

对于xgboost来说

XGBoost基本介绍(机器学习ML神器)

基于树的集成学习优点:

基于树的集成学习不用做特征归一化,使用起来非常方便。

基于树的集成学习可以做到特征组合,不用自己做升维。

集成学习可以做大规模数据并行处理。使得训练过程更快。

目标有两个部分组成

XGBoost基本介绍(机器学习ML神器)

Train Loss:评估训练数据拟合的多好

Regularization:正则项,提高模型的泛化能力,能够更好的再测试集或者预测集预测的更准确。

我们要去优化这个目标函数。

GBDT并没有考虑模型的复杂度,XGBoost有考虑模型的复杂度,加入了正则项。

我们希望训练的模型即有最少的loss也有比较好的泛化能力。

对于每棵树来说我们要求树的结构和叶子节点分值。

基于树的目标函数

XGBoost基本介绍(机器学习ML神器)

基于树的集成学习,我们没有W参数,但是也有要求的参数,就是树的结构和叶子结点的分值。

对于正则项,我们希望参数W越小越好,那么体现在树的结构上就是希望树的结构和叶子结点的分值越小越好(越小越能提高泛化能力)。

不管做什么业务分类还是回归,我们都可以用回归树。

目标式和启发式

启发式:

(1)对每个叶子节点分类的时候用的信息增益。

(2)剪枝(前剪枝,后剪枝)。

(3)树的最大深度,限制树的增长相当于限制树的范围。

(4)缩小叶子的分值。

XGBoost采用目标式:

目标式(比较直观,通过obj目标函数可以直观地看到我们要学的是什么)

(1)分裂的指标改成traning loss

(2)剪枝-->通过设置正则项控制剪枝。

(3)树的最大深度-->通过控制函数空间。

(4)平滑叶子结点的分值-->L2正则项放到叶子节点。

xgboost库介绍

使用XGboost我们通常有两个库,一个是xgboost库,一个是sklearn里面封装的XGboost类。

xgboost库建模流程:

XGBoost基本介绍(机器学习ML神器)

sklearn:xgb.XGBRegressor()

参数:

XGBoost基本介绍(机器学习ML神器)

n_estimators(树的数量):默认是100

在我们调参过程中发现,当我们的树数量很少的时候,树的数量对模型影响非常大,但是当树的数量达到一定的数量之后,对模型的效果就是一条直线,分数不会再有较大的提高。

所以当树的数量达到一个合理值后,在徒劳的增加树的数量是不会再有效的,只会增加计算量。

所以XGBoost和随机森林不一样不能盲从的相信n_estimators这个参数,一般这个参数不要调的太大,300一下最佳(结合学习曲线)。

slient:是否打印每次训练过程,默认False

xgboost:xhgb.train()

subsample随机抽样的参数:

XGBoost控制随机抽样的参数,默认是1,也就是说默认是100%抽样,对于较大的数据集,我们可以调整这个参数进行抽样,但是对于较少的数据量如果还要进行随机抽样的话,就有可能让模型因为数据量太少而学习不到较好的参数,所以这样的情况我们选择不适用这个参数。

eta:xgboost(eta),sklearn(learning_rate)决策树的步长,梯度下降的学习率

取值范围[0,1]

η用来控制迭代步长,η越大迭代速度越快,算法很快就能达到极限,但有可能无法收敛到最佳。

η越小迭代速度越慢,但有可能熟练不到最佳值。

我们要找的就是最快效果也是最好的值。

通常我们调整η主要是用来调整运行时间,一般简单调整一下步长就实现收敛,调整树模型效果主要还是用剪枝等操作。

XGBoost在设计时使其不仅可以使用树模型,还可以使用其他模型

booster控制我们究竟选择怎样的弱评估器。(在XGBoost中不是很常用)

gbtree:梯度提升树

gblinear:使用线性模型,线性模型,只有数据是线性的时候,才使用这个。 

dart:抛弃提升树,在建树的过程中抛弃一部份树,比梯度提升书有更好的防止过拟合的功能。

# 使用波士顿房价数据集,发现gblinear这个弱评估器分数不高,也说明波士顿房价特征并不是线性的数据   

 for booster in ["gblinear", "gbtree", "dart"]:
        reg = XGBRegressor(n_estimators=100,
                     learning_rate=0.1,
                     random_state=10,
                     booster=booster).fit(X_train, y_train)
        print(booster)
        print(reg.score(X_test, y_test))


gblinear
0.5462737865128029
gbtree
0.831708286367204
dart
0.8317082711597155

Objective:XGBoost损失函数

XGBoost基本介绍(机器学习ML神器)

 linear:均方误差作为损失函数

logistic:log_loss二分类

hinge:支持向量机二分类

multi:softmax多分类

也可以自定义损失函数

正则化系数对应的参数

reg_alpha:L1正则默认0
reg_lambda:L2正则默认1

所以XGboost默认使用L2正则化

gamma:让树停止生长的重要参数,默认是0

在XGBoost中,只要分数之差Gain大于0,目标函数就能继续减小,我们就允许树继续分支。

所以有

XGBoost基本介绍(机器学习ML神器)

我们对gamma设置某个值,就是对Gain分支进行限制。

所以gamma设置越大,树的复杂度就越低。但是也不能过低,过低的话有可能就无法充分学习。

xgboost.cv:XGboost自带的用于交叉验证的类

from xgboost import XGBRegressor
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.datasets import load_boston            # y是回归类型的变量,所以用来做分类
from sklearn.metrics import mean_squared_error      # 模型评估指标
from sklearn.feature_selection import SelectFromModel   # 嵌入法选择特征
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import ShuffleSplit, learning_curve, KFold

data = load_boston()
X = data.data
y = data.target

def XGb_test():

    # 特征选择,xgboost是可以自己选择特征的,但是如果特征过多也可以使用嵌入发进行选择特征。



    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=20)
    """
    reg = XGBRegressor(n_estimators=100).fit(X_train, y_train)
    y_predict = reg.predict(X_test)
    print(reg.score(X_test, y_test))        # 用R平方做回归指标
    print(reg.feature_importances_)
    print(mean_squared_error(y_predict, y_test))    # 用均方误差做回归指标
    """
    """
    # XGboost使用交叉验证
    reg = XGBRegressor(n_estimators=100, silent=True)
    score_xgb = cross_val_score(reg, X, y).mean()
    print(score_xgb)

    # 随机森林使用交叉验证
    rfr = RandomForestRegressor(n_estimators=100)
    score_rfr = cross_val_score(rfr, X, y).mean()
    print(score_rfr)

    # 使用线性回归
    lr = LinearRegression()
    score_lr = cross_val_score(lr, X, y).mean()
    print(score_lr)

    # 0.6460769617602883    xgboost
    # 0.615660483359535     随机森林
    # 0.3532759243958772    线性回归
    """
    # 画出学习曲线
    def study_curve(estimator, X, y, cv, title, ax=None, ylim=None, n_jobs=None):
        train_sizes_abs, train_score, test_score = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs)

        if ax is not None:
            ax.set_title(title)
            if ylim is not None:
                ax.set_ylim(*ylim)
            ax.set_xlabel("train_samples")
            ax.set_ylabel("score")
            ax.grid()
            ax.plot(train_sizes_abs, np.mean(train_score, axis=1), 'o-', color='r', label="train_score")
            ax.plot(train_sizes_abs, np.mean(test_score, axis=1), 'o-', color='r', label="test_score")
            ax.legend()
        else:
            plt.title(title)
            if ylim is not None:
                plt.ylim(*ylim)
            plt.xlabel("train_samples")
            plt.ylabel("score")
            plt.grid()
            plt.plot(train_sizes_abs, np.mean(train_score, axis=1), 'o-', color='r', label="train_score")
            plt.plot(train_sizes_abs, np.mean(test_score, axis=1), 'o-', color='g', label="test_score")
            plt.legend()


        """
        if ax == None:
            ax = plt.gca()
        else:
            ax = plt.figure()
        ax.set_title(title)
        if ylim is not None:
            ax.set_ylim(*ylim)
        ax.set_xlabel("train_samples")
        ax.set_ylabel("score")
        ax.grid()
        ax.plot(train_sizes_abs, np.mean(train_score, axis=1), 'o-', color='r', label="train_score")
        ax.plot(train_sizes_abs, np.mean(test_score, axis=1), 'o-', color='r', label="test_score")
        ax.legend()
        #return ax
        """

    cv = ShuffleSplit(n_splits=50, test_size=0.2, random_state=10)
    # fig, axes =  plt.subplots(1,1,
    #                           figsize=(10,10))
    # cv = KFold(n_splits=5, shuffle=True, random_state=42)
    study_curve(XGBRegressor(n_estimators=100), X_train, y_train, cv, title="XGBRegressor", ax=None, ylim=[0.5, 1.2], n_jobs=-1)
    plt.show()

def Xgb_curve():
    axies = range(1, 1010, 50)
    scores = []
    # 画出学习曲线找到比较好的n_estimators个数
    for i in range(0, 1010, 50):
        xgb = XGBRegressor(n_estimators=i)
        score = cross_val_score(xgb, X, y, cv=10).mean()
        scores.append(score)

    plt.figure(figsize=(20, 5))
    plt.title("XGBRegressor")
    plt.grid()
    plt.xlabel("树个数")
    plt.ylabel("分数")
    plt.plot(range(0, 1010, 50), scores, color='r', label="train_score")
    print(axies[scores.index(max(scores))], max(scores))
    plt.show()



if __name__ == "__main__":
    # XGb_test()
    Xgb_curve()

参数:

num_round(树的数量):默认是10

slient:是否打印每次训练过程,默认True

XGBoost剪枝参数

XGBoost作为树模型也是容易过拟合的模型。所以我们需要对XGBoost进行剪枝。

max_depth:最大深度(先调这个参数)除了n_estimators外调的第一个参数。

consample_bylevel:生成树的每一层时随机抽样特征比例。

consample_bynode:每次生成一个叶子节点时随机抽样特征比例。

min_child_weight:叶子节点上的二阶导数之和。

剪枝用的最多的还是gamma和max_depth

XGBoost处理样本不均衡问题

scale_pos_weight:默认是1

应该填写的参数是多数类除以少数类。

总结:

把启发式的步骤统统设计到目标式的函数中。

目标函数是loss加上正则项。

basemodel是回归树,我们要学习的是f1...fk这些小树。

我们希望模型既能准确,又能有一定的泛化能力。

XGboost也是过拟合的模型,所以剪枝也是非常重要的。文章来源地址https://www.toymoban.com/news/detail-452455.html

到了这里,关于XGBoost基本介绍(机器学习ML神器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 机器学习中XGBoost算法调参技巧

    机器学习中XGBoost算法调参技巧

    本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。 对于XGBoost来说,默认的超参数是可以正常运行的,但是如果你想获得最佳的效果,那么就需要自行调整一些超参数来匹配你的数据,以下参数对于XGBoost非常重要: eta num_boos

    2024年02月11日
    浏览(12)
  • 机器学习——线性代数中矩阵和向量的基本介绍

    机器学习——线性代数中矩阵和向量的基本介绍

    矩阵的基本概念(这里不多说,应该都知道) 而向量就是一个特殊的矩阵,即向量只有一列,是个n*1的矩阵 注 :一般矩阵用大写字母表示,向量用小写字母表示 先从简单开始,即一个矩阵和一个向量相乘的运算 矩阵相乘的结果的维度为 m*k 矩阵乘法满足结合律不满足交换律

    2024年02月21日
    浏览(15)
  • 机器学习-使用 XGBoost 时间序列预测能源消耗

    机器学习-使用 XGBoost 时间序列预测能源消耗

    简而言之,时间序列预测是根据以前的历史数据预测未来值的过程。目前使用时间序列预测的最热门领域之一是加密货币市场,人们希望预测比特币或以太坊等流行加密货币的价格在未来几天甚至更长时间内将如何波动。另一个现实世界的案例是能源消耗预测。尤其是在能源

    2024年02月11日
    浏览(15)
  • linuxer眼中ml.net机器学习概要

    linuxer眼中ml.net机器学习概要

    https://github.com/markjprice/cs12dotnet8 https://github.com/markjprice/cs12dotnet8/blob/main/docs/ch01-dotnet-history.md 这里讲的很清楚   现代.net和以前的.net框架的关系,如下图  其中.net5是一个关键的跨越版本,在这后.net完全的跨平台统一了 2020 年 11 月合并为 .NET 5 这样的单一线程。(注意, .NE

    2024年02月05日
    浏览(28)
  • 机器学习分布式框架ray运行xgboost实例

            Ray是一个开源的分布式计算框架,专门用于构建高性能的机器学习和深度学习应用程序。它的目标是简化分布式计算的复杂性,使得用户能够轻松地将任务并行化并在多台机器上运行,以加速训练和推理的速度。Ray的主要特点包括支持分布式任务执行、Actor模型、

    2024年02月15日
    浏览(15)
  • 机器学习xgboost pytorch lstm 价格预测开发模板
  • 在 Azure ML 上用 .NET 跑机器学习

    在 Azure ML 上用 .NET 跑机器学习

    .NET 是一个跨平台,全场景应用的开源技术。 你有在用 .NET 做机器学习/深度学习的应用吗?如果从框架角度, ML.NET / Tensorflow.NET / 不断在进步的 TorchSharp 通过几年的发展已经开始稳定,但如果在一些大型项目上,特别现在与云端环境的对接上都是非常重要的,毕竟云端可以帮

    2024年02月05日
    浏览(10)
  • 机器学习 | Python实现XGBoost极限梯度提升树模型答疑

    问题系列 关于XGBoost有几个问题想请教一下。1.XGBoost的API有哪些种调用方法?2.参数如何调? 问题回答 XGBoost的API有2种调用方法,一种是我们常见的原生API,一种是兼容Scikit-learn API的API,Scikit-learn API与Sklearn生态系统无缝集成。 对于XGBoost来说,默认的超参数是可以正常运行的

    2024年02月09日
    浏览(14)
  • 机器学习:基于XGBoost对信用卡欺诈行为的识别

    机器学习:基于XGBoost对信用卡欺诈行为的识别

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 大家好,我

    2024年02月08日
    浏览(45)
  • 机器学习_集成学习_梯度提升_回归_决策树_XGBoost相关概念

    目录 1. 机器学习 使用监督吗?什么又是监督学习? 2. 与XGBoost 类似的机器学习方法有哪些? 3. 随机森林方法 和 梯度提升方法 有什么区别? 分别应用于什么场景? 4. 决策树回归方法 和 Gradient Boosting类回归方法 有什么区别和联系? 5. 什么是集成学习? 6. 多元线性回归方法

    2024年04月26日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包