XGBoost调参步骤及常见问题

article/2025/10/20 9:43:07

XGBoost

xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)

booster参数

  • max_depth[默认6]

    和GBM中的参数相同,这个值为树的最大深度。
    这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
    需要使用CV函数来进行调优。
    典型值:3-10

  • eta[默认0.3]

    和GBM中的 learning rate 参数类似。
    通过减少每一步的权重,可以提高模型的鲁棒性。
    典型值为0.01-0.2

  • base_score [ 默认0.5 ]
    所有实例的初始化预测分数,全局偏置;
    为了足够的迭代次数,改变这个值将不会有太大的影响。

  • min_child_weight[默认1]
    决定最小叶子节点样本权重和。
    和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。
    这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
    但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。

  • max_leaf_nodes

    树上最大的节点或叶子的数量。
    可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成 n 2 n^2 n2个叶子。
    如果定义了这个参数,GBM会忽略max_depth参数。

  • gamma[默认0]

    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。
    这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。

  • max_delta_step[默认0]

    这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
    通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。
    这个参数一般用不到,但是你可以挖掘出来它更多的用处。

  • subsample[默认1]

    和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。
    减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
    典型值:0.5-1

  • colsample_bytree[默认1]

    和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
    典型值:0.5-1

  • colsample_bylevel[默认1]

    用来控制树的每一级的每一次分裂,对列数的采样的占比。
    我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。

  • lambda[默认1]

    权重的L2正则化项。(和Ridge regression类似)。
    这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

  • alpha[默认1]

    权重的L1正则化项。(和Lasso regression类似)。
    可以应用在很高维度的情况下,使得算法的速度更快。

  • scale_pos_weight[默认1]

    在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛

学习目标参数

这个参数用来控制理想的优化目标和每一步结果的度量方法

  • objective [ default=reg:linear ]

    定义学习任务及相应的学习目标,可选的目标函数如下:

    • “reg:linear” —— 线性回归。
    • “reg:logistic”—— 逻辑回归。
    • “binary:logistic”—— 二分类的逻辑回归问题,输出为概率。
    • “binary:logitraw”—— 二分类的逻辑回归问题,输出的结果为wTx。
    • “count:poisson”—— 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
    • “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
    • “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
    • “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
  • eval_metric [ default according to objective ]
    对于回归问题,默认值是rmse,对于分类问题,默认值是error。

    • rmse 均方根误差
    • mae 平均绝对误差
    • logloss 负对数似然函数值
    • error 二分类错误率(阈值为0.5)
    • merror 多分类错误率
    • mlogloss 多分类logloss损失函数
    • auc 曲线下面积
  • seed [ default=0 ]
    随机数的种子。缺省值为0


from sklearn.model_selection import train_test_splittrain_x, test_x, train_y, test_y = train_test_split(feature_matrix, labels, random_state=0)import xgboost as xgb
dtrain=xgb.DMatrix(train_x,label=train_y)
dtest=xgb.DMatrix(test_x)params={    'booster': 'gbtree',            'objective': 'multi:softmax',  # 多分类的问题'num_class': 10,               # 类别数,与 multisoftmax 并用'gamma': 0.1,                  # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。'max_depth': 12,               # 构建树的深度,越大越容易过拟合'lambda': 2,                   # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。'subsample': 0.7,              # 随机采样训练样本'colsample_bytree': 0.7,       # 生成树时进行的列采样'min_child_weight': 3,'silent': 1,                   # 设置成1则没有运行信息输出,最好是设置为0.'eta': 0.1,                  # 如同学习率'seed': 1000,'nthread': 10                 # cpu 线程数,默认值为最大可能的线程数
}watchlist = [(dtrain,'train')]bst=xgb.train(params,dtrain,num_boost_round=100,evals=watchlist)y_pred=bst.predict(dtest)y_pred_binary = (ypred >= 0.5)*1from sklearn import metrics
print 'AUC: %.4f' % metrics.roc_auc_score(test_y,y_pred)
print 'ACC: %.4f' % metrics.accuracy_score(test_y,y_pred_binary)
print 'Recall: %.4f' % metrics.recall_score(test_y,y_pred_binary)
print 'F1-score: %.4f' %metrics.f1_score(test_y,y_pred_binary)
print 'Precesion: %.4f' %metrics.precision_score(test_y,y_pred_binary)
metrics.confusion_matrix(test_y,y_pred_binary)

参数调优的一般方法

我们会使用和GBM中相似的方法。需要进行如下步骤:

  • 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。
  • 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数。
  • xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
  • 降低学习速率,确定理想参数。
import xgboost as xgbdata_train = xgb.DMatrix('agaricus_train.txt')
data_test = xgb.DMatrix('agaricus_test.txt')
print (data_train)
print (type(data_train))# 设置参数
param = {'max_depth': 3, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic'} # 可以显示每一颗树添加后的误差
watchlist = [(data_test, 'eval'), (data_train, 'train')]
n_round = 50
bst = xgb.train(param, data_train, num_boost_round=n_round, evals=watchlist, obj=log_reg, feval=error_rate)# 计算错误率
y_hat = bst.predict(data_test)
y = data_test.get_label()
print(y_hat)
print(y)

XGBoost常见问题

xgboost 什么场景不适用

数据量很大以及特征比较多时太耗内存,太慢了,比如寻找最优特征分裂点时需要遍历所有特征去计算(虽然做了预排序和并行处理) ,但它还是很慢和很耗内存,需要读取所有数据到内存中才好做特征分裂。

GDBT 和Xgboost 的区别?

好的地方: 二阶泰勒展开,节点分数惩罚正则,增益计算不同,gbdt 是gini,xgb 是优化推导公式

  • 传统的GBDT以CART作为基分类器,XGboost 还支持线性分类器,这时候xgboost 相当于带L1 和L2 正则化项的逻辑斯蒂回归(分类问题) 或者线性回归。

  • 传统的GBDT在优化时只用到了一阶导数信息,xgboost 则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,xgboost 还支持自定义代价函数,只要函数可一阶和二阶求导。

  • Xgboost 在代价函数中加入了正则项,用于控制模型的复杂度,正则项里包含了 树的叶子节点个数,每个叶子节点上输出的score 的L2 模的平方和。从Bias -variance tradeoff 角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也就是xgboost 优于传统CBDT的一个特性。

  • Shrinkage ,相当于学习速率(xgboost 中的eta) .Xgboost 在进行完一次迭代后,会将叶子节点上权重·乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间,实际应用中,一般把eta 设置的小一点,然后迭代次数设置的大一点。

  • 列抽样,: xgboost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost 异于传统gdbt 的一个特性。

  • 缺失值的处理,对特征的值有缺失的样本,xgboost 可以自动学习出它分裂的方向。

  • xgboost 支持并行,不是在trees 粒度的并行,而是在特征粒度上的,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点) ,xgboost 在训练之前,预先对数据进行了排序,然后保存了block 结构,后面的迭代中重复使用了这个结构,大大减少了计算量。在进行节点分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算可以开多线程进行。

  • 可并行的近似直方图算法,树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有节能的分割点,当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost 还提出了一种可并行的近似直方图算法,用于高效的生成候选的分割点。

XGBoost 和lgb 的区别

是对GBDT 方法的不同实现,针对同一目标,做了不同的优化处理。

它们在基础逻辑上并没有啥不同,限定max_tree或者max_iterations,之后算法从0 棵树开始跑,每一轮根据上一轮的残差增加一颗决策树,在每一次增加决策树的时候选择当前最优结构,而在生成当前决策树的过程中,采用了不同的优化方案。

  • XGBoost 使用基于预排序的决策树算法,每遍历一个特征需要计算一次特征增益,时间复杂度为Q(datafeature).

lgb 使用基于直方图的决策树算法,直方图的优化算法只需要计算k 次,时间复杂度为O(kfeature)

  • XGBoost 按照层生长的决策树生成,LGb采用带有深度限制的叶子节点算法,在分裂次数相同的情况下,leaf-wise 可以降低更多的误差,得到更好的精度,leaf-wise 的缺点在于会产生较深的决策树,产生过拟合。

  • 支持类别特征,不需要进行独热编码处理。

  • 优化了特征并行和数据并行算法,除此之外还添加了投票并行方案。

  • 采用基于梯度的单边采用来保持数据分布,减少模型因数据分布发生变化而造成的模型精度下降。

  • 特征捆绑转化为图着色问题,减少特征数量。

XGBoost分裂终止条件

  • 当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思(其实我这里有点疑问的,一般后剪枝效果比预剪枝要好点吧,只不过复杂麻烦些,这里大神请指教,为啥这里使用的是预剪枝的思想,当然Xgboost支持后剪枝),阈值参数为γγ 正则项里叶子节点数T的系数(大神请确认下);

  • 当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,这个好理解吧,树太深很容易出现的情况学习局部样本,过拟合;

  • 当样本权重和小于设定阈值时则停止建树,这个解释一下,涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;


http://chatgpt.dhexx.cn/article/8yx3052c.shtml

相关文章

LightGBM原理介绍

