回歸算法
線性回歸
線性回歸的定義是:目標(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)記如下:
代表訓(xùn)練集中實例的數(shù)量
代表特征/輸入變量
代表目標(biāo)變量/輸出變量
代表訓(xùn)練集中的實例
代表第
個觀察實例
代表學(xué)習(xí)算法的解決方案或函數(shù)也稱為假設(shè)(hypothesis)
例如:房價例子中房子的大小預(yù)測房子的價格。,其中x表示房子的大小,選擇合適的參數(shù)(parameters)
和
,在房價問題這個例子中便是直線的斜率和在
軸上的截距。
通用公式為:
那么我們可以通過向量的方式來表示就值與特征X值之間的關(guān)系:
兩向量相乘,結(jié)果為一個整數(shù)是估計值,其中所有特征集合的第一個特征值x0=1,那么我們可以通過通用的向量公式來表示線性模型:
一個列向量的轉(zhuǎn)置與特征的乘積,得出我們預(yù)測的結(jié)果,但是顯然我們這個模型得到的結(jié)果可定會有誤差,如下圖所示:
我們選擇的參數(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(θ) 誤差最小,可以采用一下兩種方法:一種使正規(guī)方程解法(只適用于簡單的線性回歸),另一種使用梯度下降算法。
正規(guī)方程
求解:
X為特征值矩陣,y為目標(biāo)值矩陣
缺點(diǎn):當(dāng)特征過于復(fù)雜,求解速度太慢
? 對于復(fù)雜的算法,不能使用正規(guī)方程求解(邏輯回歸等)
梯度下降算法
假設(shè)線性函數(shù)形式:
損失函數(shù)(又稱代價函數(shù)或成本函數(shù)):
梯度下降是一個用來求函數(shù)最小值的算法,將使用梯度下降算法來求出損失函數(shù) 的最小值。
梯度下降思想:開始時我們隨機(jī)選擇一個參數(shù)的組合,計算損失函數(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)的位置。
批量梯度下降(batch gradient descent)算法的公式為:
其中是學(xué)習(xí)率(learning rate),它決定了我們沿著能讓代價函數(shù)下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數(shù)減去學(xué)習(xí)速率乘以代價函數(shù)的導(dǎo)數(shù)。
接下來,對之前的線性回歸問題運(yùn)用批量梯度下降算法,關(guān)鍵在于求出代價函數(shù)的導(dǎo)數(shù),即:
時:
時:
則算法改寫成:
Repeat {
?
?
? }
當(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ù):
表示訓(xùn)練集中實例的數(shù)量。
表示用來控制的是對模型正則化的程度。
表示通過控制
來調(diào)節(jié)嶺回歸與套索回歸的混合比例。
嶺(Ridge)回歸的損失函數(shù):
套索(Lasso)回歸的損失函數(shù):
彈性網(wǎng)絡(luò)(Elastic Net)的損失函數(shù):
LinearRegression
-
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ù),指定計算并行度。
-
-
模型屬性:
-
coef_
:權(quán)重向量。 -
intercept_
:值。
-
-
模型方法:
-
fit(X,y[,sample_weight])
:訓(xùn)練模型。 -
predict(X)
:用模型進(jìn)行預(yù)測,返回預(yù)測值。 -
score(X,y[,sample_weight])
:返回模型的預(yù)測性能得分。
-
SGDRegressor
-
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
, orsquared_epsilon_insensitive
-
penalty
: 字符串,懲罰項:none
,l2
,l1
, orelasticnet
-
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í)率,可選項constant
,optimal
,invscaling
,adaptive
-
-
模型屬性:
-
coef_
:權(quán)重向量。 -
intercept_
:值。
-
n_iter_
:實際迭代次數(shù)。
3.模型方法: 參考
LinearRegression
-
Ridge(嶺回歸)
-
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
。
-
模型屬性:
-
coef_
:權(quán)重向量。 -
intercept_
:值。
-
n_iter_
:實際迭代次數(shù)。
-
模型方法: 參考
LinearRegression
。
Lasso(套索回歸)
-
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
。
-
模型屬性:參考
Ridge
。模型方法: 參考
LinearRegression
。
ElasticNet(彈性網(wǎng)絡(luò))
-
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
。
-
模型屬性:參考
Lasso
。模型方法:參考
Lasso
。
參考資料:
《吳恩達(dá)機(jī)器學(xué)習(xí)》《sklearn官方文檔》《AI算法工程師手冊》