線性回歸模型

回歸算法

線性回歸

線性回歸的定義是:目標(biāo)值預(yù)期是輸入變量的線性組合。線性模型形式簡單、易于建模,但卻蘊(yùn)含著機(jī)器學(xué)習(xí)中一些重要的基本思想。線性回歸,是利用數(shù)理統(tǒng)計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關(guān)系的一種統(tǒng)計分析方法,運(yùn)用十分廣泛。

優(yōu)點(diǎn):結(jié)果易于理解,計算不復(fù)雜

缺點(diǎn):對非線性的數(shù)據(jù)擬合不好

適用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型

將要用來描述這個回歸問題的標(biāo)記如下:

m 代表訓(xùn)練集中實例的數(shù)量

x 代表特征/輸入變量

y 代表目標(biāo)變量/輸出變量

\left( x,y \right) 代表訓(xùn)練集中的實例

({{x}^{(i)}},{{y}^{(i)}}) 代表第i 個觀察實例

h 代表學(xué)習(xí)算法的解決方案或函數(shù)也稱為假設(shè)(hypothesis

例如:房價例子中房子的大小預(yù)測房子的價格。h(\theta)=\theta_{0}+\theta_{1} x,其中x表示房子的大小,選擇合適的參數(shù)parameters\theta_{0}\theta_{1},在房價問題這個例子中便是直線的斜率和在y 軸上的截距。

通用公式為:
h(\theta)=\theta_{0}+\theta_{1} x
那么我們可以通過向量的方式來表示\theta就值與特征X值之間的關(guān)系:
\theta=\left( \begin{array}{l}{\theta_{0}} \\ {\theta_{1}} \\ \end{array}\right) ;X=\left( \begin{array}{l}{x_{0}} \\ {x_{1}} \end{array}\right)
兩向量相乘,結(jié)果為一個整數(shù)是估計值,其中所有特征集合的第一個特征值x0=1,那么我們可以通過通用的向量公式來表示線性模型:
h_\theta(x) = \theta^T X
一個列向量的轉(zhuǎn)置與特征的乘積,得出我們預(yù)測的結(jié)果,但是顯然我們這個模型得到的結(jié)果可定會有誤差,如下圖所示:

最小二乘法.jpg

我們選擇的參數(shù)決定了我們得到的直線相對于我們的訓(xùn)練集的準(zhǔn)確程度,模型所預(yù)測的值與訓(xùn)練集中實際值之間的差距(下圖中紅線所指)就是建模誤差modeling error)。

損失函數(shù)

損失函數(shù)在機(jī)器學(xué)習(xí)中是個重要的概念,大部分機(jī)器學(xué)習(xí)算法都會有誤差,我們得通過顯性的公式來描述這個誤差,并且將這個誤差優(yōu)化到最小值。

對于線性回歸模型,將模型與數(shù)據(jù)點(diǎn)之間的距離差之和做為衡量匹配好壞的標(biāo)準(zhǔn),誤差越小,匹配程度越大。我們要找的模型就是需要將f(x)和我們的真實值之間最相似的狀態(tài)。于是我們就有了誤差公式,模型與數(shù)據(jù)差的平方和最小(又稱最小二乘法):
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}
要使 J(θ) 誤差最小,可以采用一下兩種方法:一種使正規(guī)方程解法(只適用于簡單的線性回歸)另一種使用梯度下降算法

正規(guī)方程

求解:
\theta=\left(X^{T} X\right)^{-1} X^{T} y
X為特征值矩陣,y為目標(biāo)值矩陣

缺點(diǎn):當(dāng)特征過于復(fù)雜,求解速度太慢

? 對于復(fù)雜的算法,不能使用正規(guī)方程求解(邏輯回歸等)

梯度下降算法

假設(shè)線性函數(shù)形式:h_\theta \left( x \right)=\theta_{0}+\theta_{1}x

損失函數(shù)(又稱代價函數(shù)或成本函數(shù)):
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}
梯度下降是一個用來求函數(shù)最小值的算法,將使用梯度下降算法來求出損失函數(shù)J(\theta_{0}, \theta_{1}) 的最小值。

梯度下降思想:開始時我們隨機(jī)選擇一個參數(shù)的組合\left( {\theta_{0}},{\theta_{1}},......,{\theta_{n}} \right),計算損失函數(shù),然后我們尋找下一個能讓損失函數(shù)值下降最多的參數(shù)組合。我們持續(xù)這么做直到找到一個局部最小值(local minimum),因為我們并沒有嘗試完所有的參數(shù)組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數(shù)組合,可能會找到不同的局部最小值。

