将回归用于真实数据:有一份来自UCI数据集合的数据,记录了鲍鱼的年龄,鲍鱼年龄可以从鲍鱼壳的层数推算得到。
代码:
def rssError(yArr,yHatArr):
return ((yArr-yHatArr)**2).sum()
abX,abY=loadDataSet('abalone.txt')
yHat01=lwlrTest(abX[0:99],abX[0:99],abY[0:99],0.1)
yHat1=lwlrTest(abX[0:99],abX[0:99],abY[0:99],1)
yHat10=lwlrTest(abX[0:99],abX[0:99],abY[0:99],10)
print(rssError(abY[0:99],yHat01.T))
print(rssError(abY[0:99],yHat1.T))
print(rssError(abY[0:99],yHat10.T))
可以看到,使用较小的核可以得到较低的误差,但是最小的核将造成过拟合,对新数据不一定能达到最好的预测效果。
下面观察在新数据的表现:
yHat01=lwlrTest(abX[100:199],abX[0:99],abY[0:99],0.1)
yHat1=lwlrTest(abX[100:199],abX[0:99],abY[0:99],1)
yHat10=lwlrTest(abX[100:199],abX[0:99],abY[0:99],10)
print(rssError(abY[100:199],yHat01.T))
print(rssError(abY[100:199],yHat1.T))
print(rssError(abY[100:199],yHat10.T))
可以看到,新数据下,核大小为10时的测试误差最小,但在训练集上的误差确是最大的。
下面和简单的线性回归做比较:
ws=standRegres(abX[0:99],abY[0:99])
yHat=mat(abX[100:199])*ws
print(rssError(abY[100:199],yHat.T.A))
简单线性回归达到了与局部加权线性回归类似的效果。这也说明,必须在未知数据上比较效果才能取到最佳模型。