模型的预测误差主要来源于Bias和Variance,因此如何选择最优的Trade Off则决定着模型性能的高低.这在基于大数据建模的时候尤为重要.
对于观测数据
Bias和Variance之间的关系可以通过下图看出:
可以看出,Bias和Variance其中任何一方降低则会导致另一方的升高,从而增大总体的误差.因此需要找到一个较为合适的模型从而达到一个最优的Trade off.
自由度是用来描述模型复杂程度的度量.简单来说,对于回归模型,自由度的大小对应着模型中有多少可以自由变动的变量.而往往自由度则代表了模型的复杂程度.对于自变量
可以看出随着变量数量的增加,模型的自由度也在增加.不难理解复杂模型的预测精度会有提高但模型的简洁和稳定性也会下降,简单地模型虽然稳定但预测精度不佳.本文通过R语言来初步探究不同的变量个数以及噪声方差下,如何选择模型的自由度从而达到Bias和Variance的Trade off.
N <- 2000 #测试集数量k <- 2000 #循环次数n <- 500 #训练集数量
Testx <- runif(N,-1,1) #生成XTesty <- 2 * exp(Testx) + rnorm(N,0,sigma) #基于X构建真实值YTestz <- matrix(Testx,N,p)for(i in 2:p)Testz[,i] <- 10*Testz[,i]*Testz[,i-1] #逐列生成X^pdataTE <- 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数据框的时候是生成了
library(plyr) #引入"plyr"包来调用"daply"index <- rep(1:k,rep(n,k)) #创建index来对n*k行的数据进行分组PRE <- daply(dataTR, .(index),mlm, TE = dataTE) #将训练数据进行分组后依次带入自定义函数
利用生成的index带入daply
将训练数据分成k个daply
的数据分块能够避免多重for循环从而提高运算速度.
yn <- names(dataTR)[1]xn <- names(dataTR)[-1] #分别取得各个变量的变量名mp <- length(xn) #记录自变量个数ypr <- NULLtm <- paste(yn,xn[1],sep="~")fam <- formula(tm) #生成回归方程cp <- 1repeat{lm1 <- lm(fam,TR)ypr <- c(ypr,predict(lm1,TE)) #记录预测值if(cp >= mp) breakcp <- cp+1tm <- paste(tm,xn[cp],sep="+") #迭代生成回归方程并做训练预测fam <- formula(tm)}
通过对预测值的处理,我们可以计算出在不同变量个数和噪声方差下不同自由度的回归模型的Bias和Variance.
*原代码在本respository下.