为什么梯度树增强的回归有时会受到归一化(或缩放)的影响?

机器算法验证 回归 机器学习 Python 伽马分布 助推
2022-03-17 10:22:44

我读到使用梯度树提升时不需要标准化(参见例如https://stackoverflow.com/q/43359169/1551810https://github.com/dmlc/xgboost/issues/357)。

而且我认为我理解原则上在提升回归树时不需要规范化。

尽管如此,将 xgboost 用于回归树,我发现缩放目标会对预测结果的(样本内)误差产生重大影响。这是什么原因?

波士顿住房数据集的示例:

import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston

boston = load_boston()
y = boston['target']
X = boston['data']

scales = pd.Index(np.logspace(-6, 6), name='scale')
data = {'reg:linear': [], 'reg:gamma': []}
for objective in ['reg:linear', 'reg:gamma']:
    for scale in scales:
        xgb_model = xgb.XGBRegressor(objective=objective).fit(X, y / scale)
        y_predicted = xgb_model.predict(X) * scale
        data[objective].append(mean_squared_error(y, y_predicted))

pd.DataFrame(data, index=scales).plot(loglog=True, grid=True).set(ylabel='MSE')

MSE对规模的依赖性

2个回答

答案的很大一部分似乎可以在https://github.com/dmlc/xgboost/issues/799#issuecomment-181768076中找到。

默认情况下,base_score设置为 0.5,这对于回归问题来说似乎是一个糟糕的选择。当目标的平均值远高于或低于base_score时,前 x 棵树只是试图捕捉平均值,剩下的树更少来解决真正的任务。

因此,解决方案似乎很简单:调整base_score目标的平均值以避免其规模对回归结果的影响。

特别是对于客观'reg:gamma'来说,这确实似乎是线索,而对于'reg:linear'它只提供了部分改进:

data = {'reg:linear': [], 'reg:gamma': [], 'reg:linear - base_score': [], 'reg:gamma - base_score': []}
for objective in ['reg:linear', 'reg:gamma']:
    for scale in scales:
        xgb_model = xgb.XGBRegressor(objective=objective).fit(X, y / scale)
        y_predicted = xgb_model.predict(X) * scale
        data[objective].append(mean_squared_error(y, y_predicted))

for objective in ['reg:linear', 'reg:gamma']:
    for scale in scales:
        base_score = (y / scale).mean()
        xgb_model = xgb.XGBRegressor(objective=objective, base_score=base_score).fit(X, y / scale)
        y_predicted = xgb_model.predict(X) * scale
        data[objective + ' - base_score'].append(mean_squared_error(y, y_predicted))

styles = ['g-', 'r-', 'g--', 'r--']
pd.DataFrame(data, index=scales).plot(loglog=True, grid=True, style=styles).set(ylabel='MSE')

均方误差作为比例因子的函数

所以剩下的问题归结为:为什么有时使用目标“reg:linear”缩放目标仍然会产生影响,即使在将 base_score 调整为(缩放)目标的平均值之后?

树真的不依赖于缩放,线性提升算法也不应该。

但是,我们必须记住,XGBoost 是一种梯度提升算法,它试图通过梯度下降来优化基于模型添加的损失函数。

为什么这很重要?梯度下降更新规则基于对最佳更新方向的估计加上该方向上的步长的步长进行操作。这一步的长度并不明显,在 XGBoost 中它是基于目标函数梯度的二阶展开来估计的

我必须进一步调查它,但我想原因可能在于这种优化。