参考
https://www.cnblogs.com/DjangoBlog/p/6201663.html
https://www.jianshu.com/p/005a4e6ac775
GBDT简介
决策树分为两大类,回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女? GBDT的核心在于累加所有树的结果作为最终结果,就像前面对年龄的累加(-3是加负3),而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,不是分类树,GBDT用来做回归预测。
回归树
回归树的每一个节点都会得一个预测值。该预测值是该节点所有训练数据的的平均值。提升树
提升树是迭代多棵回归树来共同决策。当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树
Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。
当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,我们称为模型的方差很大(对不同组数据的预测结果很不同),这就是过拟合。
GBDT参数含义和调整
boosting parameters
n_estimators:最大迭代次数,太大过拟合,太小欠拟合。
learning_rate:每个弱学习器的权重缩减系数,每个弱学习器的权重缩减系数。这个越小,意味这需要的迭代次数越多,所以这两个参数要一起调整参数。
一般而言,learning_rate小而且n_estimators高的模型由更好的性能,但是性能偏低。
subsample:子采样比例
loss:损失函数。lad是绝对损失,ls是均方差。
tree based parameters
max_depth:数据量少的时候可以不限制该值,由模型自己决定。数据量多的时候可以限制这个深度。
max_leaf_nodes:规定叶子节点的的最大数目。如果不填入同样由模型自己决定
min_samples_split:如果某个节点的样本数目小于该值,则不再增长
min_impurity_split:如果某个节点的不纯度小于该值,则不再增长
min_samples_leaf:如果一个节点进行划分后,一个叶子节点的样本数目小于该数目,则会放弃这次划分。生成的两个叶子节点都会被剪枝。
min_weight_fraction_leaf:和上面类似,不过评价标注从样本数目变成了样本的权重之和。
max_features:对单一树进行划分采用的最大特征树。一般在特征树小于50的时候我们可以不限制。如果超过50非常多可以进行限制,主要目的是减少决策树的生成时间。
调参过程
- 首先确定learning_rate,一般而言0.1即可。
- 确定一个n_estimators,50~70之间即可,保证下一步调参数的性能。
- 调整tree based parameters参数。
- 减少learning_rate,增大n_estimators
评价标准
在机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。
MSE: 差值的平方的和的均值。
RMSE:MSE的平方根
MAE:差值的绝对值的和的均值
R2:将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况。
1-(差值(预测值和真实值)的平方的和)/差值(真实值的均值和真实值)的平方的和)
具体实践GridSearchCV
#1.指定learning rate(0.1)
#2.调整树n_estimators
#3.Tune max_depth and num_samples_split
#4.Tune min_samples_leaf
#5.Tune max_features
#6.降低学习率,提高n_estimators到最佳值
第一步骤的示例步骤的代码如下
param_test1 = {'n_estimators': range(20, 81, 10)}
gsearch1 = GridSearchCV(
estimator=gbrt(learning_rate=0.1, min_samples_split=100, min_samples_leaf=10, max_depth=5, max_features='sqrt',
subsample=0.8, random_state=10),
param_grid=param_test1, scoring='neg_mean_absolute_error', n_jobs=-1, iid=False, cv=5)
gsearch1.fit(X_train, Y_train)
print(gsearch1.grid_scores_, '\n', gsearch1.best_params_, '\n', gsearch1.best_score_