赞
踩
定义:梯度提升树GBDT是集成学习Boosting家族成员之一,也称为GBT、GTB、GBRT、MART。(是一种从弱分类器中创建一个强分类器的集成技术。它先由训练数据构建一个模型,然后创建第二个模型来尝试纠正第一个模型的错误,不断地添加模型,直到训练集完美预测或已经添加到数量上限)
GBDT是采用前向分布算法进行迭代,但弱学习器只能使用CART回归树模型。GBDT在迭代过程中,假设前一轮迭代得到的强学习器是,损失函数
,本轮迭代的目标是找到一个CART回归树弱学习器
,即本轮的损失为
最小。
训练样本集:,最大迭代次数为T,损失为Loss。
初始化弱学习器:
对于样本有负梯度
,用
拟合一颗CART回归树,得到第t颗回归树的叶子节点区域为
的最佳拟合值:
更新强学习器:
得到强学习器:
GBDT分类算法在思想上与回归算法没有区别,只是样本输出不是连续的值,是离散的类别,从而无法直接从输出类别去拟合类别是输出的误差。针对于这种情况,可以采用两种形式进行处理:(1)逻辑回归的对数似然损失函数法(2)指数损失函数法。简而言之,就是用类别的预测概率值与真实概率值的差来拟合损失。以对数似然损失函数法为例:
二元分类
损失函数:,其中
负梯度误差:, 各个叶子节点的最佳负梯度拟合值:
由于上式难以优化,即选取近似值代
与回归算法的区别:负梯度的计算和叶子节点最佳负梯度拟合的线性搜索。
多元分类
假设类别为K,损失函数:
如果样本输出类别为k,则。第k类的概率为:
计算第t轮的第i个样本对应类别l的负梯度误差(样本i对应类别l的真实概率和t-1轮预测概率的差值):
各个叶子节点的最佳负梯度拟合值:
由于上式难以优化,即选取近似值代替:
与回归算法的区别:负梯度的计算和叶子节点最佳负梯度拟合的线性搜索。
常匹配的损失函数
分类算法:对数似然损失函数(如上)、指数损失函数
回归算法:均方差损失函数、绝对误差损失函数
,它们对应的负梯度误差为:
。
Huber损失函数,对应的负梯度误差为
。
分位数损失函数 ,对应得负梯度误差为
.
学习率,
,对于同样的训练集学习效果,较小的
对应着需要更多的弱学习器得迭代次数。通常用学习率和迭代最大次数一起决定算法的拟合效果。
子采样比例,取值范围为。这里的子采样和随机森林不一样,随机森林是有放回抽样,这里是不放回抽样。取值为1时,全部样本参与,此时没有使用子采样。取值小于1时,只有一部分样本去做GBDT决策树拟合。小于1的子采样比例可以减少方差,防止过拟合,但会增加样本拟合的偏差,所以此值也不宜太低,一般在
之间。
对CART回归树进行正则化剪枝。
回归样例:
说明:GBRT是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一颗CART回归树,GBRT会累加所有树的结果。
- import numpy as np
- import pandas as pd
- from sklearn import metrics
- import matplotlib.pyplot as plt
- from sklearn.model_selection import train_test_split
- from sklearn.model_selection import KFold
- from sklearn.model_selection import GridSearchCV
- from sklearn.ensemble import GradientBoostingRegressor
-
-
- data = pd.read_csv(filename)
- data_x = data[[columns[0], columns[1], columns[3], columns[4], columns[5]]]
- data_y = data[[columns[2]]]
- trainx, testx, trainy, testy = train_test_split(data_x, data_y, test_size=1-split, random_state=0)
- print(trainx.shape, testx.shape, trainy.shape, testy.shape)
-
- def performance(yture, ypred):
- score = metrics.r2_score(yture, ypred)
- return score
-
- def model_fit(x, y):
- cross_validator = KFold(n_splits=3, shuffle=True, random_state=500)
- regression = GradientBoostingRegressor(loss='ls', max_features=None, learning_rate=0.2)
- para = {'max_depth': range(1, 30)}
- score_fnc = metrics.make_scorer(performance)
- grid = GridSearchCV(regression, para, cv=cross_validator, scoring=score_fnc)
- grid = grid.fit(x, y)
- return grid.best_estimator_
-
- trainy = np.array(trainy).astype('int').ravel()
- model = model_fit(trainx, trainy)
- print(model)
- testy = np.array(testy)[:, 0]
-
- def model_est(model):
- ypre = model.predict(testx)
- r2 = performance(testy, ypre)
- MSE = metrics.mean_squared_error(testy, ypre)
- RMSE = metrics.mean_squared_error(testy, ypre) ** 0.5
- MAE = metrics.mean_absolute_error(testy, ypre)
- print('r2', r2)
- print('MSE', MSE)
- print('RMSE', RMSE)
- print('MAE', MAE)
-
- plt.figure(figsize=(10, 8), dpi=100)
- plt.plot(testy, label='true')
- plt.plot(ypre, label='predict')
- plt.legend()
- plt.title('GBRT predict result compare')
- plt.show()
-
- model_est(model)

GBRT模型研究方向
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。