↑ 點擊上方藍字" 奶糖貓 ",加個關注如何

何爲迴歸

迴歸的目的是預測數值型的目標值,最直接的辦法是依據輸入寫出一個目標值的計算公式,比如要計算一個男生可以找到女朋友的概率:

這意味着要綜合財產、長相、身高三個因素來判斷概率,其中財產也是最重要的因素。

這個式子就可以被稱作 迴歸方程 ,其中0.4和0.3也被稱作 迴歸係數 ,一般來說迴歸係數都是未知的,我們通過輸入數據求得迴歸係數的過程就是迴歸,得到迴歸係數之後,就可以通過公式得到最後的預測值。

這裏給出的例子屬於 線性迴歸 ,而回歸還有另一種較爲複雜的形式——非線性迴歸,本文只介紹線性迴歸的相關知識。

線性迴歸

迴歸係數推導

線性迴歸(LR) 可分爲簡單一元線性迴歸和多元線性迴歸,也就是我們平時接觸的一次線性方程和多次線性方程,二者的主要區別也就是 未知項的個數 ,爲了便於理解,這裏主要利用一元線性迴歸爲例。

一元線性方程的公式應該是非常熟悉的:

如果將輸入數據都存放在矩陣X中 ,而回歸係數都存放在向量 中,這樣就可以得到矩陣形式的表達式:

現在的問題是如何找到,我們已經知道了如何度量一個分類器的性能,而回歸模型的性能通常使用度量方法是 “均方誤差” ,我們可以利用這個公式找到誤差最小時的,這裏的誤差是指 預測值與真實值之間的差值

均方誤差的表示形式如下:

可以將其轉化爲矩陣形式:

求導得出下面式子,並令其等於0:

最後解出如下:

可以看到這裏涉及到了 對矩陣求逆 ,所以這個公式只有在可逆矩陣中才適用,就是說只有爲 滿秩矩陣 時,上述等式才成立。矩陣中 非零行的個數 定義爲這個矩陣的秩, 記爲R(A),對於矩陣,若R(A)=n,則稱A爲滿秩矩陣。

線性擬合

現在有上圖這樣一個數據集,按照上文所提及的方法計算出最佳擬合直線的迴歸係數,就可以獲得這個數據集的迴歸曲線。 這部分代碼如下:

def standRegres (xMat,yMat) :

# 根據公式計算迴歸係數

xTx = xMat.T * xMat

if np.linalg.det(xTx) ==  0.0 :

print( "矩陣爲奇異矩陣,不能求逆" )

return

ws = xTx.I * (xMat.T*yMat)

return ws

def plotRegression () :

xMat, yMat = loadDataSet( 'regression_data.txt' )

ws = standRegres(xMat, yMat)  #計算迴歸係數

xCopy = xMat.copy()  #拷貝一個xMat矩陣

