梯度提升算法(Gradient Boosting)是一种集成学习方法,它通过构建多个弱学习器(如决策树)并将其组合成一个强学习器来提高模型的性能。在本演示中,将使用二项式偏差作为损失函数,并探讨正则化、随机梯度下降和特征采样等策略对模型性能的影响。
在梯度提升算法中,正则化是一种重要的策略,它通过缩小学习率(learning_rate
)来控制模型的复杂度,从而避免过拟合。此外,随机梯度下降(通过设置subsample
小于1.0)可以进一步降低模型的方差,提高泛化能力。然而,如果没有正则化,仅使用随机梯度下降通常会导致性能下降。
特征采样是另一种减少模型方差的策略,它通过在每次迭代中随机选择一部分特征进行训练,类似于随机森林中的随机分割。在梯度提升算法中,可以通过设置max_features
参数来控制每次迭代中使用的特征数量。
以下是一个使用Python实现梯度提升分类模型的示例代码。该代码首先生成了一个模拟数据集,并对其进行了训练和测试。然后,它尝试了不同的正则化和随机梯度下降策略,并绘制了测试集偏差随着迭代次数变化的曲线。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, ensemble
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split
# 生成模拟数据集
X, y = datasets.make_hastie_10_2(n_samples=4000, random_state=1)
labels, y = np.unique(y, return_inverse=True)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)
# 设置初始参数
original_params = {
"n_estimators": 400,
"max_leaf_nodes": 4,
"max_depth": None,
"random_state": 2,
"min_samples_split": 5,
}
# 绘制不同策略下的测试集偏差曲线
plt.figure()
for label, color, setting in [
("无正则化", "orange", {"learning_rate": 1.0, "subsample": 1.0}),
("learning_rate=0.2", "turquoise", {"learning_rate": 0.2, "subsample": 1.0}),
("subsample=0.5", "blue", {"learning_rate": 1.0, "subsample": 0.5}),
("learning_rate=0.2, subsample=0.5", "gray", {"learning_rate": 0.2, "subsample": 0.5}),
("learning_rate=0.2, max_features=2", "magenta", {"learning_rate": 0.2, "max_features": 2}),
]:
params = dict(original_params)
params.update(setting)
clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
test_deviance = np.zeros((params["n_estimators"],), dtype=np.float64)
for i, y_proba in enumerate(clf.staged_predict_proba(X_test)):
test_deviance[i] = 2 * log_loss(y_test, y_proba[:, 1])
plt.plot((np.arange(test_deviance.shape[0]) + 1)[::5], test_deviance[::5], "-", color=color, label=label)
plt.legend(loc="upper right")
plt.xlabel("迭代次数")
plt.ylabel("测试集偏差")
plt.show()
通过上述代码,可以看到不同正则化和随机梯度下降策略对模型性能的影响。在实际应用中,可以根据具体问题选择合适的策略来优化模型。