梯度下降理解:想象你自己正站立在山的這一點(diǎn)上,站立在你想象的公園這座紅色山上,在梯度下降算法中,我們要做的就是旋轉(zhuǎn)360度,看看我們的周圍,并問自己要在某個方向上,用小碎步盡快下山。這些小碎步需要朝什么方向?如果我們站在山坡上的這一點(diǎn),你看一下周圍,你會發(fā)現(xiàn)最佳的下山方向,你再看看周圍,然后再一次想想,我應(yīng)該從什么方向邁著小碎步下山?然后你按照自己的判斷又邁出一步,重復(fù)上面的步驟,從這個新的點(diǎn),你環(huán)顧四周,并決定從什么方向?qū)羁煜律剑缓笥诌~進(jìn)了一小步,并依此類推,直到你接近局部最低點(diǎn)的位置。

梯度下降2.png

批量梯度下降(batch gradient descent)算法的公式為:
\theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta)
其中\alpha是學(xué)習(xí)率(learning rate),它決定了我們沿著能讓代價函數(shù)下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數(shù)減去學(xué)習(xí)速率乘以代價函數(shù)的導(dǎo)數(shù)。

接下來,對之前的線性回歸問題運(yùn)用批量梯度下降算法,關(guān)鍵在于求出代價函數(shù)的導(dǎo)數(shù),即:

\frac{\partial }{\partial {{\theta }_{j}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{\partial }{\partial {{\theta }_{j}}}\frac{1}{2m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}^{2}}

j=0 時:\frac{\partial }{\partial {{\theta }_{0}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}{{\sum\limits_{i=1}^{m}{\left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}}}

j=1 時:\frac{\partial }{\partial {{\theta }_{1}}}J({{\theta }_{0}},{{\theta }_{1}})=\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left( {{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)}

則算法改寫成:

Repeat {

? {\theta_{0}}:={\theta_{0}}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}{ \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)}

? {\theta_{1}}:={\theta_{1}}-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}{\left( \left({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}} \right)\cdot {{x}^{(i)}} \right)}

? }

當(dāng)然,梯度下降算法還有:隨機(jī)梯度下降算法,小批量梯度下降算法等,詳情請參考《吳恩達(dá)機(jī)器學(xué)習(xí)公開課》《深度學(xué)習(xí)500問》。

線性回歸算法比較:

(m訓(xùn)練樣本數(shù),n特征數(shù)量)

算法 m很大 是否支持核外 n很大 超參數(shù) 是否需要縮放 sklearn
正規(guī)方程 0 LinearRegression
批量梯度下降(BGD) 2
隨機(jī)梯度下降(SGD) >=2 SGDRegression
小批量梯度下降(Mini-batch GD) >=2
過擬合處理方法:
1.增加訓(xùn)練數(shù)據(jù) 可以有限的避免過擬合
2.特征選擇 手動有選擇性刪除特征;使用模型進(jìn)行特征選擇(例如PCA)
3.正則化 保留所有特征,但減少參數(shù)的大小

正則化:

為了防止線性回歸中出現(xiàn)過擬合現(xiàn)象,我們通常采用正則化方法進(jìn)行處理(在損失函數(shù)中添加一個正則項)。

接下來,用以下標(biāo)記來描述這個損失函數(shù):

m 表示訓(xùn)練集中實例的數(shù)量。

\lambda 表示用來控制的是對模型正則化的程度。

r 表示通過控制r來調(diào)節(jié)嶺回歸與套索回歸的混合比例。

嶺(Ridge)回歸的損失函數(shù):
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \frac{1}{2} \sum_{j=1}^{n} \theta_{j}^{2}
套索(Lasso)回歸的損失函數(shù):
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n}\left|\theta_{j}\right|
彈性網(wǎng)絡(luò)(Elastic Net)的損失函數(shù):
J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+r \lambda \sum_{j=1}^{n}\left|\theta_{j}\right|+\frac{1-r}{2} \lambda \sum_{j=1}^{n} \theta_{j}^{2}

LinearRegression
  1. LinearRegression是線性回歸模型,它的原型為:

    class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False,copy_X=True, n_jobs=1)
    
    • fit_intercept:一個布爾值,偏置項,指定是否需要計算截距項。
    • normalize:一個布爾值。如果為True,那么訓(xùn)練樣本會在訓(xùn)練之前會被歸一化。
    • copy_X:一個布爾值。如果為True,則會拷貝X
    • n_jobs:一個整數(shù),指定計算并行度。
  2. 模型屬性:

    • coef_:權(quán)重向量。
    • intercept_b 值。
  3. 模型方法:

    • fit(X,y[,sample_weight]):訓(xùn)練模型。
    • predict(X):用模型進(jìn)行預(yù)測,返回預(yù)測值。
    • score(X,y[,sample_weight]):返回模型的預(yù)測性能得分。