简介 是GBDT模型的一个进化版本,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点(备注:容易出现过拟合的风险,需要限制树的最大深度来防止过…

lightbgm参数_参数调优LightGBM-商品分类-代码

1.直接调用LightGBM内嵌的cv寻找最佳的参数n_estimators(弱分类器数目) Otto商品分类数据 导入必要模型import lightgbm as lgbm import pandas as pd import numpy as np from sklearn.model_selection import GridSearchCV from sklearn.model_selection import StratifiedKF…

Xgboost回归四种调参方法及Python简单实现

前言 Xgboost对特征工程和数据处理比较友好,相比之下调参成为用好Xgboost重要的一环,本文分别从参数、调参方法、Python实现的维度进行梳理,作为调参思路的记录。 本文将关注以下几个问题: 1.Xgboost哪些参数需要调参&#xff…

Python机器学习10——梯度提升

本系列所有的代码和数据都可以从陈强老师的个人主页上下载:Python数据程序 参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021. 本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现机器学…

【机器学习】集成学习代码练习

课程完整代码:https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000wzu.edu.cn import warnings warnings.filterwarnings("ignore") import pandas as pd from sklearn.model_selection …

Keras 1.0 与 2.0 中 Convolution1D 的区别(其实是tf1.0 2.0 区别)

1.0 Convolution1D: 一维卷积层 nb_filter: 卷积核的个数 filter_length: 每个卷积核的长度 init: 权重初始化函数名称 weights: 权重初始化 border_mode: valid, same or full 如果是‘valid ’ 进行有效的卷积,对边界数据不处理,‘same表示保留…

数据挖掘入门_Task04

线性回归模型 线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。 可以直接使用sklearn建立线性模型: from sklearn.linear_model import LinearRegression model LinearRegression(n…

task4 建模调参

1 读取数据 import pandas as pd import numpy as np import warnings warnings.filterwarnings(ignore)note: 将整型变量的类型尽量压缩,逐步判断并转化为int8,int16,int32,int64 def reduce_mem_usage(df):""" iterate through all the columns …

深度学习与神经网络(七)——卷积神经网络之池化pooling 上采样upsample与降采样downsample(下采样)(subsample)(nn.MaxPool2d)

池化层pooling与采样 upsample与downsample upsample(interpolating)是上采样,是图片的放大 unpool是上采样的一种 downsample(subsample)是下采样,是图片的缩小 在卷积神经网络中使用的采样方式就是pooling,有点类似下采样,但不太…

有放回随机抽样:重要参数subsample

原理透析 确认了有多少棵树之后,我们来思考一个问题:建立了众多的树,怎么就能够保证模型整体的效果变强呢?集成的目的是为了模型在样本上能表现出更好的效果,所以对于所有的提升集成算法,每构建一个评估器&…

Subsample子采样(CloudCompare软件)

之前一直以为CC软件里面没有子采样这个功能,不过找了找之后发现还是有的,感觉这些小的功能挺有意思的,所以也就记录一下。 文章目录 一、Random采样二、space采样三、octree采样四、小结 一、Random采样 有时候我总是喜欢使用一些小的样本来…

Android Content Providers(三)——Contacts Provider

接着上篇Android Content Providers(二)——Contacts Provider继续,接下来要说明的是顶层的Contacts,Contacts是聚合联系人表,在之前讨论的RawContacts是原始联系人表,在Android通讯录的架构中,…

Android contacts 的详解

一、包结构分析 相关联的的projects 1、Contacts相关 联系人分为了Contacts和ContactsCommon,与sim卡联系人相关的是在Telephony中,数据库是在ContactsProvider,apk要push到/system/priv-app/Contacts下 2、Contacts的包结构 3、ContactsComm…

由ContactsProvider的升级引发的OTA首次开机卡白米问题分析

上午的宁静被一个OTA卡白米问题打破,接下来不断有人反馈不同机型都复现了OTA后卡白米,10.9号OTA升级到10.10号的版本,全机型问题,线刷没有问题,好吧,接下来就根据这些信息开始初步分析log吧! 初…

Android Content Providers(二)——Contacts Provider

Contacts Provider是Android中一个强大并且灵活的组件,负责管理系统通讯录的数据,对外提供访问接口来对系统通讯录进行访问和操作。 以下是Contacts Provider的组织结构图: 可以看出Android的系统通讯录是三层架构,通过URI进行访…

API Guides Contacts Provider (二)

Data From Sync Adapters 用户直接输入联系人的数据到设备中,但是也可以通过sync adapters从服务器上获取联系人的数据。sync adapter 会自动同步设备和服务器上的数据。sync adapter运行在后台,由系统来控制。系统调用ContentResolver去管理数据。 在A…

Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置

在Android7.0之后,很多Provider数据库的位置都发生了改变,在这记录下,免得以后又忘记了,找起来费劲。 1、SettingsProvider 在之前SettingsProvider是是以settings.db的方法存在,在Android N之后SettingsProvider数据存…

利用Contacts Provider读取手机联系人信息

参考:https://developer.android.google.cn/guide/topics/providers/contacts-provider.html Contacts Provider组织结构 Contacts Provider组织结构由三部分构成,如下图所示: (联系人)Contact:代表联系人,包含了多种联系渠道。(原始联系人)RawContact:每个原始联…

API Guides Contacts Provider

Contacts Provider Contacts Provider是Android的一个强大组件,它管理联系人的核心数据。你在手机联系人看到联系人信息,来源于Contact Provider。当然,你可以在自己的应用用访问ContactProvider的数据,也可以同步手机和服务…

Android官方文档—APP组件(Content Providers)(Contacts Provider)

通讯录内容提供者 Contacts Provider是一个功能强大且灵活的Android组件,用于管理设备的人员数据中​​央存储库。联系人提供程序是您在设备的联系人应用程序中看到的数据源,您还可以在自己的应用程序中访问其数据,并在设备和在线服务之间传…