如何优化XGBoost模型的参数

XGBoost参数调优完全指南(附Python代码)注意:本文提供的代码与运行结果存在一些差异。你可以在这里下载完整的代码作为参考。另外我自己跟着教程看的时候发现我的库不能分析字符串类型的特征,所以我只用了其中的一部分,具体的值和文章里的不一样,可以帮助我理解文章。所以其实可以稍微修改一下代码,不用完全按照教程来~ 0。

需要提前安装的库:

简介

如果您的预测模型有些不令人满意,请使用XGBoost。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一个非常精细的算法,可以处理各种不规则的数据。

使用XGBoost构建模型非常简单。但是这种模式的性能很难提升(至少我觉得很纠结)。该算法使用几个参数。因此,为了提高模型的性能,有必要对参数进行调整。在解决实际问题时,有些问题很难回答——需要调整哪些参数?应该调整这些参数的什么值来实现理想的输出?

这篇文章最适合刚接触XGBoost的人。在本文中,我们将学习参数调优的技巧以及一些与XGboost相关的有用知识。我们将使用Python在数据集上实践这一算法。

你需要知道的是

XG增强(极端梯度增强)是梯度增强算法的优化版本。

特别感谢:我个人感谢苏达莱·拉杰库马尔先生(又名SRK)的支持。目前AV排名第二。没有他的帮助,就没有这篇文章。在他的帮助下,我们可以指导无数的数据科学家。给他一个大大的赞!

内容列表

1和XGBoost的优势

2.了解XGBoost的参数。

3.调整参数(包括示例)

1和XGBoost的优势

XGBoost算法可以提高预测模型的能力。当我进一步了解它的性能和高精度背后的原理时,我发现它有许多优点:

1,正规化

标准GBM的实现没有像XGBoost那样的正则化步骤。正则化也有助于减少过拟合。事实上,XGBoost以其正则化的boosting技术而闻名。

2.并行处理

XGBoost可以实现并行处理,比GBM更快。但是,众所周知,Boosting算法是顺序处理的。怎么可能平行?每个课树的构造都依赖于前面的树,那么到底是什么让我们用多核处理器构造一个树呢?我希望你明白这句话的意思。?XGBoost还支持Hadoop实现。

3、高度的灵活性

XGBoost允许用户自定义优化目标和评估标准?它给模型增加了一个全新的维度,所以我们的加工不会受到限制。

4、缺失值处理

XGBoost有处理缺失值的内置规则。用户需要提供一个不同于其他样本的值,然后将其作为参数传入,以获取缺少的值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,以后会学习遇到缺失值时的处理方法。

5.修剪

GBM在拆分过程中遇到负损失会停止拆分。所以GBM其实是一个贪婪的算法。XGBoost将分割到指定的最大深度(max_depth),然后返回并修剪。如果在一个节点后没有正值,它将删除拆分。当负损失(如-2)之后是正损失(如+10)时,这种方法的优势就显现出来了。GBM会停在-2,因为遇到了负值。但是XGBoost会继续拆分,然后发现这两个拆分的组合会得到+8,所以会保留这两个拆分。

6.内置交叉验证

XGBoost允许在每次boosting迭代中使用交叉验证。因此,可以方便地获得最佳的升压迭代次数。但是,GBM使用网格搜索,只能检测有限数量的值。

7.在现有模式的基础上继续。

XGBoost可以根据上一轮的成绩继续训练。这个特性在一些特定的应用中是一个很大的优势。sklearn中GBM的实现也有这个功能,在这一点上两个算法是一致的。

相信你对XGBoost的强大功能有所了解。注意,这些都是我自己的观点。如果你有更多的想法,请随时在下面评论,我会更新这个列表!

2.XGBoost的参数

XGBoost的作者将所有参数分为三类:

1,通用参数:宏功能控制。

2.Booster参数:控制每一步的booster(树/回归)。

3.学习目标参数:控制培训目标的绩效。

这里我就类比GBM来解释一下,所以作为基础知识。

一般参数

这些参数用于控制XGBoost的宏功能。

1,booster[默认gbtree]

选择每次迭代的模型,有两个选项:

Gbtree:基于树的模型

Gbliner:线性模型

2.静默[默认为0]

当该参数的值为1时,静音模式开启,不输出任何信息。这个参数一般保持默认值0,因为这样可以帮助我们更好的理解模型。

3.nhread[默认值是最大可能的线程数]

该参数用于多线程控制,需要输入系统的核心数。如果要使用所有的CPU核,就不要输入这个参数,算法会自动检测。

另外还有两个参数,XGBoost会自动设置,目前不用担心。接下来,我们来看看助推器的参数。

助推器参数

虽然有两种助推器可以选择,但是我这里只介绍树型助推器,因为它的性能远远好于线性助推器,所以线性助推器很少使用。

1,eta[默认为0.3]

类似于GBM中的学习率参数。通过降低每一步的权重,可以提高模型的稳健性。典型值为0.01-0.2。

2.min_child_weight[默认值1]

确定最小叶节点样本权重和。它类似于GBM的min_child_leaf参数,但不完全相同。XGBoost的这个参数是最小样本权重之和,GBM参数是最小样本数。该参数用于避免过度拟合。当其值较大时,可以避免模型学习局部特殊样本。但是如果这个值太高,就会导致欠拟合。该参数需要通过CV来调整。

3.max_depth[默认为6]

与GBM中的参数相同,该值是树的最大深度。该值也用于避免过度拟合。max_depth越大,模型将学习的特定和局部样本就越多。你需要使用CV函数进行调谐。典型值:3-10

4、最大叶子节点数

一棵树上节点或叶子的最大数量。可以代替max_depth。因为如果生成二叉树,最多生成一棵深度为n的树。

氮气

一片树叶。如果定义了这个参数,GBM将忽略max_depth参数。

5,伽玛[默认为0]

当一个节点被分裂时,只有分裂后损失函数值减小,该节点才会被分裂。Gamma指定节点分裂所需的最小损失函数下降。该参数的值越大,算法越保守。该参数的值与损失函数密切相关,因此需要进行调整。

6.最大增量步长[默认值为0]

此参数限制每个树权重变化的最大步长。如果该参数的值为0,则表示没有约束。如果给它一个正值,会使算法更保守。通常,不需要设置该参数。但是当各个类别的样本很不平衡的时候,对logistic回归很有帮助。这个参数一般不用,但是可以挖掘出来多用。

7.子样本[默认1]

它与GBM中的子样本参数完全相同。此参数控制每棵树的随机采样比例。减小该参数的值将使算法更加保守,并避免过拟合。但是,如果该值设置得过小,可能会导致拟合不足。典型值:0.5-1

8.colsample_bytree[默认值为1]

类似于GBM中的max_features参数。用于控制每棵树随机采样的列的比例(每列是一个特征)。典型值:0.5-1

9.colsample_bylevel[默认值为1]

用于控制树的每个级别的每次拆分的列数的采样率。我个人一般不会用这个参数,因为subsample参数和colsample_bytree参数可以起到同样的作用。但是如果你有兴趣,你会发现这个参数更有用。

10,lambda[默认为1]

L2正则化加权项。(类似岭回归)。该参数用于控制XGBoost的正则化部分。虽然这个参数很少被大多数数据科学家使用,但它仍然可以用来减少过拟合。

11,alpha[默认为1]

L1正则化项的权重。(类似套索回归)。它可以应用在非常高的维数的情况下,使得算法更快。

12,scale_pos_weight[默认为1]

当每个类别的样本非常不平衡时,将该参数设置为正值可以使算法收敛得更快。

学习目标参数

该参数用于控制理想的优化目标和每一步结果的测量方法。

1,物镜[默认区域:线性]

该参数定义了需要最小化的损失函数。最常用的值是:

二元:logistic二元logistic回归,返回预测概率(非类别)。Multi:softmax使用softmax的多分类器返回预测的类别(不是概率)。

在这种情况下,需要再设置一个参数:num_class(类别数)。multi:softprob参数与multi:softmax参数相同,但它返回每个数据属于每个类别的概率。

2.eval_metric[默认值取决于目标参数的值]

有效数据的测量方法。对于回归问题,默认值是rmse,对于分类问题,默认值是error。典型值包括:

Rmse均方根误差(

∑Ni=1?2N?√

)平均绝对误差(

∑Ni=1|?|N

)logloss负对数似然函数值误差二分类错误率(阈值为0.5) merror多分类错误率mlogloss多分类logloss函数auc曲线面积

3.种子(默认为0)

随机数的种子设置可以重现随机数据的结果,也可以用来调整参数。

如果您以前使用过Scikit-learn,您可能不熟悉这些参数。不过好消息是python的XGBoost模块有一个sklearn包,XGBClassifier。这个包中的参数以sklearn风格命名。将更改的函数的名称是:

1、eta ->学习率

2、λ-& gt;注册_λ

3、阿尔法->注册_阿尔法

你一定想知道为什么我们没有在GBM中引入类似于‘n _ estimators’的参数。XGBClassifier确实有一个类似的参数,但是在标准的XGBoost实现中调用fitting函数时,它是作为“num_boosting_rounds”参数传入的。

调整参数(包括示例)

我对这些数据做了一些处理:

城市变量,因为类别太多,所以删除了部分类别。DOB变量被转换为年龄,一些数据被删除。添加了EMI_Loan_Submitted_Missing变量。如果EMI_Loan_Submitted变量的数据缺失,则该参数的值为1。否则为0。删除了原来的EMI_Loan_Submitted变量。EmployerName变量,因为类别太多,所以删除了部分类别。因为Existing_EMI变量只有111个值缺失,所以缺失的值用中间值0来补充。增加了Interest_Rate_Missing变量如果Interest_Rate变量的数据缺失,则该参数的值为1。否则为0。删除了原来的Interest_Rate变量。Lead_Creation_Date已删除,直观上对最终结果没有帮助。loan _ amount _ applied和loan _ duration _ applied的缺失项由中位数补充。添加了Loan_Amount_Submitted_Missing变量如果Loan_Amount_Submitted变量的数据缺失,则该参数的值为1。否则为0。删除了原始的Loan_Amount_Submitted变量。添加了Loan _ tension _ Submitted _ Missing变量。如果loan _ tenue _ submitted变量的数据缺失,则该参数的值为1。否则为0。删除了原始的Loan _ tension _ Submitted变量。删除登录、薪金账户,增加处理费用缺失变量。如果Processing_Fee变量的数据缺失,则该参数的值为1。否则为0。删除了原始的Processing_Fee变量。Source的前两位保持不变,其他分为不同的类别。进行量化和一次编码(一位有效编码)。

如果有原始数据,可以从资源库下载data_preparation的Ipython笔记本文件,然后自己走一遍这些步骤。

首先,导入必要的库,然后加载数据。

#导入库:

进口熊猫作为pd

将numpy作为np导入

将xgboost作为xgb导入

从xgboost.sklearn导入XGBClassifier

从sklearn导入cross_validation,metrics?#附加scklearn函数

从sklearn.grid_search导入GridSearchCV?#执行网格搜索

将matplotlib.pylab作为plt导入

%matplotlib内联

从matplotlib.pylab导入rcParams

RC params[' figure . fig size ']= 12,4

train = PD . read _ CSV(' train _ modified . CSV ')

target =“已支付”

IDcol = 'ID '

注意,我导入了两种XGBoost:

xgb-直接引用xgboost。接下来,我们将使用“cv”功能。XGBClassifier——是xgboost的sklearn包。这个包允许我们像GBM一样使用网格搜索和并行处理。

在往下走之前,我们定义一个函数,它可以帮助我们建立XGBoost模型,并进行交叉验证。好消息是,您可以直接使用以下功能,并且您也可以在以后的自己的模型中使用它。

def modelfit(alg,dtrain,predictors,useTrainCV=True,cv_folds=5,early_stopping_rounds=50):

如果使用TrainCV:

xgb_param = alg.get_xgb_params()

xgtrain = xgb。数据矩阵。值,label=dtrain[target]。价值观)

cvresult = xgb.cv(xgb_param,xgtrain,num _ boost _ round = alg . get _ params()[' n _ estimators '],nfold=cv_folds,

metrics='auc ',early _ stopping _ rounds = early _ stopping _ rounds,show_progress=False)

alg . set _ params(n _ estimators = cv result . shape[0])

#根据数据拟合算法

alg . fit(dtrain[预测值],dt rain['已支付'],eval_metric='auc ')

#预测训练集:

dtrain _ predictions = alg . predict(dtrain[预测值])

dt rain _ pred prob = alg . predict _ proba(dt rain[预测值])[:,1]

#打印模型报告:

打印" \ n模型报告"

print " Accuracy:% . 4g " % metrics . Accuracy _ score(dtrain[' disapped ']。值,dtrain_predictions)

打印" AUC Score(Train):% f " % metrics . roc _ AUC _ Score(dt rain[' disapped '],dtrain_predprob)

feat_imp = pd。系列(alg.booster()。get_fscore())。sort_values(升序=False)

