过拟合与欠拟合的讨论

admin / 博文 / ... / Reads: 2049

机器学习领域的大牛吴恩达曾经说过一句话:“理解了欠拟合和过拟合,就超过了一半硅谷的工程师”。虽然说法有点夸张,但足以显示出欠拟合和过拟合问题的重要性!

我们采用R软件来对过拟合问题和欠拟合问题进行演示!

假设总体为y,图形为:

17

从总体y中选取2到7个数据做为样本,根据样本来建立预测模型!

18

分别构建线性模型、对数模型和5次多项式模型

3个模型中,线性模型最简单,5次多项式模型最复杂!通过3个模型与总体y的拟合图可以看出:
虽然5次多项式模型能够完全穿过样本(对样本的预测精度为100%),但是在于样本外,5次多项式模型的预测精度急剧恶化。因而存在过拟合!

直线模型无论在样本内还是样本外,预测的精度都有限,不能很好的识别出总体的趋势。因而存在欠拟合!
对数模型虽然样本内预测不如5次多项式模型,但是样本外预测精度没有下降太多,整体上识别出了总体的趋势!

因而,一方面,建模时不应过分追求形式复杂的模型!另一方面,可以尽可能增加样本的数量和代表性!

19

示例的R代码

y<-c(0.7,2.6,5.5,7.6,8.1,9,8.4,10.3,10.2,11.1) #设y为已知的总体
plot(y)
sample<-y[2:7] #从y中选取2到7个数据做为样本,根据样本来建立模型!
plot(sample)
x<-seq(1:6) 
fn_line<-lm(sample~x) #建立直线回归模型
fn_log<-lm(sample~log(x)) #建立对数模型
fn_poly<-lm(sample~poly(x,5)) #建立5次多项式模型

axis <- data.frame(x=seq(-1,12,0.05)) #设置绘图的横坐标
y_poly <- predict(fn_poly,axis) #计算5次多项式模型的曲线数据
y_line <- predict(fn_line,axis) #计算线性模型的数据
y_log <- predict(fn_log,axis) #计算对数模型的曲线数据

plot(y,xlim=c(0,12),ylim=c(0,12),col="purple",pch=19)
lines(axis$x+1,y_poly,col="red",lwd=2,lty=1)
lines(axis$x+1,y_line,col="blue",lwd=2,lty=2)
lines(axis$x+1,y_log,col="#009900",lwd=3,lty=3)

points(c(2,3,4,5,6,7),sample,pch=19) #将样本散点图改为黑色!

Comments

Make a comment

Author: admin

Publish at: ...

关注公众号: