梯度提升树就像一群小树苗在接力成长,每棵新树都专注于前辈们犯过的错误,最终长成一片预测能力强大的森林。下面我用Python展示这个强大的算法。
from sklearn.ensemble import GradientBoostingRegressor # 回归问题用
from sklearn.ensemble import GradientBoostingClassifier # 分类问题用
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, accuracy_score
import numpy as np
import matplotlib.pyplot as plt
# 生成一个有噪声的波浪形数据集
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
plt.scatter(X_train, y_train, label='训练数据')
plt.title("原始数据")
plt.legend()
plt.show()
# 创建梯度提升树回归器
gbr = GradientBoostingRegressor(
n_estimators=100, # 100棵小树
learning_rate=0.1, # 学习率
max_depth=3, # 每棵树的最大深度
min_samples_split=2,
random_state=42
)
# 训练模型
gbr.fit(X_train, y_train)
# 预测
y_pred = gbr.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"测试集均方误差(MSE): {mse:.4f}")
# 生成预测线
X_plot = np.linspace(0, 10, 1000).reshape(-1, 1)
y_plot = gbr.predict(X_plot)
plt.scatter(X_train, y_train, label='训练数据')
plt.plot(X_plot, y_plot, color='red', linewidth=2, label='GBDT预测')
plt.title("梯度提升树回归效果")
plt.legend()
plt.show()
# 创建分类数据集
from sklearn.datasets import make_classification
X_clf, y_clf = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
# 分割数据
X_train_clf, X_test_clf, y_train_clf, y_test_clf = train_test_split(
X_clf, y_clf, test_size=0.2, random_state=42)
# 训练分类器
gbc = GradientBoostingClassifier(n_estimators=100, random_state=42)
gbc.fit(X_train_clf, y_train_clf)
# 查看训练过程中准确率的变化
test_acc = [accuracy_score(y_test_clf, y_pred)
for y_pred in gbc.staged_predict(X_test_clf)]
plt.plot(range(1, 101), test_acc)
plt.xlabel("树的数量")
plt.ylabel("测试集准确率")
plt.title("GBDT分类器学习曲线")
plt.show()
假设我们有3天的水果销售数据:
天数 | 天气(1-5) | 周末(0/1) | 实际价格 |
---|---|---|---|
1 | 3 | 0 | 10元 |
2 | 5 | 1 | 15元 |
3 | 2 | 0 | 8元 |
GBDT的工作流程:
learning_rate
:控制每棵树的贡献(小步慢走更稳健)n_estimators
:树的数量(太多可能过拟合)max_depth
:每棵树的复杂度(通常3-5层足够)记住:梯度提升树就像一群互相帮助的学生,每个新学生都特别关注班上做错题的同学,最终全班成绩越来越好!