【2021.04--集成学习(中)-Task10】梯度提升树

本次 DataWhale 第二十三期组队学习,其开源内容的链接为:https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning

这一次的任务可以看作提升方法的下半部分,相较于李航老师的《统计学习方法》,跳过了AdaBoost算法的训练误差分析部分,同时补充了梯度提升树的案例(非常赞)。在书中的误差分析部分,可以知道训练误差可以被 Z m {Z}_m Zm控制住,同时,结合向前分步算法与AdaBoost部分才可以指导算法中 α m {\alpha}_m αm的取值也是 Z m {Z}_m Zm取最小值的地方。

这一部分对AdaBoost用前面的三大要素进行阐释,即加法模型、损失函数是指数函数、学习算法为向前分布算法的二类分类问题。而向前分步是通过数学归纳法来证明的。提升方法也是采用加法模型和向前分步算法,以树模型为基函数的提升方法称为提升树。针对不同的问题的提升树学习算法,只要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数损失函数的分类问题和一般损失函数的一般决策问题。可以将提升树看作AdaBoost将基学习器限制为二分类树的特殊情况,所以书(教程)中本次任务介绍回归树问题。

回归树的参数 θ {\theta} θ表示树的区域划分(叶子节点)和区域上的常数(叶子节点的值)。同时采用平方误差时,可以简单地拟合当前模型的残差,原因如下(基于前向分布算法): L ( y , f ( x ) ) = L ( y , f ( m − 1 ) ( x ) + T ( x ; θ m ) ) = [ y − f ( m − 1 ) − T ( x ; θ m ) ) ) ] 2 = [ r − T ( x ; θ m ) ) ] 2 L(y,f(x))=L(y,{f}_(m-1)(x)+T(x;{\theta}_m))=[y-{f}_(m-1)-T(x;{\theta}_m)))]^2=[r-T(x;{\theta}_m))]^2 L(y,f(x))=L(y,f(m1)(x)+T(x;θm))=[yf(m1)T(x;θm)))]2=[rT(x;θm))]2书中例题看下来,发现这个原来是个分段函数。然后是教程补充的梯度提升决策树算法(案例来源:https://blog.csdn.net/zpalyq110/article/details/79527653 )

案例的代码在Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial

#下面用sklearn训练GDBT
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_friedman1
from sklearn.ensemble import GradientBoostingRegressor

'''
GradientBoostingRegressor参数解释:
loss:{‘ls’, ‘lad’, ‘huber’, ‘quantile’}, default=’ls’:‘ls’ 指最小二乘回归. 
    ‘lad’ (最小绝对偏差) 是仅基于输入变量的顺序信息的高度鲁棒的损失函数。.
    ‘huber’ 是两者的结合. ‘quantile’允许分位数回归(用于alpha指定分位数)
learning_rate:学习率缩小了每棵树的贡献learning_rate。在learning_rate和n_estimators之间需要权衡。
n_estimators:要执行的提升次数。
subsample:用于拟合各个基础学习者的样本比例。如果小于1.0,则将导致随机梯度增强。subsample与参数n_estimators。
    选择会导致方差减少和偏差增加。subsample < 1.0
criterion:{'friedman_mse','mse','mae'},默认='friedman_mse':“ mse”是均方误差,“ mae”是平均绝对误差。
    默认值“ friedman_mse”通常是最好的,因为在某些情况下它可以提供更好的近似值。
min_samples_split:拆分内部节点所需的最少样本数
min_samples_leaf:在叶节点处需要的最小样本数。
min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。
max_depth:各个回归模型的最大深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量的相互作用。
min_impurity_decrease:如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
min_impurity_split:提前停止树木生长的阈值。如果节点的杂质高于阈值,则该节点将分裂
max_features{‘auto’, ‘sqrt’, ‘log2’},int或float:寻找最佳分割时要考虑的功能数量:
    如果为int,则max_features在每个分割处考虑特征。
    如果为float,max_features则为小数,并 在每次拆分时考虑要素。int(max_features * n_features)
    如果“auto”,则max_features=n_features。
    如果是“ sqrt”,则max_features=sqrt(n_features)。
    如果为“ log2”,则为max_features=log2(n_features)。
    如果没有,则max_features=n_features。
'''

X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
print("X's shape is", X.shape)
X_train, X_test = X[:200], X[200:]
y_train, y_test = y[:200], y[200:]
est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1,
    max_depth=1, random_state=0, loss='ls').fit(X_train, y_train)
mean_squared_error(y_test, est.predict(X_test))
X's shape is (1200, 10)





5.009154859960321
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
X, y = make_regression(random_state=0)
print("X's shape is", X.shape)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, random_state=0)
reg = GradientBoostingRegressor(random_state=0)
reg.fit(X_train, y_train)
reg.score(X_test, y_test)
X's shape is (100, 100)





0.4379326910967305

关于本次小作业,可以看看网上的一个中文文档:https://www.scikitlearn.com.cn/0.21.3/12/#1114-gradient-tree-boosting

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值