我最近在阅读机器学习导论(an introduction to statistical learning with application in R)中的内容,觉得国外的书和国内的书习题也不是一个风格,当然也有可能是这本书的独特性。比如说第二章习题的第三题,偏差方差分解相关概念的理解,因为这本书淡化了数学理论,所以也就没有对公式的推导有太多的要求,但是它并没有放过这个知识点,而是要你自己去生成数据去拟合,然后画图。说句实话,以前我在学习理论的时候,对某些概念总是有点一知半解,说不明白吧,感觉知识点大概在脑海中有一个模糊的印象,说懂吧,但是并不能清楚地叙述原理。所以上完课以后总感觉知识在大脑中浮光掠影。究其原因,自己虽然也会下力气推倒一些公式,但从来不会验证它们,实验科学的验证有实验,理学的验证有计算机程序。这一点也是国内的书籍不太关注的一点,理论的书籍都是让你在证明,应用的东西直接让你用现成的理论和方法去套用,二者的紧密联系并没有显现出来,我觉得,这是国内的书籍欠缺的一点,也是我们学习中忽视的一点。我在这里要里一个flag,有机会就把书中的代码示例,方法全部实现一遍,虽然我知道这很苦难,但是不要轻易放弃。
下面是我对2.4的第三题给出的一个实例,
x1<-seq(1,50,1)
y1<-x1^2+rnorm(50)
fit1<-lm(y1~I(x12)+I(x13)+I(x14)+I(x15))#这里是分别用不同flexible的模型来拟合数据
mean((residuals(fit1))^2)#这是来计算训练的均方误差
xtest<-51:80
testdata<-data.frame(x1<-xtest)
ypredict<-predict(fit1,testdata)
ytest<-xtest^2
mean((ytest-ypredict)^2)#这是预测的均方误差
经过几次试验,我们的得到如下的结果
train_error<-c(0.6942268,0.6859945,0.6859357,0.67899)
testerror<-c(0.02716,2.376022,4.363537,503.5562)
flexible<-c(2:5)
plot(flexible,train_error,type=‘b’,pch=15,col=2,ylab = “error”)
par(new=T)
plot(flexible,testerror,type=“b”,col=3,ylab = “error”,pch=17)
legend(“top”,legend=c(“train_error”,“testerror”),pch = c(15,17),col=c(2,3))
我们生成的模拟数据中y是x的2次方,模型一开始也是从2次开始拟合的,随着次数的不断升高,可以看出训练误差在不断的减小,但是测试误差从第二项过后就开始升高。
根据书中的理论,测试误差应该是呈U型分布的,由于我在这里没有拟合一次的图形,所以U型的左半部分没有展示出来,而且由于时间关系和代码能力较弱,这个数据集生成的也比较粗糙,争取下次生成更加高质量的数据。