線性迴歸算法梳理

線性迴歸算法梳理

機器學習的一些概念

監督學習:通過已有的一部分輸入數據和輸出數據的對應關係來生成一個函數模型,將未來的輸入映射到對應的輸出。例如分類問題和迴歸問題。訓練監督學習的數據集是已經標註好的數據集。

無監督學習:通過對原始的數據進行分類來給數據添加標籤,無監督學習並不關心分類的類別。典型的無監督學習例子爲聚類算法。

泛化能力:是指已經訓練好的模型對新的數據進行識別的能力。類似於舉一反三的能力。

過擬合 :模型的複雜度很高,對於訓練數據擬合的很好,但是由於模型複雜度高於實際模型而導致泛化能力很差。

欠擬合 : 欠擬合和過擬合是相對的,模型複雜度低於實際的情況,對訓練數據擬合效果很差而導致泛化能力很差。
圖片來自吳恩達 機器學習
交叉驗證(Cross Validation):有的時候也稱作循環估計(Rotation Estimation),是一種統計學上將數據樣本切割成較小子集的實用方法,該理論是由Seymour Geisser提出的。
在給定的建模樣本中,拿出大部分樣本進行建模型,留小部分樣本用剛建立的模型進行預報,並求這小部分樣本的預報誤差,記錄它們的平方加和。這個過程一直進行,直到所有的樣本都被預報了一次而且僅被預報一次。把每個樣本的預報誤差平方加和,稱爲PRESS(predicted Error Sum of Squares)。
用交叉驗證的目的是爲了得到可靠穩定的模型。

線性迴歸原理

線性迴歸:給定由d個屬性描述的示例 x=(x1;x2;x3...;xd)x=(x_1;x_2;x_3 ...;x_d),其中xix_ixx在第ii個屬性上的取值,線性模型試圖學的一個通過屬性的線性組合來預測函數 ,即f(x)=w1x1+w2x2+w3x3+...+wdxd+bf(x)=w_1x_1+w_2x_2+w_3x_3+...+w_dx_d+b
用向量表示爲f(x)=wTx+bf(x)=w^Tx+b

線性迴歸是給定數據集D=(x1,y1),(x2,y2),...,(xm,ym)D={(x_1,y_1),(x_2,y_2),...,(x_m,y_m)},其中xi=(xi1;xi2;...;xid),yiRx_i=(x_{i1};x_{i2};...;x_{id}),y_i \in \mathbb R線性迴歸則是試圖學得一個線性模型儘可能的準確預測出標記值。(來自西瓜書)

損失函數,代價函數與目標函數

損失函數(Loss Function )是定義在單個樣本上的,算的是一個樣本的誤差。

代價函數 (Cost Function )是定義在整個訓練集上的,是所有樣本誤差的平均,也就是損失函數的平均。

目標函數(Object Function)定義爲:最終需要優化的函數。等於經驗風險+結構風險(也就是代價函數 + 正則化項)。
(來自吳恩達機器學習)

線性迴歸優化方法

梯度下降法
在這裏插入圖片描述
梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出代價函數 J(θ0,θ1)J(θ_0,θ_1) 的最小值。
梯度下降背後的思想是:開始時我們隨機選擇一個參數的組合θ0,θ1,...,θn(θ_0,θ_1,...,θ_n),計算代價函數,然後我們尋找下一個能讓代價函數值下降最多的參數組合。我們持續這麼做直到到到一個局部最小值(local minimum),因爲我們並沒有嘗試完所有的參數組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值。
loss=(y^y)2=(xwy)2w=wαlosswloss = (\hat{y}-y)^2=(x*w-y)^2\\ w = w-\alpha \frac{\partial loss}{\partial w}
α\alpha是學習率,也就是步長,來控制下降的快慢。
牛頓法
在這裏插入圖片描述
牛頓迭代法(Newton’s method)又稱爲牛頓-拉夫遜(拉弗森)方法(Newton-Raphson method),它是牛頓在17世紀提出的一種在實數域和複數域上近似求解方程的方法。
rrf(x)=0f(x)=0的根,選取x0x_0作爲rr的初始值,過點x0,f(x0)x_0,f(x_0)做曲線y=f(x)y=f(x)的切線LLL:y=f(x0)+f(x0)(xx0)L:y=f(x_0)+f'(x_0)(x-x_0),則LLxx軸交點橫座標爲x1=x0f(x0)f(x0)x_1=x_0-\frac{f(x_0)}{f'(x_0)},然後反覆迭代求得xn+1=xnf(xn)f(xn)x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}得到rrn+1n+1次近似值,這便是牛頓迭代公式。

