彻底讲透 一个强大算法模型,GBDT !!


哈喽,我是kk~
群里有同学,最近刚刚面试完美团。
由于只工作了一年,基础问的还是比较多。另外,论文方面问的不少。
最后拿到了offer。
其中有一个重点项GBDT,和他聊了很多,这里总结一拨也分享给大家~
内容非常详细,建议大家收藏起来慢慢学习~
梯度提升决策树(Gradient Boosting Decision Trees,GBDT)是一种在回归和分类任务中常用的强大机器学习技术。
在这里,咱们深入探讨GBDT的原理,解释其基础机制,并通过Python代码提供一个详细的示例。我们还将可视化结果,以说明模型的性能。
目录
GBDT简介
GBDT原理和公式
模型训练
Python实现
可视化
结论
GBDT简介
梯度提升决策树是一种集成技术,通过结合多个基础学习器(通常是决策树)的预测,生成一个强大的模型。与传统的提升方法不同,GBDT通过添加新的树来优化损失函数,这些新的树修正了之前树所犯的错误。这种顺序学习方法使模型能够捕捉到数据中的复杂模式。
GBDT原理和公式
梯度提升的基本原理
GBDT的核心思想是逐步构建模型,每个模型试图修正之前模型的错误。具体来说,每个新模型都被训练用来预测当前模型集成的残差(误差)。
形式化定义
给定一个数据集 
,其中 
 表示输入特征,
 表示目标变量,目标是最小化损失函数 
,其中 
 是集成模型的预测。
预测 
 初始化为一个常数值 
:
新树被逐步添加。每一步 
,新树 
 被训练用来预测损失函数的负梯度(残差):
模型更新如下:
其中 
 是学习率。
损失函数
GBDT中常用的损失函数包括:
回归(平方误差损失):
分类(逻辑损失):
模型训练
3.1 数据准备
我们将使用波士顿房价数据集作为示例。目标是根据各种特征预测自有住房的中位数值。
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import GradientBoostingRegressorfrom sklearn.metrics import mean_squared_errorimport matplotlib.pyplot as pltimport numpy as np# 加载数据集 & CSV文件路径file_path = 'boston_housing.csv'# 从CSV文件中读取数据data = pd.read_csv(file_path)# 分离特征和目标变量X = data.drop('TARGET', axis=1).valuesy = data['TARGET']# 将数据分成训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化数据scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)
3.2 训练GBDT模型
我们将使用sklearn.ensemble中的GradientBoostingRegressor。
# 初始化并训练模型gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)gbdt.fit(X_train, y_train)# 预测y_pred_train = gbdt.predict(X_train)y_pred_test = gbdt.predict(X_test)# 计算均方误差mse_train = mean_squared_error(y_train, y_pred_train)mse_test = mean_squared_error(y_test, y_pred_test)print(f"Train MSE: {mse_train:.4f}")print(f"Test MSE: {mse_test:.4f}")
4. Python实现
我们将通过绘制特征重要性和学习过程的图表,进一步说明GBDT模型。
4.1 特征重要性
# 绘制特征重要性feature_importance = gbdt.feature_importances_sorted_idx = np.argsort(feature_importance)plt.figure(figsize=(12, 8))plt.barh(range(len(sorted_idx)), feature_importance[sorted_idx], align='center')plt.yticks(range(len(sorted_idx)), np.array(data.columns.drop('TARGET'))[sorted_idx])plt.xlabel('Feature Importance')plt.title('Feature Importance in Gradient Boosting Decision Trees')plt.show()

4.2 学习过程
我们还可以通过绘制训练和测试误差与提升迭代次数的关系来可视化学习过程。
# 提取训练和测试误差train_errors = []test_errors = []for y_pred in gbdt.staged_predict(X_train):    train_errors.append(mean_squared_error(y_train, y_pred))for y_pred in gbdt.staged_predict(X_test):    test_errors.append(mean_squared_error(y_test, y_pred))# 绘制训练和测试误差plt.figure(figsize=(12, 8))plt.plot(train_errors, label='Training Error')plt.plot(test_errors, label='Testing Error')plt.xlabel('Number of Trees')plt.ylabel('Mean Squared Error')plt.title('Training and Testing Error over Boosting Iterations')plt.legend()plt.show()

5. 可视化
5.1 单个决策树
我们可以可视化集成中的单个决策树,以了解它们如何贡献于整个模型。
from sklearn.tree import plot_tree# 绘制第一棵树plt.figure(figsize=(20, 10))plot_tree(gbdt.estimators_[0, 0], filled=True, feature_names=data.columns.drop('TARGET'))plt.title('First Tree in the Ensemble')plt.show()

# 绘制最后一棵树plt.figure(figsize=(20, 10))plot_tree(gbdt.estimators_[-1, 0], filled=True, feature_names=data.columns.drop('TARGET'))plt.title('Last Tree in the Ensemble')plt.show()

最后
梯度提升决策树是一种强大的集成技术,结合了决策树和提升方法的优势。通过逐步添加修正集成误差的树,GBDT能够有效地建模数据中的复杂模式。本文中,我们详细解释了GBDT,并通过波士顿房价数据集的示例进行了实现和可视化。结果展示了模型在预测房价方面的准确性。
到顶部