xCopy.sort( 0# 對xCopy排序,方便繪圖

yHat = xCopy * ws  # 計算對應的y值

fig = plt.figure()

ax = fig.add_subplot( 111 )

ax.plot(xCopy[:,  1 ], yHat, c =  'red'# 繪製迴歸曲線

plt.scatter(xMat.A[:, 1 ],yMat.A,c =  'b' ,s =  10# 繪製數據集的樣本

plt.show()

這裏省略了加載數據集函數,第一個函數 standRegres 用來計算迴歸係數,先將x和y以矩陣形式傳入,然後計算,接下來這個操作可能會比較陌生,因爲上文說過了只有可逆矩陣才能求逆,這裏 linalg.det() 方法可以計算矩陣的 行列式 ,在行列式非零情況下,計算迴歸係數ws並返回。

第二個函數是繪製函數,在第一個函數計算出的迴歸係數基礎上繪製迴歸曲線,最後繪製圖像如下:

幾乎任一數據集都可以用上述方法建立一個模型,那麼這些模型的好壞程度如何評斷呢?“ 相關係數 ”就可以計算預測值序列和真實值序列的匹配程度,Numpy中 corrcoef 方法就剛好可以計算出 兩個序列的相關性

上圖中主對角線上的1代表自己與自己完全匹配,而次對角線則代表預測值和真實值間的相關性, 相關性並不能完全決定模型的好壞 ,因爲相關性過高可能導致過擬合的現象。

局部加權線性迴歸

上面擬合的迴歸曲線難免有些粗糙,而且會有一些 欠擬合的現象 ,比如波浪處到直線的距離還是有點遠,這很難取得最好的預測效果,而 局部加權線性迴歸(LWLR) 通過在估計值中引入一些偏差,從而 降低預測的均方誤差

這種方法的基本思想就是給待預測點附近的每個點賦予一定的 權重 ,將這些權重用一個新的矩陣W存儲,表現形式如下:

加權模型也會認爲樣本點之間距離越近,越有可能符合同一個線性模型,所以對於當前預測樣本點來說, 離它越近的樣本點將會被賦予更大的權重 ,利用高斯核就可實現這種機制:

通過這種方式構建了一個只含 對角元素的權重矩陣W ,上述公式中只包含了一個需要調節的參數k,它決定了對附近的點賦予多大權重。

實際上當k值越大,參與訓練的樣本點也就越多;反之k值越小,只會有很少的局部點會參與訓練。相應的k值過大可能就會出現欠擬合現象,k值過小可能就會出現過擬合現象,所以, k值的選擇決定了模型的好壞

具體代碼如下:

def LWLR (testMat,xMat, yMat,k =  1.0 ) :

m = xMat.shape[ 0 ]

n = testMat.shape[ 0 ]

weights = np.mat(np.eye(m))  # 創建一個單位對角矩陣

yHat = np.zeros(n)  # 創建一個用來存預測值的矩陣

forin range(n):

forin range(m):  # 遍歷,根據公式求權重

diffMat = testMat[i] - xMat[j]

weights[j, j] = np.exp(diffMat * diffMat.T / ( -2.0 * k **  2 ))

xTx = xMat.T * (weights * xMat)

if np.linalg.det(xTx) ==  0.0 :

print( "矩陣爲奇異矩陣,不能求逆" )

return

ws = xTx.I * (xMat.T * (weights * yMat))

yHat[i]=testMat[i]*ws  # 求出預測值

return

yHat

這裏先初始化了一個權重矩陣weights,形式是主對角線上都爲1,其他位置都爲0。接着遍歷數據集,計算每個樣本點對應的權重值,當樣本點與待預測點距離越來越遠時, 權重將會衰減,而k控制衰減的速度

這裏需要注意的是testMat正是xMat本身,因爲實際上每個樣本的權重是數據集內的樣本點之間相互計算得出的,用testMat命名只是方便區分而已,最後可繪製出不同k值對應的迴歸曲線如下:    

可以看到當k=1.0時和普通的迴歸曲線沒有什麼差別;當k=0.01時迴歸直線擬合的就比較不錯了;當k=0.002時迴歸曲線開始出現棱角,證明曲線的部分受其附近樣本點影響很大,導致了 過擬合的現象

隨着擬合變準確的同時,該模型也付出了相應的代價,即 增加了計算量 ,因爲在對每個點預測的同時都要使用整個數據集,下面將會介紹可以解決該問題的方法。

嶺迴歸

現實生活中往往不是滿秩矩陣,例如在數據集中可能遇到非常多的特徵,其數目甚至超過了樣本個數,導致X的列數多於行數,此時顯然不滿秩,爲了解決這個問題,就引入了 嶺迴歸(ridge regression) 的概念。

嶺迴歸的思想非常簡單,就是通過引入一個矩陣,並且將這個單位矩陣和相加,從而 將轉化成一個可逆矩陣 ,進而可以對求逆,在這種情況下回歸係數表達式就可以寫成:

這裏是一個單位矩陣,即主對角線上元素爲1,其餘元素都爲0。稱爲 懲罰項 ,它的作用就是減少不重要的參數,這個技術被稱作 縮減 ,很明顯縮減後能取得更好的預測結果。

在使用嶺迴歸和縮減技術之前,需要對特徵做 標準化處理 ,這部分我們曾在KNN中也使用過,它的目的就是讓每個特徵具有相同的重要性,這部分代碼如下:

yMean = np.mean(yMat, axis =  0# 求真實y均值

yMat = yMat - yMean  # 真實y值減去均值

xMeans = np.mean(xMat, axis =  0 ) # 求x均值

xVar = np.var(xMat, axis =  0#求方差

xMat = (xMat - xMeans) / xVar 

# 實現標準化

代碼的剩餘部分和局部加權迴歸相似,所以就不再展示了,爲了方便我們所用數據集還是上文提及的,這裏最好使用特徵數比樣本數多的數據集,但我們只爲展示得出的結論,如下:     

這張圖繪製了迴歸係數與的關係,當非常小時,得到的係數是和最初線性迴歸一致的;當達到一定值時,係數全部縮減成0;所以 在中間部分的某值將會取得最好的預測結果

這裏有一條恆爲0的藍色線是因爲我們開始時設定了一個特徵全爲1,所以對這個特徵是沒有影響的。若想找到最佳的參數值還需要進行 交叉驗證 ,即多次調整參數尋求最優,並且根據每個特徵對應係數的大小,也能判斷出這個特徵對預測結果影響的大小。

縮減方法除了嶺迴歸之外還有lasso、LAR、PCA迴歸以及子集選擇等,這些方法都可以提高預測精準率,感興趣的夥伴可以自己瞭解一下。

總結

普通線性迴歸雖然可以擬合迴歸曲線,但是過於粗糙,有欠擬合的現象,通過局部加權迴歸可以得到更好的預測結果,但 調參k是關鍵 ,k過小可能會出現過擬合的現象。針對現實任務中總出現的不可逆矩陣,縮減技術中的嶺迴歸可以很好的解決該問題,它的主要思想就是通過 消除多餘的特徵降低預測誤差

End

往期推薦:

1. 機器學習筆記(十三)——重中之重的性能度量方式你要懂

2. 機器學習筆記(十二)——集成學習方法之AdaBoost

3. 機器學習筆記(十一)——學支持向量機怎能不懂“核”

4. 機器學習筆記(十)——這樣推導SMO算法才易理解

在看點這裏

相關文章