線性迴歸評價指標

均方誤差(MSE):MSE=1mi=1m(yiyi^)2MSE=\frac{1}{m}{\sum_{i=1}^m(y_i-\hat{y_i})^2}
真實值減去預測值 然後平方之後求和平均。與線性迴歸的損失函數有着一樣的表法式。

均方根誤差(RMSE):RMSE=1mi=1m(yiyi^)2RMSE=\sqrt{\frac{1}{m}{\sum_{i=1}^m(y_i-\hat{y_i})^2}}
均方誤差是線性模型擬合過程中,最小化誤差平方和(SSE)代價函數的平均值。MSE可以用於不同模型的比較,或是通過網格搜索進行參數調優,以及交叉驗證等。

平均絕對誤差(MAE):MAE=1mi=1m(yiyi^)MAE=\frac{1}{m}\sum_{i=1}^m|(y_i-\hat{y_i})|
平均絕對誤差式預測值與真實值的差值求平均。

sklearn參數詳解

from sklearn.linear_model import LinearRegression
LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)
 
'''
參數含義:
1.fit_intercept:布爾值,指定是否需要計算線性迴歸中的截距,即b值。如果爲False,
那麼不計算b值。
2.normalize:布爾值。如果爲False,那麼訓練樣本會進行歸一化處理。
3.copy_X:布爾值。如果爲True,會複製一份訓練數據。
4.n_jobs:一個整數。任務並行時指定的CPU數量。如果取值爲-1則使用所有可用的CPU。
5.coef_:權重向量
6.intercept_:截距b值
方法:
1.fit(X,y):訓練模型。
2.predict(X):用訓練好的模型進行預測,並返回預測值。
3.score(X,y):返回預測性能的得分。計算公式爲:score=(1 - u/v)
其中u=((y_true - y_pred) ** 2).sum(),v=((y_true - y_true.mean()) ** 2).sum()
score最大值是1,但有可能是負值(預測效果太差)。score越大,預測性能越好。
'''
 
from sklearn.linear_model import Ridge
 
Ridge(alpha=1.0, fit_intercept=True, normalize=False,
                 copy_X=True, max_iter=None, tol=1e-3, solver="auto",
                 random_state=None)
'''
參數含義:
1.alpha:正則項係數,值越大正則項佔比越大。初始值建議一開始設置爲0,這樣先確定一個比較好的學習率,
學習率一旦確定,給alpha一個較小的值,然後根據驗證集上的準確率,增大或減小10倍。10倍是粗調節,
當確定了合適的數量級後,再在同一個數量級內細調節。
2.fit_intercept:布爾值,指定是否需要計算截距b值。False則不計算b值。
3.normalize:布爾值。如果等於True,模型訓練之前會把數據歸一化。
這裏歸一化有兩個好處:(1):提升模型的收斂速度,減少尋找最優解的時間。(2)提升模型的精度
4.copy_X:布爾值。如果設置爲True,則會複製一份訓練數據。
5.max_iter:整數。指定了最大迭代次數。如果爲None,則採用默認值。
6.tol:閾值。判斷迭代是否收斂或者是否滿足精度的要求。
7.solver:字符串。指定求解最優化問題的算法。
        (1).solver='auto',根據數據集自動選擇算法。
        (2).solver='svd',採用奇異值分解的方法來計算
        (3).solver='cholesky',採用scipy.linalg.solve函數求解最優解。
        (4).solver='sparse_cg',才喲個scipy.sparse.linalg.cg函數來求取最優解。
        (5).solver='sag',採用Stochastic Average Gradient descent算法求解最優化問題。
8.random_state:一個整數或者一個RandomState實例,或者爲None。它在solver="sag"時使用。
        (1).如果爲整數,則它指定了隨機數生成器的種子。
        (2).如果爲RandomState實例,則指定了隨機數生成器。
        (3).如果爲None,則使用默認的隨機數生成器。
9.coef_:權重向量。
10.intercept_:截距b的值。
11.n_iter_:實際迭代次數。
方法:
1.fit(X,y):訓練模型。
2.predict(X):用訓練好的模型去預測,並且返回預測值。
3.score(X,y):返回預測性能的得分。計算公式爲:score=(1 - u/v)
其中u=((y_true - y_pred) ** 2).sum(),v=((y_true - y_true.mean()) ** 2).sum()
score最大值是1,但有可能是負值(預測效果太差)。score越大,預測性能越好。
'''
 
