sklearn中的LinearRegression
-
函數原型:
class sklearn.linear_model.LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)
-
fit_intercept:模型是否存在截距
-
normalize:模型是否對數據進行標准化(在回歸之前,對X減去平均值再除以二范數),如果fit_intercept被設置為False時,該參數將忽略。
該函數有屬性:coef_可供查看模型訓練后得到的估計系數,如果獲取的估計系數太大,說明模型有可能過擬合。
使用樣例:>>>from sklearn import linear_model >>>clf = linear_model.LinearRegression() X = [[0,0],[1,1],[2,2]] y = [0,1,2] >>>clf.fit(X,y) >>>print(clf.coef_) [ 0.5 0.5] >>>print(clf.intercept_) 1.11022302463e-16
源碼分析
在github可以找到LinearRegression的源碼:LinearRegression
-
主要思想:
sklearn.linear_model.LinearRegression
求解線性回歸方程參數時,首先判斷訓練集X是否是稀疏矩陣,如果是,就用Golub&Kanlan雙對角線化過程方法來求解;否則調用C庫中LAPACK中的用基於分治法的奇異值分解來求解。在sklearn中並不是使用梯度下降法
求解線性回歸,而是使用最小二乘法求解。
sklearn.LinearRegression的fit()方法:if sp.issparse(X):#如果X是稀疏矩陣 if y.ndim < 2: out = sparse_lsqr(X, y) self.coef_ = out[0] self._residues = out[3] else: # sparse_lstsq cannot handle y with shape (M, K) outs = Parallel(n_jobs=n_jobs_)( delayed(sparse_lsqr)(X, y[:, j].ravel()) for j in range(y.shape[1])) self.coef_ = np.vstack(out[0] for out in outs) self._residues = np.vstack(out[3] for out in outs) else: self.coef_, self._residues, self.rank_, self.singular_ = \ linalg.lstsq(X, y) self.coef_ = self.coef_.T
幾個有趣的點:
- 如果y的維度小於2,並沒有並行操作。
- 如果訓練集X是稀疏矩陣,就用
sparse_lsqr()
求解,否則使用linalg.lstsq()
linalg.lstsq()
scipy.linalg.lstsq()
方法就是用來計算X為非稀疏矩陣時的模型系數。這是使用普通的最小二乘OLS法來求解線性回歸參數的。
- scipy.linalg.lstsq()方法源碼
scipy提供了三種方法來求解least-squres problem
最小均方問題,即模型優化目標。其提供了三個選項gelsd
,gelsy
,geless
,這些參數傳入了get_lapack_funcs()
。這三個參數實際上是C函數名,函數是從LAPACK(Linear Algebra PACKage)中獲得的。
gelsd:它是用singular value decomposition of A and a divide and conquer method方法來求解線性回歸方程參數的。
gelsy:computes the minimum-norm solution to a real/complex linear least squares problem
gelss:Computes the minimum-norm solution to a linear least squares problem using the singular value decomposition of A.
scipy.linalg.lstsq()方法使用gelsd求解(並沒有為用戶提供選項)。
sparse_lsqr()方法源碼
sqarse_lsqr()
方法用來計算X是稀疏矩陣時的模型系數。sparse_lsqr()
就是不同版本的scipy.sparse.linalg.lsqr()
,參考自論文C. C. Paige and M. A. Saunders (1982a). "LSQR: An algorithm for sparse linear equations and sparse least squares", ACM TOMS
實現。
相關源碼如下:
if sp_version < (0, 15):
# Backport fix for scikit-learn/scikit-learn#2986 / scipy/scipy#4142
from ._scipy_sparse_lsqr_backport import lsqr as sparse_lsqr
else:
from scipy.sparse.linalg import lsqr as sparse_lsqr