SGDRegressor
  1. SGD類實現(xiàn)了SGD線性回歸模型。其原型為:

    class sklearn.linear_model.SGDRegressor(loss='squared_loss', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=None, tol=None, shuffle=True, verbose=0, epsilon=0.1, random_state=None, learning_rate='invscaling', eta0=0.01, power_t=0.25, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, warm_start=False, average=False, n_iter=None)
    
    • loss :字符串, 默認(rèn): squared_loss,可選項:squared_loss, huber, epsilon_insensitive, or squared_epsilon_insensitive
    • penalty: 字符串,懲罰項: none, l2, l1, or elasticnet
    • alpha : 浮點(diǎn)數(shù),默認(rèn):0.0001用來控制的是對模型正則化的程度。
    • l1_ratio:通過控制這個參數(shù)來調(diào)節(jié)嶺回歸與套索回歸的混合比例 。
    • max_iter: 指定最大迭代次數(shù)。
    • tol:一個浮點(diǎn)數(shù),指定判斷迭代收斂與否的閾值。
    • learning_rate: 字符串, 學(xué)習(xí)率,可選項 constantoptimalinvscalingadaptive
  2. 模型屬性:

    • coef_:權(quán)重向量。
    • intercept_b 值。
    • n_iter_:實際迭代次數(shù)。

    3.模型方法: 參考LinearRegression

Ridge(嶺回歸)
  1. Ridge類實現(xiàn)了嶺回歸模型。其原型為:

    class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)
    
    • alpha: 控制的是對模型正則化的程度。

    • max_iter: 指定最大迭代次數(shù)。

    • tol:一個浮點(diǎn)數(shù),指定判斷迭代收斂與否的閾值。

    • solver:一個字符串,指定求解最優(yōu)化問題的算法。可以為:

      • 'auto':根據(jù)數(shù)據(jù)集自動選擇算法。

      • 'svd':使用奇異值分解來計算回歸系數(shù)。

      • 'cholesky':使用scipy.linalg.solve函數(shù)來求解。

      • 'sparse_cg':使用scipy.sparse.linalg.cg函數(shù)來求解。

      • 'lsqr':使用scipy.sparse.linalg.lsqr函數(shù)求解。

        它運(yùn)算速度最快,但是可能老版本的scipy不支持。

      • 'sag':使用Stochastic Average Gradient descent算法求解最優(yōu)化問題。

    • random_state:用于設(shè)定隨機(jī)數(shù)生成器,它在solver=sag時使用。

    • 其它參數(shù)參考LinearRegression

  2. 模型屬性:

    • coef_:權(quán)重向量。
    • intercept_b 值。
    • n_iter_:實際迭代次數(shù)。
  3. 模型方法: 參考LinearRegression

Lasso(套索回歸)
  1. Lasso類實現(xiàn)了Lasso回歸模型。其原型為:

    lass sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False,precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')
    
    • alpha: 控制的是對模型正則化的程度。
    • precompute:一個布爾值或者一個序列。是否提前計算Gram矩陣來加速計算。
    • warm_start:是否從頭開始訓(xùn)練。
    • positive:一個布爾值。如果為True,那么強(qiáng)制要求權(quán)重向量的分量都為正數(shù)。
    • selection:一個字符串,可以為'cyclic'或者'random'。它指定了當(dāng)每輪迭代的時候,選擇權(quán)重向量的哪個分量來更新。
      • 'random':更新的時候,隨機(jī)選擇權(quán)重向量的一個分量來更新
      • 'cyclic':更新的時候,從前向后依次選擇權(quán)重向量的一個分量來更新
    • 其它參數(shù)參考Ridge
  2. 模型屬性:參考Ridge

  3. 模型方法: 參考LinearRegression

ElasticNet(彈性網(wǎng)絡(luò))
  1. ElasticNet類實現(xiàn)了ElasticNet回歸模型。其原型為:

    class sklearn.linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5, fit_intercept=True,normalize=False, precompute=False, max_iter=1000, copy_X=True, tol=0.0001,warm_start=False, positive=False, random_state=None, selection='cyclic')
    
    • alpha: 控制的是對模型正則化的程度。
    • l1_ratio:通過控制這個參數(shù)來調(diào)節(jié)嶺回歸與套索回歸的混合比例 。
    • 其它參數(shù)參考 Lasso
  2. 模型屬性:參考 Lasso

  3. 模型方法:參考 Lasso

參考資料:
《吳恩達(dá)機(jī)器學(xué)習(xí)》《sklearn官方文檔》《AI算法工程師手冊》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容