{r setup, include=FALSE} knitr::opts_chunk$set(eval = FALSE)
xgboost包中没有评价指标$R^2$和KS值。 因此需要自定义。
R^2来来源于对$y$的波动解释。
假设方程
$$y = f(x) + \mu$$
其中$y$是随机变量,即满足正态分布。 $y$自身具备一定的波动,可以用$\sum(y-\bar y)^2$来描述。 其中,$\bar y$是$y$的均值。 假设经过回归或者决策树等,我们得到
$$y = \hat y + \hat \mu$$
其中,$\hat y = \hat f(x)$,$\hat y$使我们估计出来。
如果$\hat u$均值为0,那么$\bar y = \bar{\hat y } + \bar{\hat u} \to \bar y = \bar{\hat y}$。 所以可以用$\sum(\hat y-\bar y)^2$对$y$波动的解释量。 其中,
$$R^2 = \frac{\sum(\hat y-\bar y)^2}{\sum(y-\bar y)^2}$$
为什么呢?
因为,
$$\begin{alignat}{2} \sum(y-\bar y)^2 & = \sum(y- \hat y + \hat y - \bar y)^2 \ & = \sum(y - \hat y )^2 + \sum(\hat y - \bar y)^2 + 2\sum(y- \hat y)(\hat y - \bar y)\ & = \sum(\hat \mu)^2 + \sum(\hat y - \bar y)^2 + 2\sum \mu(\hat y - \bar y) \end{alignat}$$
因为我们假设,$\sum \hat \mu = 0$和$\sum \mu \cdot \hat y = 0$, 所以,
$$\begin{alignat}{2} \sum(y-\bar y)^2 & = \sum(\hat \mu)^2 + \sum(\hat y - \bar y)^2 + 2\sum \mu(\hat y - \bar y) \ SST = SSR + SSE \end{alignat}$$
书上定义,
$$R^2 = 1 - \frac{SSR}{SST} = \frac{SSE}{SST}$$
和我们的定义一致。
下面开始对这个指标进行自定义函数。
{r} r2 <- function(preds, dtest) { library(ROCR) labels <- getinfo(dtest, "label") y_avg = mean(labels) SSE = sum( (preds - y_avg)^2 ) SST = sum( (labels - y_avg)^2 ) R2 = SSE/SST return(list(metric = "r2", value = R2)) }
测试以后这个公式算的有问题。