内容简介:GBDT分类器和回归器的大部分参数都是相同的,除了损失函数的选项有些不同,因此下面我们统一说明各个参数的意义以及在什么情境下做什么调整方法。1.n_estimators:代表弱学习器的最大个数,即最多训练多少棵树。这个值过大导致过拟合,过小导致欠拟合.默认值为100.2.learning_rate:每个弱学习器都有一个权重参数,默认值0.1,取值范围0-1。 learning_rate和n_estimators同时决定着模型的拟合效果,因此要同时调整,建议从一个小一点的学习率开始。
GBDT分类器和回归器的大部分参数都是相同的,除了损失函数的选项有些不同,因此下面我们统一说明各个参数的意义以及在什么情境下做什么调整方法。
一、GBDT的boosting框架参数
1.n_estimators:代表弱学习器的最大个数,即最多训练多少棵树。这个值过大导致过拟合,过小导致欠拟合.默认值为100.
2.learning_rate:每个弱学习器都有一个权重参数,默认值0.1,取值范围0-1。 learning_rate和n_estimators同时决定着模型的拟合效果,因此要同时调整,建议从一个小一点的学习率开始。
fn(x)=fn-1(x)+l_r*T(n,x) #即本轮的学习器等于本轮以前的学习器加上学习率乘以本轮得到的弱学习器 复制代码
3.subsample:子采样比例,默认1.0,是不放回的采样,与随机森林的有放回采样不一样。如果为1.0,表示每轮采用全部数据生成决策树,容易过拟合,方差容易比较大。但是如果过小,容易造成高偏差,所以这个值需要这种,建议0.5-0.8之间。
4.init:初始学习器的值,在有一定先验知识的情况下可以自己设定,。但是一般不用。
5.loss:损失函数的选择,对于分类和回归是有区别的。
分类:可选项有{'deviance','exponential'},"deviance"对数似然损失函数和'exponential'指数损失函数,默认对数似然损失函数,对于二分类以及多分类问题采用对数似然损失函数比较好,这种损失函数用的也比较多。而指数损失函数,让我们想到的是Adaboost,即改变本轮错误训练的数据在下一轮训练中的权值,使错误分类的样本得到更多重视。
回归:可选项有{'ls', 'lad', 'huber', 'quantile'},ls是均方,lad是绝对误差,
huber是抗噪音损失函数,公式为:
当残差大于delta,应当采用L1(对较大的异常值不那么敏感)来最小化,而残差小于超参数,则用L2来最小化。本质上,Huber损失是绝对误差,只是在误差很小时,就变为平方误差。它对数据中的异常点没有平方误差损失那么敏感。它在0也可微分。使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能导致在使用梯度下降快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减小而减小,使结果更加精确。在这种情况下,Huber损失就非常有用。它会由于梯度的减小而落在最小值附近。比起MSE,它对异常点更加鲁棒。因此,Huber损失结合了MSE和MAE的优点。但是,Huber损失的问题是我们可能需要不断调整超参数delta。
quantile分箱误差,需要对训练数据进行分段预测时。
6.alpha:只有 loss='huber'
或者 loss='quantile'
时,需要指定分位数的值,默认0.9,如果噪音较多,可以提高这个值。
二、弱学习器参数:生成决策树时候的参数
1.max_features:划分时考虑的特征数量。当特征数量并不多,小于50,可以None,即默认使用全部特征。也可以是如下几个。
2.max_depth:每棵子树的深度,默认为3.如果数据量和特征都不多,可以不管这个参数。但是当较大时,建议限制深度,10-100之间。
3.min_samples_split:子树继续划分的条件,默认为2.当一个节点内的样本数量少于该值时,该节点不再拆分,当作叶节点。当数据量小不用管,数据量大可以增大该值。
4.min_samples_leaf:叶子节点最少的样本数,默认1.如果叶节点的样本数少于该值,会和兄弟节点一起被剪纸,相当于不需要对上层的样本再做细分,因为叶节点中只有一个样本,分支意义不大。当数量级大,可以增大这个值。
5.min_weight_fraction_leaf:限制了叶子节点所有样本权重和的最小值。如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,即不考虑。如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
6.max_leaf_nodes:最大叶子节点数量,默认为None,在限制的叶节点数之内生成最优决策树,可以防止过拟合。当数量级较大,可以限制这个数。
7.min_impurity_split:最小基尼不纯度,如果某个节点的基尼不纯度小于该值,则不再划分,视为叶节点,默认1e-7,一般不修改。
三、调参过程
1.先对提升框架内的,迭代次数和学习率做调整,选一个较小的学习率,对迭代次数网格化调餐。
param_test1 = {'n_estimators':range(20,101,10)} gsearch1 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300, min_samples_leaf=20,max_depth=8,max_features='sqrt', subsample=0.8,random_state=10), param_grid = param_test1, scoring='roc_auc',iid=False,cv=5) gsearch1.fit(X,y) gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_ 复制代码
2.接下来对决策树调餐,先一起调整max_depth和min_samples_split,根据输出的最优值将max_depth定下俩,后续再调整最小划分样本数。
param_test2 = {'max_depth':range(3,14,2), 'min_samples_split':range(100,801,200)} gsearch2 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60, min_samples_leaf=20, max_features='sqrt', subsample=0.8, random_state=10), param_grid = param_test2, scoring='roc_auc',iid=False, cv=5) gsearch2.fit(X,y) gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_ 复制代码
3.再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。看二者的最优值是否在边界上,如果在边界上,就进一步改变参数范围再网格化调餐。
param_test3 = {'min_samples_split':range(800,1900,200), 'min_samples_leaf':range(60,101,10)} gsearch3 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7, max_features='sqrt', subsample=0.8, random_state=10), param_grid = param_test3, scoring='roc_auc',iid=False, cv=5) gsearch3.fit(X,y) gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_ 复制代码
4.再对max_features和subsample进行网格化。
5.最后可以通过,减小学习率,增大迭代次数,增加泛化能力,防止过拟合。保持两者的乘积基本不变,但步长设定过小,会导致拟合效果反而变差,应适当减小学习率。
以上所述就是小编给大家介绍的《GBDT调参指南》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Engine Architecture, Second Edition
Jason Gregory / A K Peters/CRC Press / 2014-8-15 / USD 69.95
A 2010 CHOICE outstanding academic title, this updated book covers the theory and practice of game engine software development. It explains practical concepts and techniques used by real game studios,......一起来看看 《Game Engine Architecture, Second Edition》 这本书的介绍吧!