from sklearn.linear_model import Lasso
Lasso(alpha=1.0, fit_intercept=True, normalize=False,
                 precompute=False, copy_X=True, max_iter=1000,
                 tol=1e-4, warm_start=False, positive=False,
                 random_state=None, selection='cyclic')
'''
1.alpha:正則化項係數
2.fit_intercept:布爾值,指定是否需要計算截距b值。False則不計算b值。
3.max_iter:指定最大迭代次數。
4.normalize:布爾值。如果等於True,模型訓練之前會把數據歸一化。
這裏歸一化有兩個好處:(1):提升模型的收斂速度,減少尋找最優解的時間。(2)提升模型的精度。
5.precompute:一個布爾值或者一個序列。它決定是否提前計算Gram矩陣來加速計算。
6.tol:閾值。判斷迭代是否收斂或者是否滿足精度的要求。
7.warm_start:布爾值。如果爲True,那麼使用前一次訓練結果繼續訓練。否則從頭開始訓練。
8.positive:布爾值。如果爲True,那麼強制要求權重向量的分量都爲正數。
9.selection:字符串,可以是"cyclic"或"random"。它指定了當每輪迭代的時候,選擇權重向量的
哪個分量來更新。
    (1)"random":更新的時候,隨機選擇權重向量的一個分量來更新。
    (2)"cyclic":更新的時候,從前向後依次選擇權重向量的一個分量來更新。
10.random_state:一個整數或者一個RandomState實例,或者None。
    (1):如果爲整數,則它指定了隨機數生成器的種子。
    (2):如果爲RandomState實例,則它指定了隨機數生成器。
    (3):如果爲None,則使用默認的隨機數生成器。
11.coef_:權重向量。
12.intercept_:截距b值。
13.n_iter_:實際迭代次數。
方法:
1.fit(X,y):訓練模型。
2.predict(X):用模型進行預測,返回預測值。
3.score(X,y):返回預測性能的得分。計算公式爲:score=(1 - u/v)
其中u=((y_true - y_pred) ** 2).sum(),v=((y_true - y_true.mean()) ** 2).sum()
score最大值是1,但有可能是負值(預測效果太差)。score越大,預測性能越好。
'''
 
from sklearn.linear_model import ElasticNet
 
ElasticNet(alpha=1.0, l1_ratio=0.5, fit_intercept=True,
                 normalize=False, precompute=False, max_iter=1000,
                 copy_X=True, tol=1e-4, warm_start=False, positive=False,
                 random_state=None, selection='cyclic')
'''
ElasticNet迴歸是對Lasso迴歸和嶺迴歸的融合,其正則化項是L1範數和L2範數的一個權衡。
正則化項爲: alpha * l1_ratio * ||w||_1
            + 0.5 * alpha * (1 - l1_ratio) * ||w||^2_2
參數含義:
1.alpha:正則化項中alpha值。
2.l1_ratio:正則化項中的l1_ratio值。
3.fit_intercept:布爾值,指定是否需要計算截距b值。False則不計算b值。
4.max_iter:指定最大迭代次數。
5.normalize:布爾值。如果等於True,模型訓練之前會把數據歸一化。
這裏歸一化有兩個好處:(1):提升模型的收斂速度,減少尋找最優解的時間。(2)提升模型的精度。
6.copy_X:布爾值。如果設置爲True,則會複製一份訓練數據。
7.precompute:一個布爾值或者一個序列。它決定是否提前計算Gram矩陣來加速計算。
8.tol:閾值。判斷迭代是否收斂或者是否滿足精度的要求。
9.warm_start:布爾值。如果爲True,那麼使用前一次訓練結果繼續訓練。否則從頭開始訓練。
10.positive:布爾值。如果爲True,那麼強制要求權重向量的分量都爲正數。
11.selection:字符串,可以是"cyclic"或"random"。它指定了當每輪迭代的時候,選擇權重向量的
哪個分量來更新。
    (1)"random":更新的時候,隨機選擇權重向量的一個分量來更新。
    (2)"cyclic":更新的時候,從前向後依次選擇權重向量的一個分量來更新。
12.random_state:一個整數或者一個RandomState實例,或者None。
    (1):如果爲整數,則它指定了隨機數生成器的種子。
    (2):如果爲RandomState實例,則它指定了隨機數生成器。
    (3):如果爲None,則使用默認的隨機數生成器。
13.coef_:權重向量。
14.intercept_:b值。
15.n_iter_:實際迭代次數。
方法:
1.fit(X,y):訓練模型。
2.predict(X):用模型進行預測,返回預測值。
3.score(X,y):返回預測性能的得分。計算公式爲:score=(1 - u/v)
其中u=((y_true - y_pred) ** 2).sum(),v=((y_true - y_true.mean()) ** 2).sum()
score最大值是1,但有可能是負值(預測效果太差)。score越大,預測性能越好。
'''
 
