sklearn中LinearRegression使用及源碼解讀


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


免責聲明!

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



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