XGBoost中的base_score
本文主要源自与@broccoli beef的讨论和kaggle的TPS竞赛经历。笔者率先指出了base_score
的差异,但@broccoli beef给出了更多有价值的意见和内容。
与LGBM和Catboost不同,XGBoost有一个令人忽视的参数base_score
。
在多场的kaggle中,这个参数都起着不可忽视的作用,且让笔者在kaggle TPS05E3保持优势。
base_score
可以看作是第0轮的预测 $F_0(x_i)=C$。我们希望找到一个最优的常数初始预测,所以也有说法说,只要迭代次数够大,base_score基本无影响。
kaggle的XGBoost默认版本为2.0.3,但最新的稳定版本是3.0.0。不同版本之间处理base_score
出现了不同。
此PR将简单目标(逻辑回归、泊松、伽马、泰迪)的截距初始化修改为使用它们的闭式最优解(即:使目标函数最小化的那个数字)而不是非最优的一步牛顿法。
比如说在二分类/logloss中:
3.0.0版本前:
最优的一步牛顿法,我们在z=0处泰勒展开:
$$
L(y,z)\approx L(y,0)+\sum_i g_i(0)z_i+\frac{1}{2}\sum_i h_i(0)z_i^2
$$
根据牛顿法:
$$
F_{k+1}=F(k)-\frac{\sum grad(F_k)}{\sum hess(F_k)}
$$
base_score
$b=l^{-1}(-\frac{\sum_i g_i(0)}{\sum_i h_i(0)})$,其中$l$是GLM中的连接函数,$l=\sigma^{-1}$.
$$
g=\sigma(z)-y,h=\sigma(z)(1-\sigma(z))
$$
故
$$
b=\sigma\left(-\frac{\sum_i (0.5-y_i)}{\sum_i (0.5*0.5)}\right)=\sigma\left(\frac{\sum_i y_i-0.5N)}{0.25N}\right)=\sigma(4\bar{y}-2)
$$
3.0.0版本:
最优闭式解也就是导数为0的点。
$$
\begin{align}
\frac{\partial}{\partial_{p}}\sum_i -(y_ilog(p)+(1-y)log(1-p))
&=\sum_i-\left(\frac{y_i}{p}-\frac{1-y_i}{1-p}\right)
\\&=\sum_i-\frac{y_i-p}{p(1-p)}
\\&=0
\end{align}
$$
故
$$
p=\frac{\sum y }{N}=\bar{y}
$$
注意,二分类情况下是在logit空间操作的。所以如果自定义损失函数,比如$\bar{y}$需要写成$log(\frac{\bar{y}}{1-\bar{y}})$