1. 程式人生 > 其它 >利用迴歸模型預測數值型資料(程式碼)

利用迴歸模型預測數值型資料(程式碼)

機器學習演算法按照目標變數的型別,分為標稱型資料和連續型資料。標稱型資料類似於標籤型的資料,而對於它的預測方法稱為分類,連續型資料類似於預測的結果為一定範圍內的連續值,對於它的預測方法稱為迴歸。

“迴歸”一詞比較晦澀,下面說一下這個詞的來源:

“迴歸”一詞是由達爾文的表兄弟Francis Galton發明的。Galton於1877年完成了第一次迴歸預測,目的是根據上一代豌豆種子(雙親)的尺寸來預測下一代豌豆種子(孩子)的尺寸。 Galton在大量物件上應用了迴歸分析,甚至包括人的身高預測。他注意到,如果雙親的高高度比平均高度高,他們的子女也傾向於比平均高度高,但尚不及雙親(筆者感覺未必,Galton並未考慮物質條件的發展會帶來整體身高的增加,至少筆者感覺80,90的人普遍比父母高)。孩子的高度向著平均高度“迴歸”。

型別

迴歸按照方法可分為線性迴歸和非線性迴歸。線性迴歸適用線性方程來擬合曲線進行預測。在非線性迴歸中,特徵之間出現非線性操作的可能性(比如相乘或者相除)。非線性迴歸中有種特殊的型別--邏輯迴歸,和線性迴歸不同的是,它屬於“分類”的問題,這是由於它適用曲線擬合的方式來解決分類問題,所以也被稱為迴歸。

線性迴歸

原理簡介

線性迴歸衡量的是兩個變數之間的關係,最直接的辦法就是求得一個迴歸方程(regression equation),將已知條件x代入方程得到預測結果y。

假設我們獲取到一個地區過去一段時間內的房價走勢情況,我們根據下面的公式進行評估:

上面的式子可以看到房價和房屋面積、房子朝向呈線性的關係。而求該方程的過程稱為迴歸方程,其中0.7和0.19稱為迴歸係數,面積和房子的朝向稱為特徵。

可以看到“迴歸”問題最重要的是如何獲得迴歸方程,如果得到該方程後,所有的一切問題將迎刃而解。

假如我們用X(m×n)來表示特徵的矩陣,迴歸係數用 θ(n×1)來表示,預測結果由Y=Xθ獲得。在實際應用中,我們通常認為能帶來最小平方誤差的θ就是我們所要尋找的迴歸係數向量。平方誤差指的是預測值與真實值的差的平方,這種方法就稱為“最小二乘法”。所以迴歸問題轉化為如何求最小平方誤差,即目標函式為:

求該函式的方法很多,在此介紹一種方法:

  • 對θ求導: 該矩陣還可以寫成

,如果對θ求導,就會得到

  • 倒數為0,求出θ

注意,上述公式中包含

,也就是需要對矩陣求逆。因此這個方程只在逆矩陣存在的情況下適用。

應用

上面講解了線性迴歸的原理,那如何將上面的演算法應用到現實的場景中呢?我們使用python語言將上述的演算法實現了一遍:

