天天看點

【機器學習】嶺回歸

1.在之前關于回歸的讨論中,我們讨論了标準方程法,這一方法實際有比較大的缺陷,因為在标準方程法中,我們采使用了矩陣的一個很重要或者說很苛刻的性質:矩陣可逆。然而再很多的時候,矩陣是不可逆的。比如資料存在多重共線性的時候,(多重共線值得就是資料的若幹個特征存在類似的回歸性質,其實通俗一點舉個例子就是:比如我們在接一個n元一次方程的時候,我們需要n個方程,但是并且這n個方程必須是互不相關的,比如有一個方程是另一個方程的兩倍,那麼這個方程組基本上就是沒有辦法接出來唯一解的。從矩陣的角度來看,這個系數矩陣經過标準化不再是一個滿秩矩陣)這樣得到的矩陣在标準化以後很有可能不再是滿秩矩陣。這樣标準方程法就不能在使用了,統計學家為了應對這一這一問題,引入嶺回歸的概念。

2.首先我們需要知道什麼叫做正則化,對于代價函數的正則化,通常有兩種正則化方式:l1正則化,l2正則化。這兩種正則化的差別就是代價函數的附加值(或者叫做懲罰值)不同,第一個數加上所有參數絕對值之和,第二個數加上所有參數的平方和。這裡我們采用l2正則化:

【機器學習】嶺回歸

其中

【機器學習】嶺回歸

叫做嶺回歸系數。這個代價函數是由兩部分組成,前邊是殘差,後邊是附加懲罰。二者并不是獨立的,互相影響。但是我們依然可以對這個代價函數求導得到權值最優解:

【機器學習】嶺回歸

其實就是在原來的基礎上附加一個機關矩陣,使得原本不是滿秩矩陣X^T*X變成一個滿秩矩陣。這樣就可以求逆矩陣了。

3.知道了這些,我們實戰一下:首先介紹一種資料集:lonely資料集,這是一種用于驗證程式正确與否的很經典的資料集,是一個美國的某個地方資料,因為這種資料經常的存在多重共線性,是以比較适合用來做測試。

我們的資料集長這個樣子:

【機器學習】嶺回歸

然後開始我們的程式:首先載入資料并且分割資料,資料中的第一行是某一個名額,也就是我們需要預測的值。其他資料是資料集。我們這次将要采用交叉驗證的方法(交叉驗證其實就是把訓練資料集分割成兩個部分,一個用來訓練模型,另一部分用來驗證資料)。

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from sklearn import linear_model
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
# print(data)
# 切分資料
x_data=data[1:,2:]#選取的資料就是從第一行到最後一行,第二列到最後一列
# print(x_data)
y_data=data[1:,1]#這是目标預測值
# print(y_data)      

載入資料之後,我們需要産生嶺系數,我們采用Python庫函數:np.linspace().預設産生50個資料。然後調用Sklearn中的回歸函數得到答案。完整代碼如圖所示:

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from sklearn import linear_model
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
# print(data)
# 切分資料
x_data=data[1:,2:]#選取的資料就是從第一行到最後一行,第二列到最後一列
# print(x_data)
y_data=data[1:,1]#這是目标預測值
# print(y_data)
# 這個預設會産生50個0.001-1的資料,作為嶺回歸的系數
alphas_to_test=np.linspace(0.001,1)
# 這個就是調用sklearn庫函數中的嶺回歸方法,CV的意思就是交叉驗證.
# 第一個參數的意思就是嶺回歸系數,他會驗證這50個資料,
model=linear_model.RidgeCV(alphas_to_test,store_cv_values=True)
model.fit(x_data,y_data)
# 嶺回歸選區最好的嶺系數
# print(model.alpha_)
# 解釋一下這裡的意思:這行代碼執行玩以後的結果是:(16, 50).16是交叉驗證産生的,每一行資料都會做一次測試集合,50指的是嶺系數一共驗證了50個
# print(model.cv_values_.shape)

# 我們首先可以看一下嶺系數和loss值的關系
plt.plot(alphas_to_test,model.cv_values_.mean(axis=0))
#選取最優嶺系數的位置
plt.plot(model.alpha_,min(model.cv_values_.mean(axis=0)),'ro')
plt.show()      

然後我們做出來嶺回歸系數和loss值(代價函數值)之間的函數圖像,并且把最佳的嶺系數标記出來得到如下圖所示:

上一篇: swift2.0筆記2
下一篇: swift2.0筆記3