feat_imp.plot(kind='bar ',title = ' Feature Importances ')

plt.ylabel('特征重要性分数')

该函数与GBM中使用的函数略有不同。然而,本文的重点是解释重要的概念,而不是编写代码。如果有不明白的地方,请在下面评论,没有压力。注意xgboost的sklearn包没有“feature_importance”的度量,但是get_fscore()函数有相同的功能。

参数整定的一般方法。

我们将使用类似于GBM中的方法。需要采取以下步骤:

1.选择较高的学习率。一般来说,学习率的值是0.1。但对于不同的问题,理想的学习率有时会在0.05-0.3之间波动。选择与该学习率相对应的理想决策树的数量。XGBoost有一个非常有用的函数“cv”,可以在每次迭代中使用交叉验证,返回理想的决策树数量。

2.对于给定的学习速率和决策树的数量,决策树特定参数被优化(max _ depth、min _ child _ weight、gamma、subsample、colsample _ by tree)。在确定一棵树的过程中,我们可以选择不同的参数,后面我会举例说明。

3.XG Boost正则化参数的优化。(λ,α).这些参数可以降低模型的复杂度,从而提高模型的性能。

4.降低学习率,确定理想参数。

下面我们一步一步详细的做这些操作。

步骤1:确定学习速率和用于调整基于树的参数的估计器的数量。

为了确定升压参数,我们应该首先给其他参数一个初始值。让我们取值如下:

1,max_depth = 5:该参数的值最好在3-10之间。我选择的起始值为5,但是您也可以选择其他值。起始值4-6是一个不错的选择。

2.min_child_weight = 1:这里选取了一个相对较小的值,因为这是一个极不平衡的分类问题。因此,某些叶节点下的值会更小。

3.gamma = 0:起始值也可以从其他更小的值中选取,范围从0.1到0.2。这个参数以后也会调整。

4.subsample,colsample_bytree = 0.8:这是最常见的初始值。典型值范围从0.5到0.9。

5.scale_pos_weight = 1:这个值是因为类别很不平衡。

请注意,以上这些参数的值只是初步估计,需要在以后进行调整。这里,学习率被设置为默认值0.1。然后使用xgboost中的cv函数来确定决策树的最佳数目。上一篇文章中的函数可以完成这项工作。

#选择除目标预测值之外的所有预测值。IDcols

预测值=[x for x in train . columns if x not in[target,IDcol]]

xgb1 = XGBClassifier(

learning_rate =0.1

n _ estimates = 1000,

max_depth=5,

min_child_weight=1,

伽马=0,

子样本=0.8,

colsample_bytree=0.8,

objective= '二进制:逻辑',

nthread=4,

scale_pos_weight=1,

种子=27)

模型拟合(xgb1,训练,预测值)

从输出结果可以看出,当学习率为0.1时,理想的决策树个数为140。这个数字对您来说可能很高,但它也取决于您的系统的性能。

注意:在AUC(测试)中,可以看到测试集的AUC值。但是如果您在自己的系统上运行这些命令,这个值将不会出现。因为数据不公开。此处提供的值仅供参考。生成此值的代码部分已被删除。& lt??"/KF/ware/VC/" target = " _ blank " class = " key link " >vcd 4 ncjvymxvy 2 tdw 90 ZT 4 ncjxomsbpzd 0 = " Step 2-max depth-and-min weight-Parameter Tuning " >步骤2:调整max_depth和min_weight参数。

我们首先调整这两个参数,因为它们对最终结果有很大影响。首先我们大范围的粗略调整参数,然后小范围的微调。

注意:在这一节中,我将进行一次高负载的网格搜索,大约需要15-30分钟甚至更长时间,这取决于您的系统的性能。您还可以根据系统的性能选择不同的值。

param_test1 = {

' max_depth ':范围(3,10,2),

' min_child_weight ':范围(1,6,2)

}

gsearch 1 = GridSearchCV(estimator = xgb classifier(learning _ rate = 0.1,n_estimators=140,max_depth=5,

min_child_weight=1,gamma=0,子样本=0.8,colsample_bytree=0.8,

objective= 'binary:logistic ',nthread=4,scale_pos_weight=1,seed=27),

param_grid = param_test1,scoring='roc_auc ',n_jobs=4,iid=False,cv=5)

gsearch1.fit(训练[预测值],训练[目标])

gsearch1.grid_scores_,gsearch1.best_params_,gsearch1.best_score_