rf gbdt xgboostt相比传统gbdt有何不同?rf gbdt xgboostt为什么快

机器学习算法中GBDT和XGBOOST的区别有哪些? - 知乎2456被浏览118581分享邀请回答wepon.me/files/gbdt.pdf以下原答案:-----------------------------------xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?
看了陈天奇大神的文章和slides,略抒己见,没有面面俱到,不恰当的地方欢迎讨论:传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。=============回复 在评论里的问题,因为有些公式放正文比较好。评论里讨论的问题的大意是 “xgboost代价函数里加入正则项,是否优于cart的剪枝”。其实陈天奇大神的slides里面也是有提到的,我当一下搬运工。决策树的学习过程就是为了找出最优的决策树,然而从函数空间里所有的决策树中找出最优的决策树是NP-C问题,所以常采用启发式(Heuristic)的方法,如CART里面的优化GINI指数、剪枝、控制树的深度。这些启发式方法的背后往往隐含了一个目标函数,这也是大部分人经常忽视掉的。xgboost的目标函数如下:其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2模的平方:那这个跟剪枝有什么关系呢???
跳过一系列推导,我们直接来看xgboost中树节点分裂时所采用的公式:这个公式形式上跟ID3算法(采用entropy计算增益) 、CART算法(采用gini指数计算增益) 是一致的,都是用分裂后的某种值 减去 分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。50245 条评论分享收藏感谢收起王超(@德川)陈帅华(@陈帅华BigData);传统GBDT的理论推导-------------;笔者工作在汽车之家,在kaggle上criteo;后续由于工作原因需要用到大规模机器学习的一些工具;传统GBDT的理论推导;GBDT模型全称GradientBoostedD;GBDT是一个加性回归模型,通过boosting;GBDT模型在采用LogLoss时推导
王超 ( @德川 )
陈帅华( @陈帅华BigData )
传统GBDT的理论推导 --------------------------------------------------------------------------------------------------- 2 XGBOOST版本的理论推导 -------------------------------------------------------------------------------------------------- 4 分布式XGBOOST的设计理念 --------------------------------------------------------------------------------------------- 5 分布式XGBOOST发展过程 ------------------------------------------------------------------------------------------------- 6 分布式通信框架RABIT简述 ---------------------------------------------------------------------------------------------- 7 XGBOOST代码简析 ------------------------------------------------------------------------------------------------------------ 8 xgboost源码目录结构 ------------------------------------------------------------------------------------------------- 8 目标函数接口设计 ------------------------------------------------------------------------------------------------------ 9 树更新策略接口设计------------------------------------------------------------------------------------------------- 10 xgboost 启动过程 ----------------------------------------------------------------------------------------------------- 10 分布式加载数据 ------------------------------------------------------------------------------------------------------- 12 分布式训练 -------------------------------------------------------------------------------------------------------------- 12 XGBOOST实战 ---------------------------------------------------------------------------------------------------------------- 15 参数调参 ----------------------------------------------------------------------------------------------------------------- 15 常见问题 ----------------------------------------------------------------------------------------------------------------- 18 速度测试 ----------------------------------------------------------------------------------------------------------------- 19
笔者工作在汽车之家,在kaggle上criteo的点击率比赛中与陈天奇相识,autobots在700多支team里排名第7,模型用到了fm和gbdt,其中gbdt当时使用的就是xgboost,得见到其威力。
后续由于工作原因需要用到大规模机器学习的一些工具,而当时开源届并无太多成熟可靠方案。因此有幸参与到陈天奇的yarn版本的xgboost的开发过程,在这里备注一些心得供参考。
传统GBDT的理论推导
GBDT模型全称Gradient Boosted Decision Trees,在1999年由Jerome Friedman提出,将GBDT模型应用于ctr预估,最早见于yahoo。
GBDT是一个加性回归模型,通过boosting迭代的构造一组弱学习器,相对LR 的优势如不需要做特征的归一化,自动进行特征选择,模型可解释性较好,可以适应多种损失函数如SquareLoss,LogLoss等等。但作为非线性模型,其相对线性模型的缺点也是显然的:boosting是个串行的过程,不能并行化,计算复杂度较高,同时其不太适合高维稀疏特征,通常采用稠密的数值特征如点击率预估中的COEC。
GBDT模型在采用LogLoss时推导较逻辑回归复杂一些,我们这里给出具体原理和推导细节:
目标是寻找使得期望损失最小的决策函数 ,我们要求其具有一定的形式:即是一组弱学习器的加性组合。
我们可以在函数空间上形式的使用梯度下降法求解,首先固定x,对F(x)求解其最优解。这里给出框架流程和LogLoss下的推导,一些变量的称谓沿用了原始paper里的叫法。
我们需要估计g_m(x),这里采用决策树的实现\beta_m h(x;a_m)去逼近函数g_m(x),使得俩者之间的距离尽可能的近。距离的衡量方式有很多选择,比如均方误差。这里给出LogLoss损失函数下的具体推导
Step1.求解初始$F_0$。令其偏导为0:
Step2.估计g_m(x),并用决策树对其进行拟合
Step3.用 a single Newton-Raphson step去近似求解下降方向步长,通常的实现中Step3被省略,采用shrinkage的策略通过参数设置步长,避免过拟合
xgboost版本的理论推导
不同于传统的gbdt方式,只利用了一阶的导数信息(上述Step3中Newton-Raphson会用到二阶信息,但一般实现中省略了Step3),xgboost对loss func做了二阶的泰勒展开,并在目标函数之外加入了正则项整体求最优解,用以权衡目标函数的下降和模型的复杂程度,避免过拟合。具体推导详见陈天奇的ppt,这里给出简要的摘注,一些变量的称谓沿用陈天奇ppt里的叫法,和前述friedman 的版本里不一致,请注意。
将目标函数做泰勒展开,并引入正则项:
除去常数项,求得每个样本的一阶导g_i和二阶导h_i,将目标函数按叶子节点规约分组,略去一些中间步骤
在树结构是fix的时候,上式中叶子节点权重w_j有闭式解,解和对应的目标函数值如下
在目标函数是LogLoss损失函数下,这里给出一阶导g_i和二阶导h_i的推导:
其他细节见后续代码部分的解读。
分布式xgboost的设计理念
除去理论上和传统gbdt的差别外,从使用者的角度,xgboost的设计理念在使用时主要有如下几点感受:
让一个程序在必要的时候占领一台机器,并且在所有迭代的时候一直跑到底,来防止重新分配资源的开销。
机器内部采用单机多线程方式来并行加速匀速,机器之间通信基于rabit实现的all reduce的同步接口。
2.可移植,少写代码
大部分的分布式机器学习算法的结构都是分布数据,在每个子集上面算出一些局部的统计量,然后整合出全局的统计量,并且在分配给各个计算节点去进行下一轮的迭代。
根据算法本身的需求,抽象出合理的接口如Allreduce,并通过通用的库如rabit
三亿文库包含各类专业文献、高等教育、行业资料、文学作品欣赏、外语学习资料、中学教育、xgboost导读和实战31等内容。 XGBoost风靡Kaggle、天池、DataCastle、Kesci等国内外数据竞赛平台,是比赛夺冠的必备大杀器。我在之前参加过的一些比赛中,着实领略了其威力,也取得不少好成绩。如果把数据竞赛比作金庸笔下的武林,那么XGBoost可谓屠龙刀,号令天下,莫敢不从!倚天不出,谁与争锋?
XGBoost工具很多人都会用,但却很少有人知道其原理,在我写这篇文章之前,我也是一知半解,前阵子假期就抽空看了一下XGBoost的论文,了解了更多的细节,当然我不敢保证自己的理解完全正确,也有一些细节还没搞明白,特别是XGBoost工具的工程实现方面的内容,读的时候大多略过了。
这篇文章还在初稿中,本来没打算写的,但是前几天在知乎上看到一个相关的问题,就手痒回答了一下。这篇文章就先记录一下该问题下我的回答,以及过去我总结的对XGBoost的使用经验。等之后有空了,系统地总结GBDT以及XGBoost。
xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?
看了陈天奇大神的文章和slides,略抒己见,没有面面俱到,不恰当的地方欢迎讨论:
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
=============
回复 @肖岩在评论里的问题,因为有些公式放正文比较好。评论里讨论的问题的大意是 “xgboost代价函数里加入正则项,是否优于cart的剪枝”。其实陈天奇大神的slides里面也是有提到的,我当一下搬运工。
决策树的学习过程就是为了找出最优的决策树,然而从函数空间里所有的决策树中找出最优的决策树是NP-C问题,所以常采用启发式(Heuristic)的方法,如CART里面的优化GINI指数、剪枝、控制树的深度。这些启发式方法的背后往往隐含了一个目标函数,这也是大部分人经常忽视掉的。xgboost的目标函数如下:
其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2模的平方:
那这个跟剪枝有什么关系呢???
跳过一系列推导,我们直接来看xgboost中树节点分裂时所采用的公式:
这个公式形式上跟ID3算法(采用entropy计算增益) 、CART算法(采用gini指数计算增益) 是一致的,都是用分裂后的某种值 减去 分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。
xgboost使用经验总结
多类别分类时,类别需要从0开始编码Watchlist不会影响模型训练。类别特征必须编码,因为xgboost把特征默认都当成数值型的调参: 以及
训练的时候,为了结果可复现,记得设置随机数种子。XGBoost的特征重要性是如何得到的?某个特征的重要性(feature score),等于它被选中为树节点分裂特征的次数的和,比如特征A在第一次迭代中(即第一棵树)被选中了1次去分裂树节点,在第二次迭代被选中2次…..那么最终特征A的feature score就是 1+2+….
原始论文 : 论文对应的中文版原理介绍:xgboost导读和实战
原文地址:http://wepon.me/
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:256358次
积分:4653
积分:4653
排名:第6569名
原创:132篇
转载:543篇
评论:24条
(8)(45)(30)(36)(119)(38)(4)(68)(101)(67)(58)(64)(37)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'对xgboost性能影响比较大的参数主要有:
eta:每次迭代完成后更新权重时的步长。越小训练越慢。典型值为0.01-0.2。
num_round:总共迭代的次数。
subsample:训练每棵树时用来训练的数据占全部的比例。用于防止 Overfitting。
colsample_bytree:训练每棵树时用来训练的特征的比例,类似 RandomForestClassifier 的 max_features。
max_depth:每棵树的最大深度限制。与 Random Forest 不同,Gradient Boosting 如果不对深度加以限制,最终是会 Overfit 的。
early_stopping_rounds:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提高后就提前终止训练。用于防止 Overfitting。
0objective[默认reg:linear]:
这个参数定义需要被最小化的损失函数。
最常用的值有:binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
1silent[默认0]:
当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。
2、min_child_weight[默认1]
决定最小叶子节点样本权重和。 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。
3、max_depth[默认6]
和GBM中的参数相同,这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。 需要使用CV函数来进行调优。 典型值:3-10
4gamma[默认0]
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。
5subsample[默认1]
和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1
6、seed(默认0)
随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数
一般的调参步骤是:
将训练数据的一部分划出来作为验证集。
先将 eta 设得比较高(比如 0.1),num_round 设为 300 ~ 500。
用 Grid Search 对其他参数进行搜索
逐步将 eta 降低,找到最佳值。
以验证集为 watchlist,用找到的最佳参数组合重新在训练集上训练。注意观察算法的输出,看每次迭代后在验证集上分数的变化情况,从而得到最佳的 early_stopping_rounds。
x_dtrain, X_deval, y_dtrain, y_deval = cross_validation.train_test_split(X_train, y_train, random_state=1026, test_size=0.3)
dtrain = xgb.DMatrix(X_dtrain, y_dtrain)
deval = xgb.DMatrix(X_deval, y_deval)
watchlist = [(deval, 'eval')]
params = {
'booster': 'gbtree',
'objective': 'reg:linear',
'subsample': 0.8,
'colsample_bytree': 0.85,
'eta': 0.05,
'max_depth': 7,
'seed': 2016,
'silent': 0,
'eval_metric': 'rmse'
clf = xgb.train(params, dtrain, 500, watchlist, early_stopping_rounds=50)
pred = clf.predict(xgb.DMatrix(df_test))
最后要提一点,所有具有随机性的 Model 一般都会有一个 seed 或是 random_state 参数用于控制随机种子。得到一个好的 Model 后,在记录参数时务必也记录下这个值,从而能够在之后重现 Model。
xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?
1)传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
2)传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导
3)xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
4)Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
5)列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
6)对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
7)xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
8)可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
“xgboost代价函数里加入正则项,是否优于cart的剪枝”。
决策树的学习过程就是为了找出最优的决策树,然而从函数空间里所有的决策树中找出最优的决策树是NP-C问题,所以常采用启发式(Heuristic)的方法,如CART里面的优化GINI指数、剪枝、控制树的深度。这些启发式方法的背后往往隐含了一个目标函数,这也是大部分人经常忽视掉的。xgboost的目标函数如下:
其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2模的平方:
那这个跟剪枝有什么关系呢???
跳过一系列推导,我们直接来看xgboost中树节点分裂时所采用的公式:
这个公式形式上跟ID3算法(采用entropy计算增益) 、CART算法(采用gini指数计算增益) 是一致的,都是用分裂后的某种值 减去 分裂前的某种值,从而得到增益。为了限制树的生长,我们可以加入阈值,当增益大于阈值时才让节点分裂,上式中的gamma即阈值,它是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。另外,上式中还有一个系数lambda,是正则项里leaf score的L2模平方的系数,对leaf score做了平滑,也起到了防止过拟合的作用,这个是传统GBDT里不具备的特性。
多类别分类时,类别需要从0开始编码
Watchlist不会影响模型训练。
类别特征必须编码,因为xgboost把特征默认都当成数值型的
调参:Notes on Parameter Tuning 以及 Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
训练的时候,为了结果可复现,记得设置随机数种子。
XGBoost的特征重要性是如何得到的?某个特征的重要性(feature score),等于它被选中为树节点分裂特征的次数的和,比如特征A在第一次迭代中(即第一棵树)被选中了1次去分裂树节点,在第二次迭代被选中2次…..那么最终特征A的feature score就是 1+2+….
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9865次
排名:千里之外
转载:19篇
(5)(2)(1)(7)(2)(1)(9)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 xgboost和gbdt 的文章

 

随机推荐