Boosting到Gradient Boosting
Boosting是集成学习的一种基分类器(弱分类器)生成方式,核心思想是通过迭代生成了一系列的学习器,给误差率低的学习器高权重,给误差率高的学习器低权重,结合弱学习器和对应的权重,生成强学习器。
Boosting算法要涉及到两个部分,加法模型和前向分步算法。
加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:
Gradient Boosting
Boosting 算法(以AdaBoost为代表)用错分数据点来识别问题,通过调整错分数据点的权重来改进模型。Gradient Boosting通过负梯度来识别问题,通过计算负梯度来改进模型。
Gradient Boosting每次迭代的目标是为了减少上一次的残差,在残差减少的梯度(Gradient)方向上建立一个新的模型,每个新的模型的建立是使之前模型的残差往梯度方向减少。
第t轮的第i个样本的损失函数的负梯度为:
GBDT回归算法原理
GBDT分类算法
小例子+可视化理解GBDT
上面对原理进行了分析之后,大致对GBDT有了一定的认识,为了更加形象的解释GBDT的内部执行过程,这里引用《统计学习方法》中adaboost一节中的案例数据来进行进一步分析。强烈建议大家对比学习,看一下Adaboost和 GBDT 的区别和联系。数据集如下:
采用GBDT进行训练,为了方便,我们采用MSE作为损失函数,并且将树的深度设为1,决策树个数设为5,其他参数使用默认值
import numpy as np import pandas as pd from sklearn import tree import matplotlib.pyplot as plt from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import train_test_split X = np.arange(1,11) y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05]) gbdt = GradientBoostingRegressor(n_estimators=5,max_depth=1) gbdt.fit(X.reshape(-1,1),y)
其中GradientBoostingRegressor主要参数如下
GradientBoostingRegressor(alpha=0.9, criterion='friedman_mse', init=None, learning_rate=0.1, loss='ls', max_depth=1, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=5, n_iter_no_change=None, presort='auto', random_state=None, subsample=1.0, tol=0.0001, validation_fraction=0.1, verbose=0, warm_start=False)
其他参数为决策树参数,大家应该已经很熟悉了,不再赘述。
#计算残差 y - y.mean() [out]: array([-1.747, -1.607, -1.397, -0.907, -0.507, -0.257, 1.593, 1.393, 1.693, 1.743])
print((y - y.mean())[:6].mean(),(y - y.mean())[6:10].mean())[out]:-1.07 1.605 #计算mse print( ((y - y.mean())**2).mean(), ((y[:6] - y[:6].mean())**2).mean(), ((y[6:10] - y[6:10].mean())**2).mean())[out] 1.911421 0.309689 0.0179686
第一棵树的可视化
tree.plot_tree(gbdt[0,0],filled=True)