天天看點

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

=====================================================================

《機器學習實戰》系列部落格是部落客閱讀《機器學習實戰》這本書的筆記也包含一些其他python實作的機器學習算法

                                          算法實作均采用python

    回歸的目的是預測數值型的目标值。最直接的辦法是依據輸人寫出一個目标值的計算公式。假如你想要預測姐姐男友汽車的功率大小,可能會這麼計算:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

這就是所謂的回歸方程,其中的0.0015和-0.99稱作為回歸系數,求這些回歸系數的過程就是回歸

(1)收集資料:采用任意方法收集資料

(2)準備資料:回歸需要數值型資料,标稱型資料将被轉化成二值型資料

(3)分析資料:繪出資料的可視化二維圖将有助于對資料做出了解和分析,在采用縮減法求得新回歸系數之後,可以将新拟合線在圖上作為對比

(4)訓練算法:求得回歸系數

(5)測試算法:使用R2或者預測值和資料的拟合度,來分析模型的效果

(6)使用算法:使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測連續性資料而不僅僅是離散的類别标簽

假定輸入資料存放在矩陣X中,而回歸系數存放在向量w中,那麼對于給定的資料X預測結果将會通過 

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

給出,加入在給定資料X和Y的情況下怎麼求得W?

同過找到最小誤差求W(誤差是真實Y和預測Y之間的內插補點,使用該誤差的簡單累加将使得正誤差和負誤差互相抵消,所有我們采用平方誤差)

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料
《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

我們可以通過調用Numpy庫的矩陣方法求得w,即所謂最小二乘法(OLS)

效果展示:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料
《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

(相關性中對角線1,1表示yHat與自己的比對是完全的,與yMat的比對是0.98)

       權重的目的:降低預測的均方誤差,減小欠拟合現象

       權重方法:局部權重線性回歸(Locally Weighted Liner Regression,LWLR)在該算法中,我們給待預測點附近的每個點賦予一定的權重,然後利用上一節的方法計算最小均方差來進行普通的回歸

       此時回歸系數:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

其中W是一個矩陣,用來給每個資料點賦予權重

LWLR使用核來對附近的點賦予更高的權重,最常用的核方法是高斯核,其對應的權重如下:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

這樣就建構了一個隻含對角線元素的權重矩陣w,并且點x與x(i)越近,w(i,i)将會越大,上述公式包含一個需要使用者指定的參數k,他決定了對附近的點賦予多大的權重,這也是使用LWLR時唯一需要考慮的參數,下圖展示了參數k與權重的關系

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

在regression.py檔案中加入以下代碼

運作結果和不同k值得圖像比較

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

k=0.003時的輸出圖為:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

k=0.01時對應的輸出圖:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

k=1.0時的輸出圖:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

從上圖可以看出k=0.01時可以得到很好的效果

如果系數的特征比樣本點還多,在計算(X^t X)^-1 的時候會出錯,為了解決這個問題,統計學家引入了嶺回歸的概念,還有lasso法,該方法效果很好,但是計算複雜,還有另外一種縮減方法稱為嶺向前逐漸回歸,可以得到與lasso差不多的效果,且更容易實作。

嶺回歸就是在矩陣X^t X 上加一個

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

 進而使得矩陣非奇異,進而能對 

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

求逆,其中矩陣I是一個m*m的機關矩陣,對角線上元素全為1,其他元素全為0,而 是使用者定義的數值,後面會做介紹,此時回歸系數的計算公式将變為:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料
《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料
《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

縮減方法可以去掉不重要的參數,是以能更好的了解資料,此外,與簡單的線性回歸相比,縮減法能取得更好的預測效果,在這裡依舊采用預測誤差最小化得到:資料擷取之後先抽取一部分用于測試,剩餘的作為訓練集用于訓練資料W。

在regression.py中加入以下代碼:

運作結果:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

說明:lambda非常小時,系數與普通回歸一樣,而lambda非常大時,所有回歸系數縮減為0,可以在中間某處找到使得預測結果最好的值

不難證明,在增加如下限制時,普通的最小二乘法回歸會得到與嶺回歸的一樣的公式:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

上式限定了所有的回歸系數的平方和不能大于lambda,使用普通的最小二乘法回歸在當兩個或更多的特征相關時,可能會得到一個很大的正系數和一個很大的負系數。正是因為上述限制條件的存在,使用嶺回歸可以避免這個問題

與嶺回歸類似,另外一個縮減方法lasso也對回歸系數做了限定,對應的限制條件是如下:

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

唯一一點不同的是這個限制條件使用絕對值取代了平方和,雖然限制條件隻是稍作變化,結果卻大相徑庭,在lambda足夠小的時候,一些系數會是以被迫縮減到0,而這個特性可以幫助我們更好的了解資料,這兩個限制條件雖然相差無幾,,但細微的變化卻極大的增加了計算的複雜度,下面介紹一種更為簡單的方法來得到計算結果,該方法叫做向前逐漸回歸

向前逐漸回歸算法可以得到和lasso差不多的效果,但是更加簡單,它屬于一種貪心算法,即每一步都盡可能的減小誤差,一開始,所有的權重都設為1,然後每一步所做的決策是對某個權重增加或者減小一個很小的值

該算法的僞代碼如下:

資料标準化,使其分布滿足0均值和機關方差

在每輪疊代過程中:

        設定目前最小誤差lowestError為正無窮

        對每個特征:

                增大或減小:

                        改變一個系數得到一個新的W

                        計算新W下的誤差

                        如果誤差Error小于目前最小誤差lowerError:設定Wbest等于目前的W

                将W設定為新的Wbest

代碼實作如下

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

上述結果中值得注意的是wl和w6都是0 ,這表明它們不對目标值造成任何影響,也就是說這些特征很可能是不需要的。另外,在參數eps設定為0.01的情況下,一段時間後系數就已經飽和并在特定值之間來回震蕩,這是因為步長太大的緣故。這裡會看到,第一個權重在0.04和0.05之間來回震蕩。

設定更小的步長:

print stageWise(xArr, yArr, 0.001, 200)

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

接下來把這些結果與最小二乘法進行比較,後者的結果可以通過如下代碼獲得

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

可以看出在疊代5000次以後,逐漸線性回歸算法與正常的最小二乘法類似,使用0.005的epsilon值并經過1000次疊代後的結果參見

《機器學習實戰》預測數值型資料-回歸(Regression)1:用線性回歸找到最佳拟合曲線2:局部權重線性回歸3:縮減系數來“了解”資料

逐漸線性回歸算法的實際好處并不在于能繪出圖8-7這樣漂亮的圖’ 主要的優點在于它可以幫助人們了解現有的模型并做出改進。當建構了一個模型後,可以運作該算法找出重要的特征,這樣就有可能及時停止對那些不重要特征的收集。最後,如果用于測試,該算法每100次疊代後就可以建構出一個 模型,可以使用類似于10折交叉驗證的方法比較這些模型,最終選擇使誤差最小的模型。當應用縮減方法(如逐漸線性回歸或嶺回歸)時,模型也就增加了偏差(礎8),與此同時卻減小了模型的方差。