嶺迴歸算法的原理和代碼實戰

嶺迴歸算法的原理和代碼實戰

前言

學過吳恩達老師的機器學習入門課程都應該知道,在邏輯迴歸那一講,吳老師提到了使用正則化來防止邏輯迴歸模型過擬合。而嶺迴歸在這裏的作用是一樣的,同樣也是防止模型過擬合。這兩者的區別在於,同樣在使用差平方作爲所損失值後,前者使用梯度下降法進行參數優化,而後者使用最小二乘法計算參數。

嶺迴歸原理

1. 前情回顧

前面咱們寫過一篇博客,主要說的是使用最小二乘法解決一般線性迴歸問題,如果大家沒有看過,請看一下。線性迴歸算法擬合數據原理分析以及源代碼解析

不想看沒關係,咱們在這裏把重要推導公式再寫一遍:

直線方程:

img

損失值函數:

img

向量書寫:

img

式子展開:

img

求導:

img

令導數爲零,求出α:

img

2. 嶺迴歸公式推導

看完一般線性迴歸推導式後,我們對上面的式子稍微做一些改變。

首先我們在損失函數上添加懲罰項,與文首咱們說的正則化項基本一致。

img

對於λ,其值越大,對整個損失函數的懲罰就越大,換句話意思就是λ值越大,對α參數的變化就更加敏感。我們假設λ爲10的時候,α²有0.1的變化,整理就會產生1的變化。如果λ爲10000,α²有0.1的變化,整體就有1000的變化。

接着我們把公式進行向量化:

img

我們對其進行求導:

img

我們令其導數爲零,可以求出來α,

img

好了,到這裏我們就得出來這個參數α了,其中I是常向量E。

α新式子另一個優勢

img

我們知道這個式子裏面X代表數據。

如果我們數據的屬性要大於數據量,那麼這個X矩陣則是奇異矩陣(矩陣的模爲0),即表示X矩陣不可逆。所以XTX這個求解的矩陣,也會存在不可逆的情況。此時我們添加了一個λI,可以避免不可逆現象的出現。

嶺迴歸代碼實戰

1. 數據集的加載

我們先來看一下數據集的屬性有哪些:

image-20200624113916873

圖中最座標紅色方塊是數據的常數1,用來求解常量,對應着就是我們前面公式的b。

中間黃色的是我們的屬性值α1.

最右邊白色的是我們數據的值,也就是y值。

我們來看一下數據的分佈情況:

image-20200624115800582

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]

這個函數,我們主要是通過比較不同λ產生的預測值與原標籤值的損失值,選擇可以使損失值達到最小的λ值。

這裏爲了計算的方便,我們使用了絕對值代替的平方,但是最終產生的結果都是一樣的。

結果分析

首先我們先輸出不同λ對應的不同圖像,我將這九個圖形放在了一張圖形中,方便我們去比較,觀察。

image-20200702215005388

經交叉驗證輸出,最優的λ取值是1.0.

從圖中我們可以看出,隨着λ的增大,我們所擬合的直線模型逐漸偏移數據。從另一個層面來講,λ的增大,使得模型精度逐漸減少,同樣也會減少模型的過擬合,使得模型更加符合整個數據的趨勢。

總結

嶺迴歸只是縮減法的一種,其作用就是能夠減少模型的擬合度,防止過擬合。咱們前幾篇文章也有說到關於防止欠擬合的方法,如果大家感興趣的話,可以將兩者方法結合起來,說不定模型的效果會更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章