如何选择梯度提升的估计器数量

在数据科学中,如今有许多可用的算法。 因此,一种有用的技术是将它们组合在一个模型中以充分利用每个模型,从而产生更准确的模型。

使用 Scikit-Learn,您会发现随机森林算法,即套袋类集成模型。 另一方面,您还会发现 Boosting 模型,它按顺序训练估计器,其中一个模型的结果传递给下一个模型,它将尝试改进预测,直到达到最佳结果。

创建梯度提升估计器时,你会发现这个超参数 n_estimator=100 为获得结果而创建的默认值为 100 棵树。 很多时候,我们只是将其设置为默认值或根据需要增加,甚至使用网格搜索技术。

在这篇文章中,我们将找到一种简单的方法来获取用于训练我们模型的单个数字。

可以使用此类从 Scikit-Learn 加载梯度提升 from sklearn.ensemble import GradientBoostingRegressor. 梯度提升算法可用于分类或回归模型。 它是一个基于树的估计器——这意味着它由许多决策树组成。

结果 树1 会产生错误。 这些错误将被使用并且输入 树2. 再一次,将使用上一个模型的错误和下一个模型的输入,直到达到 n_estimators 计算值。

每个模型都会适应前一个模型的错误。 图片由作者提供。

由于每个估计器都会拟合前一个估计器的误差,因此期望预测的组合将优于任何单独的估计器。 每次迭代后,我们都会让模型变得更复杂,减少偏差但增加方差,另一方面。 所以我们必须知道什么时候停止。

现在让我们看看如何做到这一点。

本练习的代码很简单。 我们所要做的就是在每次迭代后进行循环,并检查我们在哪一次迭代中的错误率最低。

让我们从选择一个数据集开始。 我们将使用 车祸 数据集,原生于 seaborn 库(因此是 BDS 许可下的开放数据)。

# 数据集
df = sns.load_dataset('car_crashes')

快速浏览一下数据。 我们将尝试估计 total 使用其他特征作为预测变量的数量。 因为它是实数输出,所以我们谈论的是回归模型。

车祸数据集, 来自 seaborn。 图片由作者提供。

快速查看相关性。

# 相关性
df.corr().style.background_gradient(cmap='coolwarm')
数据集中的相关性。 图片由作者提供。

好的,没有主要的多重共线性。 我们可以看到 ins_premiumins_lossestotal ,所以我们不会在模型中考虑它们。

如果我们检查丢失的数据,则没有

# 失踪
df.isnull().sum()
0

很好,现在让我们拆分数据。

# X 和 Y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], axis=1)
y = df['总计']
# 训练测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

我们可以创建一个管道来扩展数据并对其建模(缩放这些数据真的不是很有必要,因为它们已经处于相同的比例,以十为基础). 接下来,我们将数据拟合到模型中并预测结果。

我正在使用 500 个估算器 learning_rate 0.3。

学习率是我们为达到最小错误而采取的步骤的大小。 如果我们使用的值太高,我们可能会超过最小值。 如果我们使用的数字太小,我们甚至可能无法接近它。 因此,您可以考虑的一个经验法则是:如果您有大量估计量,则可以使用较低的学习率值。 如果您只有几个估算器,则更喜欢使用更高的学习率值。

steps = [('scale', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# 实例管道和拟合
pipe = Pipeline(步数).fit(X_train, y_train)
# 预测
preds = pipeline.predict(X_test)

现在,评估。

# 预测的 RMSE
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[输出]:均方根误差:1.1# 真实 Y 值的平均值
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]:数据y均值:15.8

好的。 我们的 RMSE 约为平均值的 6.9%。 所以我们平均偏离了这么多。

现在让我们检查一种调整模型的方法,方法是选择最佳数量的估计器进行训练,这将使我们的错误率最低。

就像我说的,我们真的不需要缩放这些数据,因为它已经处于相同的比例。 因此,让我们拟合模型。

#模型
gbr = GradientBoostingRegressor(n_estimators=500,learning_rate=0.3).fit(X_train, y_train)

现在是好东西。 Gradient Boosting 中有一种方法允许我们迭代每个训练的估计器的预测,从 1 到 500。因此,我们将创建一个循环遍历 500 个估计器 gbr 模型,使用该方法预测结果 staged_predict(), 计算均方误差并将结果存储在列表中 errors.

# 循环寻找最佳数字
错误 = [ gbr.staged_predict(X_test) 中预测值的mean_squared_error(y_test, preds)]
# 估计器的最佳数量
best_num_estimators = np.argmin(errors) + 1

接下来,我们可以绘制结果。

#阴谋
g=sns.lineplot(x=范围(500), y=错误)
g.set_title(f'最佳估计数在{best_n_estimators}', size=15);
估计器的最佳数量。 图片由作者提供。

我们看到错误率最低的是 34 个估计器。 因此,让我们使用 34 个估计器重新训练我们的模型,并与使用管道训练的模型的结果进行比较。

# 再训练
gbr = GradientBoostingRegressor(n_estimators=34,learning_rate=0.3).fit(X_train, y_train)
# 预测
preds2 = gbr.predict(X_test)

评估…

# 预测的 RMSE
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[输出]:均方根误差:1.0
# 数据 Y 均值
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]:数据y均值:15.8

我们现在从 6.9% 降到 6.3%。 大约。 好 9%。 让我们来看看一些预测。

两个模型的预测。 图片由作者提供。

有趣的结果。 第二个模型的一些预测比第一个更好。

我们学习了如何确定最佳数量的估计器来调整 GradientBoostingRegressor 来自 Scikit-Learn。 这是一个超参数,可以在这种集成模型中发挥作用,按顺序训练估计器。

有时,经过几次迭代后,模型可能会开始过度拟合,因此它会开始过度增加方差,从而影响预测。

我们看到一个简单的循环可以帮助我们找到这种情况下的最优解。 但是,当然,对于大型数据集来说,计算起来可能很昂贵,所以一个想法是尝试一个更低的 n_estimators 首先看看你是否能尽快达到最小误差。

这是 完整代码在 GitHub.

如果你喜欢这个内容,请关注我的博客。

找到我 LinkedIn.

此练习基于参考资料中 Aurélien Géron 的优秀教科书。

How to choose the number of estimators for Gradient Boosting 转载自 Source https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 通过 https://towardsdatascience.com/feed

–>

时间戳记:

更多来自 区块链顾问