📜  ML – 梯度提升

📅  最后修改于: 2022-05-13 01:54:26.603000             🧑  作者: Mango

ML – 梯度提升

梯度提升是一种流行的提升算法。在梯度提升中,每个预测器都会纠正其前任的错误。与 Adaboost 相比,训练实例的权重没有调整,而是使用前任的残差作为标签来训练每个预测器。

有一种称为梯度提升树的技术,其基础学习器是 CART(分类和回归树)。

下图解释了如何针对回归问题训练梯度提升树。

用于回归的梯度提升树

集成由N棵树组成。 Tree1 使用特征矩阵X和标签y进行训练。标记为y1(hat)的预测用于确定训练集残差r1 。然后使用特征矩阵X和 Tree1 的残差r1作为标签训练 Tree2。然后使用预测结果r1(hat)来确定残差r2 。重复该过程,直到训练完构成集成的所有N棵树。

该技术中使用了一个重要参数,称为收缩率

收缩是指集成中每棵树的预测在乘以介于 0 到 1 之间的学习率 (eta) 后收缩。需要通过增加估计量来补偿,以达到一定的模型性能。由于现在所有的树都经过训练,因此可以进行预测。

每棵树预测一个标签,最终预测由公式给出,

y(pred) = y1 + (eta *  r1) + (eta * r2) + ....... + (eta * rN)

scikit-learn 中梯度提升回归的类是GradientBoostingRegressor 。一种类似的算法用于分类,称为GradientBoostingClassifier

代码:梯度提升回归器的Python代码

# Import models and utility functions
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSE
from sklearn import datasets
  
# Setting SEED for reproducibility
SEED = 1
  
# Importing the dataset 
bike = datasets.load_bike()
X, y = bike.data, bike.target
  
# Splitting dataset
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.3, random_state = SEED)
  
# Instantiate Gradient Boosting Regressor
gbr = GradientBoostingRegressor(n_estimators = 200, max_depth = 1, random_state = SEED)
  
# Fit to training set
gbr.fit(train_X, train_y)
  
# Predict on test set
pred_y = gbr.predict(test_X)
  
# test set RMSE
test_rmse = MSE(test_y, pred_y) ** (1 / 2)
  
# Print rmse
print('RMSE test set: {:.2f}'.format(test_rmse))

输出:

RMSE test set: 4.01