嶺迴歸算法的原理和代碼實戰
前言
學過吳恩達老師的機器學習入門課程都應該知道,在邏輯迴歸那一講,吳老師提到了使用正則化來防止邏輯迴歸模型過擬合。而嶺迴歸在這裏的作用是一樣的,同樣也是防止模型過擬合。這兩者的區別在於,同樣在使用差平方作爲所損失值後,前者使用梯度下降法進行參數優化,而後者使用最小二乘法計算參數。
嶺迴歸原理
1. 前情回顧
前面咱們寫過一篇博客,主要說的是使用最小二乘法解決一般線性迴歸問題,如果大家沒有看過,請看一下。線性迴歸算法擬合數據原理分析以及源代碼解析
不想看沒關係,咱們在這裏把重要推導公式再寫一遍:
直線方程:
損失值函數:
向量書寫:
式子展開:
求導:
令導數爲零,求出α:
2. 嶺迴歸公式推導
看完一般線性迴歸推導式後,我們對上面的式子稍微做一些改變。
首先我們在損失函數上添加懲罰項,與文首咱們說的正則化項基本一致。
對於λ,其值越大,對整個損失函數的懲罰就越大,換句話意思就是λ值越大,對α參數的變化就更加敏感。我們假設λ爲10的時候,α²有0.1的變化,整理就會產生1的變化。如果λ爲10000,α²有0.1的變化,整體就有1000的變化。
接着我們把公式進行向量化:
我們對其進行求導:
我們令其導數爲零,可以求出來α,
好了,到這裏我們就得出來這個參數α了,其中I是常向量E。
α新式子另一個優勢
我們知道這個式子裏面X代表數據。
如果我們數據的屬性要大於數據量,那麼這個X矩陣則是奇異矩陣(矩陣的模爲0),即表示X矩陣不可逆。所以XTX這個求解的矩陣,也會存在不可逆的情況。此時我們添加了一個λI,可以避免不可逆現象的出現。
嶺迴歸代碼實戰
1. 數據集的加載
我們先來看一下數據集的屬性有哪些:
圖中最座標紅色方塊是數據的常數1,用來求解常量,對應着就是我們前面公式的b。
中間黃色的是我們的屬性值α1.
最右邊白色的是我們數據的值,也就是y值。
我們來看一下數據的分佈情況:
def LoadData(filename):
dataMat = []
labelMat = []
with open(filename) as f:
numFeat = len(f.readline().split('\t'))-1#這裏會導致忽略第一個數據
for line in f.readlines():
lineArr = []
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
這裏將text數據集分別放入到兩個數組中
2. 主函數,計算模型參數
## 主函數,計算模型參數
def ridgeRegres(xMat,yMat,lam=0.2):
xTx = xMat.T*xMat
denom = xTx+np.eye(np.shape(xMat)[1])*lam
if np.linalg.det(denom)==0.0:
print("This matrix is singular ,cannot do inverse")
return
ws = denom.I*(xMat.T*yMat)
return ws
這一部分是整個代碼中最關鍵的部分,用來計算模型參數。
代碼中的ws對應着公式中的α。
denom.I 表示對denom取逆。
3. 交叉驗證,選擇合適的λ
def Cross_validation(xMat,yMat,ridgeWeights,lamudas):
yMat = np.array(yMat).reshape((len(yMat),1))
lossvalue = []
for i in range(9):
yHat = xMat*np.mat(ridgeWeights[i]).T
lossvalue.append(np.sum(np.abs(yHat-yMat)))
lossvalue = np.array(lossvalue)
result = lossvalue.argmin()
return lamudas[result]
這個函數,我們主要是通過比較不同λ產生的預測值與原標籤值的損失值,選擇可以使損失值達到最小的λ值。
這裏爲了計算的方便,我們使用了絕對值代替的平方,但是最終產生的結果都是一樣的。
結果分析
首先我們先輸出不同λ對應的不同圖像,我將這九個圖形放在了一張圖形中,方便我們去比較,觀察。
經交叉驗證輸出,最優的λ取值是1.0.
從圖中我們可以看出,隨着λ的增大,我們所擬合的直線模型逐漸偏移數據。從另一個層面來講,λ的增大,使得模型精度逐漸減少,同樣也會減少模型的過擬合,使得模型更加符合整個數據的趨勢。
總結
嶺迴歸只是縮減法的一種,其作用就是能夠減少模型的擬合度,防止過擬合。咱們前幾篇文章也有說到關於防止欠擬合的方法,如果大家感興趣的話,可以將兩者方法結合起來,說不定模型的效果會更好。