XGBoost参数调优完全指南(附Python代码)译注:文内提供的代码和运行结果有一定差异,可以从这里完整代码对照参考。另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只用其中一部分特征做的,具体数值跟文章中不一样,反而可以帮助理解文章。所以大家其实也可以小小修改一下代码,不一定要完全跟着教程做~ ^0^需要提前安装好的库:简介如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。构造一个使用XGBoost的模型十分简单。但是,提高这个模型的表现就有些困难(至少我觉得十分纠结)。这个算法使用了好几个参数。所以为了提高模型的表现,参数的调整十分必要。在解决实际问题的时候,有些问题是很难回答的——你需要调整哪些参数?这些参数要调到什么值,才能达到理想的输出?这篇文章最适合刚刚接触XGBoost的人阅读。在这篇文章中,我们会学到参数调优的技巧,以及XGboost相关的一些有用的知识。以及,我们会用Python在一个数据集上实践一下这个算法。你需要知道的XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一个优化的版本。特别鸣谢:我个人十分感谢Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果没有他的帮助,就没有这篇文章。在他的帮助下,我们才能给无数的数据科学家指点迷津。给他一个大大的赞!内容列表1、XGBoost的优势2、理解XGBoost的参数3、调整参数(含示例)1、XGBoost的优势XGBoost算法可以给预测模型带来能力的提升。当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势:1、正则化标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。 实际上,XGBoost以“正则化提升(regularized 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迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。 而GBM使用网格搜索,只能检测有限个值。7、在已有的模型基础上继续XGBoost可以在上一轮的结果上继续训练。这个特性在某些特定的应用上是一个巨大的优势。 sklearn中的GBM的实现也有这个功能,两种算法在这一点上是一致的。相信你已经对XGBoost强大的功能有了点概念。注意这是我自己总结出来的几点,你如果有更多的想法,尽管在下面评论指出,我会更新这个列表的!2、XGBoost的参数XGBoost的作者把所有的参数分成了三类:1、通用参数:宏观函数控制。2、Booster参数:控制每一步的booster(tree/regression)。3、学习目标参数:控制训练目标的表现。在这里我会类比GBM来讲解,所以作为一种基础知识。通用参数这些参数用来控制XGBoost的宏观功能。1、booster[默认gbtree]选择每次迭代的模型,有两种选择:gbtree:基于树的模型gbliner:线性模型2、silent[默认0]当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。3、nthread[默认值为最大可能的线程数]这个参数用来进行多线程控制,应当输入系统的核数。 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。还有两个参数,XGBoost会自动设置,目前你不用管它。接下来咱们一起看booster参数。booster参数尽管有两种booster可供选择,我这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。1、eta[默认]和GBM中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的鲁棒性。 典型值为。2、min_child_weight[默认1]决定最小叶子节点样本权重和。 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。3、max_depth[默认6]和GBM中的参数相同,这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。 需要使用CV函数来进行调优。 典型值:3-104、max_leaf_nodes树上最大的节点或叶子的数量。 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成n2个叶子。 如果定义了这个参数,GBM会忽略max_depth参数。5、gamma[默认0]在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。6、max_delta_step[默认0]这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。 这个参数一般用不到,但是你可以挖掘出来它更多的用处。7、subsample[默认1]和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:、colsample_bytree[默认1]和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:、colsample_bylevel[默认1]用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。10、lambda[默认1]权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。11、alpha[默认1]权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。12、scale_pos_weight[默认1]在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。学习目标参数这个参数用来控制理想的优化目标和每一步结果的度量方法。1、objective[默认reg:linear]这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。2、eval_metric[默认值取决于objective参数的取值]对于有效数据的度量方法。 对于回归问题,默认值是rmse,对于分类问题,默认值是error。 典型值有:rmse 均方根误差(∑Ni=1?2N??????√) mae 平均绝对误差(∑Ni=1|?|N) logloss 负对数似然函数值 error 二分类错误率(阈值为) merror 多分类错误率 mlogloss 多分类logloss损失函数 auc 曲线下面积3、seed(默认0)随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数如果你之前用的是Scikit-learn,你可能不太熟悉这些参数。但是有个好消息,python的XGBoost模块有一个sklearn包,XGBClassifier。这个包中的参数是按sklearn风格命名的。会改变的函数名是:1、eta ->learning_rate2、lambda->reg_lambda3、alpha->reg_alpha你肯定在疑惑为啥咱们没有介绍和GBM中的’n_estimators’类似的参数。XGBClassifier中确实有一个类似的参数,但是,是在标准XGBoost实现中调用拟合函数时,把它作为’num_boosting_rounds’参数传入。调整参数(含示例)我已经对这些数据进行了一些处理:City变量,因为类别太多,所以删掉了一些类别。 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_Tenure_Applied 两个变量的缺项用中位数补足。 增加了 Loan_Amount_Submitted_Missing 变量。如果Loan_Amount_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Loan_Amount_Submitted变量。 增加了 Loan_Tenure_Submitted_Missing 变量。如果 Loan_Tenure_Submitted 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Loan_Tenure_Submitted 变量。 删除了LoggedIn, Salary_Account 两个变量 增加了 Processing_Fee_Missing 变量。如果 Processing_Fee 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Processing_Fee 变量。 Source前两位不变,其它分成不同的类别。 进行了量化和独热编码(一位有效编码)。如果你有原始数据,可以从资源库里面data_preparation的Ipython notebook 文件,然后自己过一遍这些步骤。首先,import必要的库,然后加载数据。#Import libraries:import pandas as pdimport numpy as npimport xgboost as xgbfrom import XGBClassifierfrom sklearn import cross_validation, metrics #Additional scklearn functionsfrom import GridSearchCV #Perforing grid searchimport as plt%matplotlib inlinefrom import rcParamsrcParams[''] = 12, 4train = ('')target = 'Disbursed'IDcol = 'ID'注意我import了两种XGBoost:xgb - 直接引用xgboost。接下来会用到其中的“cv”函数。 XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。在向下进行之前,我们先定义一个函数,它可以帮助我们建立XGBoost models 并进行交叉验证。好消息是你可以直接用下面的函数,以后再自己的models中也可以使用它。def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):if useTrainCV:xgb_param = ()xgtrain = (dtrain[predictors].values, label=dtrain[target].values)cvresult = (xgb_param, xgtrain, num_boost_round=()['n_estimators'], nfold=cv_folds,metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)(n_estimators=[0])#Fit the algorithm on the (dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')#Predict training set:dtrain_predictions = (dtrain[predictors])dtrain_predprob = (dtrain[predictors])[:,1]#Print model report:print "\nModel Report"print "Accuracy : %.4g" % (dtrain['Disbursed'].values, dtrain_predictions)print "AUC Score (Train): %f" % (dtrain['Disbursed'], dtrain_predprob)feat_imp = (().get_fscore()).sort_values(ascending=False)(kind='bar', title='Feature Importances')('Feature Importance Score')这个函数和GBM中使用的有些许不同。不过本文章的重点是讲解重要的概念,而不是写代码。如果哪里有不理解的地方,请在下面评论,不要有压力。注意xgboost的sklearn包没有“feature_importance”这个量度,但是get_fscore()函数有相同的功能。参数调优的一般方法。我们会使用和GBM中相似的方法。需要进行如下步骤:选择较高的学习速率(learning rate)。一般情况下,学习速率的值为。但是,对于不同的问题,理想的学习速率有时候会在到之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。2. 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。4. 降低学习速率,确定理想参数。咱们一起详细地一步步进行这些操作。第一步:确定学习速率和tree_based 参数调优的估计器数目。为了确定boosting 参数,我们要先给其它参数一个初始值。咱们先按如下方法取值:1、max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。2、min_child_weight = 1:在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。3、gamma = 0: 起始值也可以选其它比较小的值,在到之间就可以。这个参数后继也是要调整的。4、subsample,colsample_bytree = : 这个是最常见的初始值了。典型值的范围在之间。5、scale_pos_weight = 1: 这个值是因为类别十分不平衡。注意哦,上面这些参数的值只是一个初始的估计值,后继需要调优。这里把学习速率就设成默认的。然后用xgboost中的cv函数来确定最佳的决策树数量。前文中的函数可以完成这个工作。#Choose all predictors except target IDcolspredictors = [x for x in if x not in [target,IDcol]]xgb1 = XGBClassifier(learning_rate = 'binary:logistic',nthread=4,scale_pos_weight=1,seed=27)modelfit(xgb1, train, predictors)从输出结果可以看出,在学习速率为时,理想的决策树数目是140。这个数字对你而言可能比较高,当然这也取决于你的系统的性能。注意:在AUC(test)这里你可以看到测试集的AUC值。但是如果你在自己的系统上运行这些命令,并不会出现这个值。因为数据并不公开。这里提供的值仅供参考。生成这个值的代码部分已经被删掉了。<喎?"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxoMSBpZD0="第二步-maxdepth-和-minweight-参数调优">第二步: max_depth 和 min_weight 参数调优我们先对这两个参数调优,是因为它们对最终结果有很大的影响。首先,我们先大范围地粗调参数,然后再小范围地微调。注意:在这一节我会进行高负荷的栅格搜索(grid search),这个过程大约需要15-30分钟甚至更久,具体取决于你系统的性能。你也可以根据自己系统的性能选择不同的值。param_test1 = {'max_depth':range(3,10,2),'min_child_weight':range(1,6,2)}gsearch1 = GridSearchCV(estimator = XGBClassifier( learning_rate =, n_estimators=140, max_depth=5,min_child_weight=1, gamma=0, subsample=, colsample_bytree= 'binary:logistic', nthread=4, scale_pos_weight=1, seed=27), param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)(train[predictors],train[target]), ,
前言: xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案。在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sungrid Engine等各个平台上面运行,并且保留了单机并行版本的各种优化,使得它可以很好地解决于工业界规模的问题。 花了几天时间粗略地看完了xgboost原论文和作者的slide讲解,仅仅是入门入门入门笔记。给我的感觉就是xgboost算法比较复杂,针对传统GBDT算法做了很多细节改进,包括损失函数、正则化、切分点查找算法优化、稀疏感知算法、并行化算法设计等等。本文主要介绍xgboost基本原理以及与传统gbdt算法对比总结,后续会基于Python版本做了一些实战调参试验。想详细学习xgboost算法原理建议通读作者原始论文与slide讲解。 相关文献资料: Xgboost Slides XGBoost中文版原理介绍 原始论文XGBoost: A Scalable Tree Boosting System XGBoost Parameters (official guide) 精彩博文: XGBoost浅入浅出——wepon xgboost: 速度快效果好的boosting模型 Complete Guide to Parameter Tuning in XGBoost (with codes in Python) 一、xgboost基本原理介绍 1.提升方法是一种非常有效的机器学习方法,在前几篇笔记中介绍了提升树与GBDT基本原理,xgboost(eXtreme Gradient Boosting)可以说是提升方法的完全加强版本。xgboost算法在各大比赛中展现了强大的威力,引用原论文中的一段描述: The impact of the system has been widely recognized in a number of machine learning and data mining challenges. Take the challenges hosted by the machine learning competition site Kaggle for example. Among the 29 challenge winning solutions published at Kaggle’s blog during 2015, 17 solutions used XGBoost. Among these solutions, eight solely used XGBoost to train the model,while most others combined XGBoost with neural nets in ensembles. For comparison, the second most popular method,deep neural nets, was used in 11 solutions. The success of the system was also witnessed in KDDCup 2015, where XGBoost was used by every winning team in the , the winning teams reported that ensemble methods outperform a well-configured XGBoost by only a small amount. Tree and Ensemble (What are we Learning,得到学习目标) (1).Regression Tree (CART)回归树 (2).Regression Tree Ensemble 回归树集成 在上面的例子中,我们用两棵树来进行预测。我们对于每个样本的预测结果就是每棵树预测分数的和。 (3).Objective for Tree Ensemble 得到学习目标函数 这里是构造一个目标函数,然后我们要做的就是去尝试优化这个目标函数。读到这里,感觉与gbdt好像没有什么区别,确实如此,不过在后面就能看到他们的不同了(构造(学习)模型参数)。 Boosting (How do we Learn,如何学习) (1).So How do we Learn? 目标函数: (2).Additive Training(3).Taylor Expansion Approximation of Loss 泰勒近似展开把平方损失函数的一二次项带入原目标函数,你会发现与之前那张ppt的损失函数是一致的 (4).Our New Goal 得到新的学习目标函数 从这里就可以看出xgboost的特点了,目标函数保留了泰勒展开的二次项。 (5).Refine the definition of tree 重新定义每棵树(6).Define the Complexity of Tree 树的复杂度项从图中可以看出,xgboost算法中对树的复杂度项增加了一个L2正则化项,针对每个叶结点的得分增加L2平滑,目的也是为了避免过拟合。 (7).Revisit the Objectives (8).The Structure Score 这个score你可以理解成类似于信息增益的一个指标,在切分点查找算法中用到。 (9)切分点查找算法(贪心算法) 上图中G都是各自区域内的gi总和,此外,作者针对算法设计对特征进行了排序,有兴趣的可以阅读原始论文,这里不做详解。二、xgboost特点(与gbdt对比) 说明一下:这部分内容参考了知乎上的一个问答—机器学习算法中GBDT和XGBOOST的区别有哪些?,答主是wepon大神,根据他的总结我自己做了一理解和补充。 1.传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。 —可以通过booster [default=gbtree]设置参数:gbtree: tree-based models/gblinear: linear models 2.传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 —对损失函数做了改进(泰勒展开,一阶信息g和二阶信息h,上一章节有做介绍) 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性 —正则化包括了两个部分,都是为了防止过拟合,剪枝是都有的,叶子结点输出L2平滑是新增的。 and column subsampling —还是为了防止过拟合,论文节有介绍,这里答主已概括的非常到位 (1)shrinkage缩减类似于学习速率,在每一步tree boosting之后增加了一个参数n(权重),通过这种方式来减小每棵树的影响力,给后面的树提供空间去优化模型。 (2)column subsampling列(特征)抽样,说是从随机森林那边学习来的,防止过拟合的效果比传统的行抽样还好(行抽样功能也有),并且有利于后面提到的并行化处理算法。 finding algorithms(划分点查找算法):—理解的还不够透彻,需要进一步学习 (1)exact greedy algorithm—贪心算法获取最优切分点 (2)approximate algorithm— 近似算法,提出了候选分割点概念,先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。详细见论文节 (3)Weighted Quantile Sketch—分布式加权直方图算法,论文节 这里的算法(2)、(3)是为了解决数据无法一次载入内存或者在分布式情况下算法(1)效率低的问题,以下引用的还是wepon大神的总结: 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。 6.对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。 —稀疏感知算法,论文节,Algorithm 3: Sparsity-aware Split Finding Cross-Validation(内置交叉验证) XGBoost allows user to run a cross-validation at each iteration of the boosting process and thus it is easy to get the exact optimum number of boosting iterations in a single run. This is unlike GBM where we have to run a grid-search and only a limited values can be tested. on Existing Model(接着已有模型学习) User can start training an XGBoost model from its last iteration of previous run. This can be of significant advantage in certain specific applications. GBM implementation of sklearn also has this feature so they are even on this point. Flexibility(高灵活性) **XGBoost allow users to define custom optimization objectives and evaluation criteria. This adds a whole new dimension to the model and there is no limit to what we can do.** 10.并行化处理 —系统设计模块,块结构设计等 xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。 此外xgboost还设计了高速缓存压缩感知算法,这是系统设计模块的效率提升。 当梯度统计不适合于处理器高速缓存和高速缓存丢失时,会大大减慢切分点查找算法的速度。 (1)针对 exact greedy algorithm采用缓存感知预取算法 (2)针对 approximate algorithms选择合适的块大小 我觉得关于xgboost并行化设计仅仅从论文PPT博客上学习是远远不够的,有时间还要从代码层面去学习分布式 xgboost的设计理念。 三、xgboost参数详解 官方参数介绍看这里: Parameters (official guide) General Parameters(常规参数) [default=gbtree]:选择基分类器,gbtree: tree-based models/gblinear: linear models [default=0]:设置成1则没有运行信息输出,最好是设置为0. [default to maximum number of threads available if not set]:线程数 Booster Parameters(模型参数) [default=]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。 [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。 [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。 :最大叶结点数,与max_depth作用有点重合。 [default=0]:后剪枝时,用于控制是否后剪枝的参数。 [default=0]:这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。 [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。 [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。 [default=0]:控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。 [default=1]:如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。 Learning Task Parameters(学习任务参数) [default=reg:linear]:定义最小化损失函数类型,常用参数: binary:logistic –logistic regression for binary classification, returns predicted probability (not class) multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities) you also need to set an additional num_class (number of classes) parameter defining the number of unique classes multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class. [ default according to objective ]: The metric to be used for validation data. The default values are rmse for regression and error for classification. Typical values are: rmse – root mean square error mae – mean absolute error logloss – negative log-likelihood error – Binary classification error rate ( threshold) merror – Multiclass classification error rate mlogloss – Multiclass logloss auc: Area under the curve [default=0]: The random number seed. 随机种子,用于产生可复现的结果 Can be used for generating reproducible results and also for parameter tuning. 注意: Python sklearn style参数名会有所变化 eta –> learning_rate lambda –> reg_lambda alpha –> reg_alpha 四、实战 官方样例: XGBoost Python API Reference (official guide) XGBoost Demo Codes (xgboost GitHub repository) xgboost参数设置代码示例:
XGBoost参数
XGBoost的参数可以分为三种类型:通用参数、booster参数以及学习目标参数
129 浏览 5 回答
218 浏览 4 回答
231 浏览 4 回答
241 浏览 3 回答
334 浏览 4 回答
247 浏览 3 回答
278 浏览 6 回答
94 浏览 4 回答
296 浏览 9 回答
250 浏览 3 回答
105 浏览 4 回答
250 浏览 3 回答
288 浏览 2 回答
94 浏览 3 回答
353 浏览 4 回答