嶺回歸


Ridge regression 通過對系數的大小施加懲罰來解決 普通最小二乘法 的一些問題。嶺回歸系數最小化的是帶懲罰項的殘差平方和,數學形式如下:

m i n i = 1 p X ω i - y 2 + α ω 2

其中,α>= 0是一個控制縮減量(amount of shrinkage)的復雜度參數:α的值越大,縮減量就越大,故而線性模型的系數對共線性(collinearity)就越魯棒。(L2正則化)換句話說,讓各個特征對結果的影響盡可能的小,但也能擬合出不錯的模型。

與普通最小二乘法一樣,Ridge 會調用 fit 方法來擬合數組 X, y,並且將線性模型的系數 ω存儲在其成員變量 coef_,截距存儲在intercept_:

from sklearn.linear_model import Ridge

ridge = Ridge(alpha=.5)
ridge.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print("coef: {}".format(ridge.coef_))
print("intercept: {:.2f}".format(ridge.intercept_))
coef: [0.34545455 0.34545455]
intercept: 0.14
%config InlineBackend.figure_format='svg' # 矢量圖設置

下面用代碼實現一個嶺回歸的案例

繪制嶺回歸系數作為正則化量的函數的曲線圖

展示共線性(collinearity)對估計器系數的影響

這個例子中用到的模型是嶺回歸估計器(Ridge)。每種顏色表示系數向量的不同特征,並將其顯示為正則化參數的函數。

此示例還顯示了將嶺回歸應用於高度病態(ill-conditioned)矩陣的有效性。對於這樣的矩陣,目標變量的微小變化會導致計算出的權重的巨大差異。在這種情況下,設置一定的正則化(alpha)來減少這種變化(噪聲)是很有用的。

當alpha很大時,正則化效應將會主導(控制)平方損失函數,線性模型的系數也將趨於零。在路徑的末尾,當alpha趨於零時,系數趨於沒有設置正則化項的普通最小二乘法的系數,系數會出現很大的震盪(為高度病態矩陣)。

總共有10個系數,10條曲線,一一對應。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge

# X 是一個10x10的 希爾伯特矩陣(Hilbert matrix)(高度病態且正定)
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)

# 計算路徑(Compute paths)
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)

coefs = []
for a in alphas:
    ridge = Ridge(alpha=a, fit_intercept=False)  # 每個循環都要重新實例化一個estimator對象
    ridge.fit(X, y)
    coefs.append(ridge.coef_)
    
# 畫圖
ax = plt.gca()

ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])  # 反轉數軸,越靠左邊alpha越大,正則化越強
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regulariization')
plt.axis('tight')

嶺回歸的時間復雜度與普通最小二乘法相同

設置正則化參數:廣義交叉驗證

RidgeCV 通過內置的 alpha 參數的交叉驗證來實現嶺回歸。該對象與 GridSearchCV的使用方法相同,只是它默認為Generalized Cross-Validation(廣義交叉驗證GCV),這是一種有效的留以驗證方法(LOO-CV):

from sklearn.linear_model import RidgeCV

ridge_cv = RidgeCV(alphas=[0.1, 1.0, 10.0], cv=3)
ridge_cv.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print("coef: {}".format(ridge_cv.coef_))
print("alpha: {}".format(ridge_cv.alpha_))
coef: [0.44186047 0.44186047]
alpha: 0.1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM