讀古今文學網 > 機器學習實戰 > 8.3 示例:預測鮑魚的年齡 >

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次測試來比較結果。

本例展示了如何使用局部加權線性回歸來構建模型,可以得到比普通線性回歸更好的效果。局部加權線性回歸的問題在於,每次必須在整個數據集上運行。也就是說為了做出預測,必須保存所有的訓練數據。下面將介紹另一種提高預測精度的方法,並分析它的優勢所在。