我正在使用带有样本权重的 Scikit-Learn XGBClassifier API。如果我将样本权重乘以 2,我会得到完全相同的参数和 random_state 的完全不同的结果,我期望如果我们将样本权重乘以/除以一个常数,结果不应该改变。你有什么建议吗?
XGBClassifier 中的样本权重
机器算法验证
机器学习
分类
scikit-学习
助推
2022-04-15 13:46:16
1个回答
你所描述的虽然有些不寻常,但如果我们没有充分优化我们的 XGBoost 例程,这并不意外。你的直觉是正确的:“结果不应该改变”。
当我们改变样本权重的尺度时,样本权重会改变与每个数据点相关的偏差残差;即使用不同的样本权重规模,导致我们的 GBM 在不同的样本上进行训练。在执行梯度提升迭代时,用作叶权重的残差乘以该样本权重。因此,拟合本身是不同的,尤其是在 XGBoost 的前几次迭代中。通常,由于不同样本权重的比例而导致的拟合差异并不大,最终会变得平滑,但它可能会很明显(尤其是在第一次迭代期间)。
# Using Python 3.6.9 // xgboost 0.90
import pandas as pd
import numpy as np
from xgboost import XGBRegressor
import xgboost as xgb
w=np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
w_2=w*2
X=pd.DataFrame([13.36, 5.35, 0.26, 84.16, 24.67, 22.26, 18.02, 14.20, 61.66, 57.26])
y=pd.DataFrame([37.54, 14.54, -0.72, 261.19, 76.90, 67.15, 53.89, 43.48, 182.60, 179.44])
X_test=pd.DataFrame([0.5])
xgb_model=XGBRegressor(n_estimators=100, learning_rate=1,
objective='reg:squarederror', subsample=1, reg_lambda=0.1)
xgb_model.fit(X, y, sample_weight=w)
print(xgb_model.predict(X_test, ntree_limit=5))
# [-0.65936375]
print(xgb_model.predict(X_test))
# [-0.71998453]
xgb_model.fit(X, y, sample_weight=w_2)
print(xgb_model.predict(X_test, ntree_limit=5))
#[-0.76515234]
print(xgb_model.predict(X_test))
# [-0.7199712]
正如我们所看到的,当我们优化“足够”(例如,在进行 100 次迭代之后)时,使用初始“单位权重”w
或其缩放版本w_2
有效地返回相同的估计值(~0.7199...)。然而,当我们开始第一次估计时,可能会有很大的不同(-0.6593...对-0.7651...)。(请注意,观察到的行为有点依赖于版本。我使用 XGBoost 版本进行游戏,1.0.1
并且差异在大约 . 处迅速减小ntree_limit=4
。)
如果我们观察到两个助推器的估计值之间存在显着差异,其中唯一的区别是样本权重的规模,这主要表明了两件事:
- 我们没有充分优化助推器,因此它们还没有达到稳定状态。我们需要进一步优化(例如有更多的迭代)。
- 我们已经过度拟合了我们的样本,因此助推器将样本权重缩放的差异解释为实质性差异。我们需要更强烈地进行正则化(例如,具有更高的正则化参数
reg_alpha
和reg_lambda
)。