1 min read

rsq在R中自定义函数

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}\]

和我们的定义一致。

下面开始对这个指标进行自定义函数。

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))
}

测试以后这个公式算的有问题。