from sklearn.linear_model import LogisticRegression
 
LogisticRegression(penalty='l2', dual=False, tol=1e-4, C=1.0,
                 fit_intercept=True, intercept_scaling=1, class_weight=None,
                 random_state=None, solver='liblinear', max_iter=100,
                 multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
'''
參數含義:
1.penalty:字符串,指定了正則化策略。默認爲"l2"
    (1).如果爲"l2",則優化的目標函數爲:0.5*||w||^2_2+C*L(w),C>0,
        L(w)爲極大似然函數。
    (2).如果爲"l1",則優化的目標函數爲||w||_1+C*L(w),C>0,
        L(w)爲極大似然函數。
2.dual:布爾值。默認爲False。如果等於True,則求解其對偶形式。只有在penalty="l2"並且
        solver="liblinear"時纔有對偶形式。如果爲False,則求解原始形式。當n_samples > n_features,
        偏向於dual=False。
3.tol:閾值。判斷迭代是否收斂或者是否滿足精度的要求。
4.C:float,默認爲1.0.指定了正則化項係數的倒數。必須是一個正的浮點數。他的值越小,正則化項就越大。
5.fit_intercept:bool值。默認爲True。如果爲False,就不會計算b值。
6.intercept_scaling:float, default 1。
                    只有當solver="liblinear"並且fit_intercept=True時,纔有意義。
                    在這種情況下,相當於在訓練數據最後一列增加一個特徵,該特徵恆爲1。
                    其對應的權重爲b。
7.class_weight:dict or 'balanced', default: None。
                (1)如果是字典,則給出每個分類的權重。按照{class_label: weight}這種形式。
                (2)如果是"balanced":則每個分類的權重與該分類在樣本集中出現的頻率成反比。
                n_samples / (n_classes * np.bincount(y))
                (3)如果未指定,則每個分類的權重都爲1。
8.random_state:int, RandomState instance or None, default: None
                (1):如果爲整數,則它指定了隨機數生成器的種子。
                (2):如果爲RandomState實例,則它指定了隨機數生成器。
                (3):如果爲None,則使用默認的隨機數生成器。
9.solver:字符串,指定求解最優化問題的算法。
        {'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},default: 'liblinear'
        (1)solver='liblinear',對於小數據集,'liblinear'是很好的選擇。
        對於大規模數據集,'sag'和'saga'處理起來速度更快。
        (2)solver='newton-cg',採用牛頓法
        (3)solver='lbfgs',採用L-BFGS擬牛頓法。
        (4)solver='sag',採用Stochastic Average Gradient descent算法。
        (5)對於多分類問題,只有'newton-cg','sag','saga'和'lbfgs'處理多項損失;
        'liblinear'僅限於'ovr'方案。
        (6)newton-cg', 'lbfgs' and 'sag' 只能處理 L2 penalty,
           'liblinear' and 'saga' 能處理 L1 penalty。
10.max_iter:指定最大迭代次數。default: 100。
            只對'newton-cg', 'sag' and 'lbfgs'適用。
11.multi_class:{'ovr', 'multinomial'}, default: 'ovr'。指定對分類問題的策略。
                (1)multi_class='ovr',採用'one_vs_rest'策略。
                (2)multi_class='multinomal',直接採用多分類邏輯迴歸策略。
12.verbose:用於開啓或者關閉迭代中間輸出日誌功能。
13.warm_start:布爾值。如果爲True,那麼使用前一次訓練結果繼續訓練。否則從頭開始訓練。
14.n_jobs:int, default: 1。指定任務並行時的CPU數量。如果爲-1,則使用所有可用的CPU。
15.coef_:權重向量。
16.intercept_:b值。
17.n_iter_:實際迭代次數。
方法:
1.fit(X,y):訓練模型。
2.predict(X):用訓練好的模型進行預測,並返回預測值。
3.predict_log_proba(X):返回一個數組,數組元素依次是X預測爲各個類別的概率的對數值。
4.predict_proba(X):返回一個數組,數組元素依次是X預測爲各個類別的概率值。
5.score(X,y):返回預測的準確率。
'''

參考文檔

  1. 《機器學習》周志華
  2. 吳恩達斯坦福機器學習公開課
  3. 《統計機器學習》李航
  4. 《PRML》馬春鵬
  5. https://blog.csdn.net/qq_16000815/article/details/80928728
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章