def standRegres(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat    # #判斷是否存在逆矩陣
    if linalg.det(xTx) == 0.0:        
print "This matrix is singular, cannot do inverse"
    return
                ws = xTx.I * (xMat.T*yMat)    
    return ws

得到迴歸係數後,還需要乘以特徵值後得到預測值。

大家會說python不是以演算法包的種類多而出名嗎?有現成的演算法庫,我幹嘛還要自己去實現演算法呢。當然,python裡面有sklearn包中有現成的linear_model的函式可以供大家使用,而且使用方法特別簡單:

  • 匯入演算法包
from sklearn import datasets, linear_model
  • 訓練模型
regr = linear_model.LinearRegression()regr.fit(x, mydata)
  • 預測
predict_outcome = regr.predict(x)

模型評估

基本上所有的資料集都可以使用上述的方法建立模型,那麼,如何來判斷模型的好壞呢?如果比較一下下面兩個圖,如果在這兩個資料集上做線性迴歸,那麼效果肯定不相同。

圖1 具有相同迴歸係數的兩組資料的對比

我們可以計算預測值和真實值之間的誤差,也就是計算這兩個序列的相關係數,來評價模型的好壞。

python中,Numpy庫提供了相關係數的計算方法corrcoef(yEstimate,yActual)來計算預測值和真實值之間的相關性。可以看出具有相同迴歸係數的兩組資料,上圖的相關係數是0.58,而下圖的相關係數是0.99,則可以說明該回歸係數對下圖使用的資料集效果要好。

區域性加權線性迴歸

前一節我們用普通的線性迴歸在遇到圖1的上圖時候就會出現嚴重的欠擬合現象,這種現象在圖1的下圖也會反映出來。解決這種欠擬合的問題最直接的方法是犧牲普通線性迴歸的無偏估計方法,轉為有偏估計,對預測點的周圍節點賦予不同的權值。離預測點近的點賦予較高的權值,反之則賦予低的權值。這種通過改變權值的方法就叫做區域性加權線性迴歸。

該演算法解出來迴歸係數的形式為:

可以看到,在普通的線性迴歸的基礎上,多了一個矩陣W,W是一個n×m的矩陣。那如何做到不同的點被賦予不同的權值呢?區域性加權線性迴歸適用“核函式”來賦予權值,最常用的高斯核,它的權重為:

可以看到高斯核中涉及到一個引數k,如何選擇合適的k成為了關鍵的問題。圖2可以看到引數k和權重的關係:

圖2 每個點的權重值(假設我們預測的點為x=0.5)

在圖2中,k越大,權重衰減的越慢,而k越小,權重衰減的越快,離預測點比較近的點才對預測值產生影響。

我們採用了三種k對圖1下圖中的樣本進行預測,結果如圖3、4和5所示。

圖3 k為1,和普通的線性迴歸一樣,用來做對比

圖4 k為0.01

圖5 k為0.003

可以看到k為1時,由於是用一條直線進行擬合,所以反映不出來樣本的規律,容易出現欠擬合的現象,而當k為0.003時,由於將個別樣本的特例反映到整體趨勢中,所以容易出現過擬合的現象。k為0.01時,效果最好。

除了容易出現過擬合的問題外,區域性加權線性迴歸的計算量也相當大,因為它對每個待遇測點做預測時都必須遍歷整個資料集才能得出迴歸係數向量,使用時要加以注意。

嶺迴歸

線性迴歸能夠求解迴歸係數的前提是

是滿秩矩陣,即矩陣有逆矩陣,而如果

矩陣中有某些矩陣共線,也就是

的行列式為0,則這種情況就不能求出迴歸係數。

嶺迴歸中通過引入λI來使迴歸矩陣可解,則迴歸係數的矩陣變為:

I為n*n的單位矩陣,該矩陣看起來就像一個“嶺”,所以叫做嶺迴歸,嶺迴歸歸根結底就是求λ。

嶺迴歸的目標函式變為:

可以看到嶺迴歸在原來普通的線性迴歸的基礎上加入了一個二範數懲罰項,其目的在於限制迴歸係數矩陣的取值,減少不必要的引數。

不同的λ將會得到不同的θ,反映不同的λ和θ的關係的圖叫做嶺跡圖:

在λ為很小的時候,θ基本上不怎麼變化,而當λ很大時,θ趨於0,在中間時可以找到一個最好的迴歸係數,圖中最好的效果是最上面的一條曲線。

總的來說,嶺迴歸用來處理變數之間相關度比較高的情況,它在最小二乘法的基礎上加入了一個係數後,能夠解決共線的問題,因而具有比較高的應用價值。