为什么当我的训练集中没有负 y 值时,梯度提升回归会预测负值?

数据挖掘 机器学习 Python 算法 scikit-学习 卡格尔
2021-10-10 08:03:03

随着我在scikit learn中增加树的数量GradientBoostingRegressor我得到更多的负面预测,即使我的训练或测试集中没有负值。我有大约 10 个功能,其中大部分是二进制的。

我正在调整的一些参数是:

  • 树/迭代的数量;
  • 学习深度;
  • 和学习率。

负值的百分比似乎最大约为 2%。1(树桩)的学习深度似乎具有最大百分比的负值。这个百分比似乎也随着更多的树和更小的学习率而增加。该数据集来自 kaggle 游乐场比赛之一。

我的代码是这样的:

from sklearn.ensemble import GradientBoostingRegressor

X_train, X_test, y_train, y_test = train_test_split(X, y)

reg = GradientBoostingRegressor(n_estimators=8000, max_depth=1, loss = 'ls', learning_rate = .01)

reg.fit(X_train, y_train)

ypred = reg.predict(X_test)
3个回答

请记住,GradientBoostingRegressor(假设一个平方误差损失函数)连续地将回归树拟合到前一阶段的残差。现在,如果阶段 i 的树预测的值大于特定训练示例的目标变量,则该示例的阶段 i 的残差将为负,因此阶段 i+1 的回归树将面临负目标值(这是阶段 i 的残差)。由于 boosting 算法将所有这些树加起来以做出最终预测,我相信这可以解释为什么您最终可能会得到负面预测,即使训练集中的所有目标值都是正面的,尤其是当您提到这种情况发生得更多通常当你增加树的数量时。

一般来说,回归模型(任何)可以在训练样本跨越的域之外以任意方式表现。特别是,他们可以自由地假设建模函数的线性,所以如果你训练一个带有点的回归模型:

X     Y
10    0
20    1
30    2

建立一个返回负值的模型f(x) = x/10-1是合理的。x<10

这同样适用于“在”您的数据点之间,由于假定的函数家族(可以通过特定方法建模),您总是有可能“从您的训练样本中”获得值。

你可以用另一种方式来思考这个问题——“负值有什么特别之处?”,为什么你会发现负值的存在很奇怪(如果训练集中没有提供),而你却不会因为让我们说的存在而感到震惊。 .. 价值 2131.23?除非以这种方式开发,否则任何模型都不会将负值“不同于”正值。这只是真实价值的一个自然要素,可以像任何其他价值一样获得。

估计器的默认数量是 100。减少估计器的数量可能会起作用。