首页 » 机器学习实战 » 机器学习实战全文在线阅读

《机器学习实战》8.3 示例:预测鲍鱼的年龄

关灯直达底部

接下来,我们将回归用于真实数据。在data目录下有一份来自UCI数据集合的数据,记录了鲍鱼(一种介壳类水生动物)的年龄。鲍鱼年龄可以从鲍鱼壳的层数推算得到。

在regression.py中加入下列代码:

def rssError(yArr,yHatArr):    return ((yArr-yHatArr)**2).sum>>> abX,abY=regression.loadDataSet('abalone.txt')>>> yHat01=regression.lwlrTest(abX[0:99],abX[0:99],abY[0:99],0.1)>>> yHat1=regression.lwlrTest(abX[0:99],abX[0:99],abY[0:99],1)>>> yHat10=regression.lwlrTest(abX[0:99],abX[0:99],abY[0:99],10)    

为了分析预测误差的大小,可以用函数rssError计算出这一指标:

>>> regression.rssError(abY[0:99],yHat01.T)56.842594430533545>>> regression.rssError(abY[0:99],yHat1.T)429.89056187006685>>> regression.rssError(abY[0:99],yHat10.T)549.11817088257692   

可以看到,使用较小的核将得到较低的误差。那么,为什么不在所有数据集上都使用最小的核呢?这是因为使用最小的核将造成过拟合,对新数据不一定能达到最好的预测效果。下面就来看看它们在新数据上的表现:

>>> yHat01=regression.lwlrTest(abX[100:199],abX[0:99],abY[0:99],0.1)>>> regression.rssError(abY[100:199],yHat01.T)25619.926899338669>>> yHat1=regression.lwlrTest(abX[100:199],abX[0:99],abY[0:99],1)>>> regression.rssError(abY[100:199],yHat1.T)573.5261441895808>>> yHat10=regression.lwlrTest(abX[100:199],abX[0:99],abY[0:99],10)>>> regression.rssError(abY[100:199],yHat10.T)517.57119053830979  

从上述结果可以看到,在上面的三个参数中,核大小等于10时的测试误差最小,但它在训练集上的误差却是最大的。接下来再来和简单的线性回归做个比较:

>>> ws = regression.standRegres(abX[0:99],abY[0:99])>>> yHat=mat(abX[100:199])*ws>>> regression.rssError(abY[100:199],yHat.T.A)518.63631532450131    

简单线性回归达到了与局部加权线性回归类似的效果。这也表明一点,必须在未知数据上比较效果才能选取到最佳模型。那么最佳的核大小是10吗?或许是,但如果想得到更好的效果,应该用10个不同的样本集做10次测试来比较结果。

本例展示了如何使用局部加权线性回归来构建模型,可以得到比普通线性回归更好的效果。局部加权线性回归的问题在于,每次必须在整个数据集上运行。也就是说为了做出预测,必须保存所有的训练数据。下面将介绍另一种提高预测精度的方法,并分析它的优势所在。