Trade off between Bias and Variance

模型的预测误差主要来源于BiasVariance,因此如何选择最优的Trade Off则决定着模型性能的高低.这在基于大数据建模的时候尤为重要.

Bias和Variance的来源

对于观测数据 X 以及对应的待预测因变量 Y ,我们不妨假设真实的模型为

Y=f(X)+ε

其中ε为不可观测到的噪声,其服从正态分布 N(0,σ2).
为了预测 Y 值,我们基于数据集 X 通过算法训练出一个模型 f̂ (X),给定观测值 x ,可以得到模型在点 x 的整体预测误差为真实值和预测值之间的误差,即:
Err(x)=E[(yf̂ (x))2]

经过整理可以发现其等价于:
Err(x)=[Ef̂ (x)f(x)]2+E[f̂ (x)Ef̂ (x)]2+σ2

即:
Error=Bias2+Variance+Noise

Bias和Variance的权衡

Bias和Variance之间的关系可以通过下图看出:

可以看出,Bias和Variance其中任何一方降低则会导致另一方的升高,从而增大总体的误差.因此需要找到一个较为合适的模型从而达到一个最优的Trade off.

变量个数、噪声方差与模型自由度的选择(With R)

自由度是用来描述模型复杂程度的度量.简单来说,对于回归模型,自由度的大小对应着模型中有多少可以自由变动的变量.而往往自由度则代表了模型的复杂程度.对于自变量X和因变量Y,我们可以构建:

Y=β0+β1XY=β0+β1X+β2X2Y=β0+β1X+β2X2+β3X3...

可以看出随着变量数量的增加,模型的自由度也在增加.不难理解复杂模型的预测精度会有提高但模型的简洁和稳定性也会下降,简单地模型虽然稳定但预测精度不佳.本文通过R语言来初步探究不同的变量个数以及噪声方差下,如何选择模型的自由度从而达到Bias和Variance的Trade off.

N <- 2000 #
k <- 2000 #
n <- 500 #
Testx <- runif(N,-1,1) #X
Testy <- 2 * exp(Testx) + rnorm(N,0,sigma) #XY
Testz <- matrix(Testx,N,p)
for(i in 2:p)
Testz[,i] <- 10*Testz[,i]*Testz[,i-1] #X^p
dataTE <- data.frame(y=Testy,z=Testz) #TEST
Trainx <- runif(n * k,-1,1)
Trainy <- 2 * exp(Trainx) + rnorm(n*k,0,sigma)
Trainz <- matrix(Trainx,n*k,p)
for(i in 2:p)
Trainz[,i] <- 10*Trainz[,i]*Trainz[,i-1]
dataTR <- data.frame(y=Trainy,z=Trainz) #TRAIN

注意到我们在生成TRAIN数据框的时候是生成了n×k行数据,从而避免做回归学习的时候频繁使用for循环降低模型速度.

library(plyr) #"plyr""daply"
index <- rep(1:k,rep(n,k)) #indexn*k
PRE <- daply(dataTR, .(index),
mlm, TE = dataTE) #

利用生成的index带入daply将训练数据分成k个n×p的矩阵块,并将其依次带入自定义函数进行批量回归和预测,而使用daply的数据分块能够避免多重for循环从而提高运算速度.

yn <- names(dataTR)[1]
xn <- names(dataTR)[-1] #
mp <- length(xn) #
ypr <- NULL
tm <- paste(yn,xn[1],sep="~")
fam <- formula(tm) #
cp <- 1
repeat{
lm1 <- lm(fam,TR)
ypr <- c(ypr,predict(lm1,TE)) #
if(cp >= mp) break
cp <- cp+1
tm <- paste(tm,xn[cp],sep="+") #
fam <- formula(tm)
}

通过对预测值的处理,我们可以计算出在不同变量个数和噪声方差下不同自由度的回归模型的Bias和Variance.

*原代码在本respository下.