梯度提升树(Gradient Boosting Machines, GBM)是一种集成学习方法,通过迭代地训练决策树,并让每棵新的树拟合前一棵树的残差,从而逐步提高模型的准确率。下面是一个简单的Python实现GBM的例子:
实现思路:
- 使用决策树作为弱学习器。
- 每次训练新树时,使用当前模型的预测残差作为新树的目标。
- 将每棵树的预测结果加到最终的预测上,并通过学习率调节每棵树的贡献。
实现步骤:
- 首先导入必要的库。
- 实现GBM的主体逻辑,包括计算损失、拟合残差等。
- 使用均方误差作为损失函数。
Python代码实现:
import numpy as np
from sklearn.tree import DecisionTreeRegressor
class GradientBoostingRegressor:
    def __init__(self, n_estimators=100, learning_rate=0.1, max_depth=3):
        self.n_estimators = n_estimators          # 弱学习器的数量
        self.learning_rate = learning_rate        # 学习率
        self.max_depth = max_depth                # 决策树的最大深度
        self.trees = []                           # 用于存储每棵决策树
    
    def fit(self, X, y):
        # 初始化模型为常量值,通常使用均值
        self.initial_pred = np.mean(y)
        residuals = y - self.initial_pred  # 初始残差
        # 逐步训练每一棵决策树
        for i in range(self.n_estimators):
            tree = DecisionTreeRegressor(max_depth=self.max_depth)
            tree.fit(X, residuals)  # 拟合残差
            self.trees.append(tree)
            # 更新残差
            residuals -= self.learning_rate * tree.predict(X)
    
    def predict(self, X):
        # 初始预测为常量值
        pred = np.full(X.shape[0], self.initial_pred)
        
        # 累加每棵树的预测值
        for tree in self.trees:
            pred += self.learning_rate * tree.predict(X)
        
        return pred
# 生成模拟数据
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练GBM模型
gbm = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3)
gbm.fit(X_train, y_train)
# 预测并评估模型
y_pred = gbm.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
代码解释:
- GradientBoostingRegressor类中,- fit函数用于训练GBM模型,逐步拟合残差。
- predict函数用于根据训练好的模型进行预测。
- 在训练过程中,每棵新树都拟合当前残差,学习率(learning_rate)控制每棵树对整体模型的贡献。
- 最后,我们使用模拟数据进行模型训练和评估,使用均方误差(MSE)来衡量模型的效果。
运行结果:
该代码将输出模型在测试集上的均方误差,表示模型的预测性能。
可扩展性:
- 可以根据需要扩展为支持分类问题。
- 可以引入更多高级功能,例如提前停止、最小样本分裂等。

编辑
评论内容