嶺回歸
嶺回歸是一種專用於共線性數據分析的有偏估計回歸方法,實質上是一種改良的最小二乘估計法,通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價獲得回歸系數更為符合實際、更可靠的回歸方法,對病態數據的擬合要強於最小二乘法。
使用sklearn.linear_model.Ridge進行嶺回歸
一個簡單的例子
from sklearn.linear_model import Ridge
clf = Ridge(alpha=.5)
X = [[0,0],[0,0],[1,1]]
y = [0,.1,1]
clf.fit(X,y)
print(clf.coef_)
print(clf.intercept_)
運行結果如下:
使用方法
實例化
Ridge
類已經設置了一系列默認的參數,因此clf = Ridge()
即可以完成實例化。
但是,了解一下它的參數還是有必要的:
-
alpha
:正則化項的系數 -
copy_X
:是否對X數組進行復制,默認為True
,如果選False
的話會覆蓋原有X數組 -
fit_intercept
:是否需要計算截距 -
max_iter
:最大的迭代次數,對於sparse_cg
和lsqr
而言,默認次數取決於scipy.sparse.linalg
,對於sag
而言,則默認為1000次。 -
normalize
:標准化X
的開關,默認為False
-
solver
:在計算過程中選擇的解決器auto
:自動選擇svd
:奇異值分解法,比cholesky
更適合計算奇異矩陣cholesky
:使用標准的scipy.linalg.solve
方法sparse_cg
:共軛梯度法,scipy.sparse.linalg.cg
,適合大數據的計算lsqr
:最小二乘法,scipy.sparse.linalg.lsqr
sag
:隨機平均梯度下降法,在大數據下表現良好。
注:后四個方法都支持稀疏和密集數據,而
sag
僅在fit_intercept
為True時支持密集數據。 -
tol
:精度 -
random_state
:sag
的偽隨機種子
以上就是所有的初始化參數,當然,初始化后還可以通過set_params
方法重新進行設定。
回歸分析
在實例化Ridge
類以后,就可以直接使用Ridge
中集成的方法來進行回歸了,與絕大多數的sklearn類一樣,Ridge
使用fit
方法執行計算
fit(X,y,sample\_weight=None)
:X
是一個array
類型,這是特征矩陣,包含着數據集每一條記錄的特征值(N*M),y
是結果矩陣,同樣是array
類型,可以是N*1的形狀,也可以是N*K的形狀,sample_weight
代表着權重,可以是一個實數,也可以給每一條記錄分配一個值(array
類型)。
得到回歸函數后,我們可以通過predict
來使用回歸函數。
predict(X)
:X
測試數據集,此方法將返回回歸后的結果
對於模型的好壞,Ridge
當然提供了評價的方法——score
score(X,y,sample_weight=None)
:X為測試數據,y是測試數據的實際值,類型與fit中的相同,sample是權重
在sklearn中並沒有提供直接的查看回歸方程的函數,因此查看的時候需要自己轉化一下。其實,sklearn就是把相關系數和殘差分開保存了,因此,查看的時候要調用coef_
和intercept_
兩個屬性。
coef_
:相關系數(array類型)intercept_
:截距,在fit_intercept=False
的時候,將會返回0
可能有用的方法
這些方法在sklearn的基類中就已經集成,但在一般情況下,通常不會用到。
get_params(deep=True)
:這是獲取Ridge
實例屬性取值的方法,可以忽略set_params(**params)
:與get_params
方法相對,是設置屬性值,在嶺回歸中還是比較重要的,畢竟嶺回歸的alpha值在一開始可能並不知道,需要在一個范圍內進行嘗試,因此,利用這個方法來設置alpha值還是比較有用的。
以上就是Ridge
的總體介紹,在現實生活中,一般不會想上面的實例中的直接使用定值來計算,下面是一個更實際一點的例子:
# Author: Fabian Pedregosa -- <fabian.pedregosa@inria.fr>
# License: BSD 3 clause
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
# X is the 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)
clf = linear_model.Ridge(fit_intercept=False)
coefs = []
for a in alphas:
clf.set_params(alpha=a)
clf.fit(X, y)
coefs.append(clf.coef_)
###############################################################################
# Display results
ax = plt.gca()
ax.set_color_cycle(['b', 'r', 'g', 'c', 'k', 'y', 'm'])
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
這個例子中,alpha為1e-10~1e-2,以對數值等分,對每一個aplha進行一次計算,最后畫出嶺跡圖。嶺跡圖的樣子如下:
到此,嶺回歸的內容就結束了,我是sklearn的小小搬運工^_^/