天天看點

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

基礎回歸模型包括:

1.Linear Regression(線性回歸)及其高階版[Ridge Regression(嶺回歸)和Lasso回歸]

2.Logistic Regression(邏輯回歸)

3.Softmax Regression

其中後兩個在神經網絡中也經常用到

已知x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]

y= [95.364, 97.217205, 75.195834, 60.105519, 49.342380]

任務:建立模型預測當xi=[2,3,4]時yi的值

Model1: 線性模型

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

,在這裡有三個特征,故n=2,下面的任務是求這個θ。

那麼限制條件是什麼呢?沒錯,就是h(x)和y的內插補點要盡可能的小,用數學語言表達就是損失函數

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

取極小值。

是以θ的更新公式為

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

把J(θ)、h(x)代入化簡可以得到

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

這裡面α為學習率

不斷循環更新θ直到不變(用數學語言為J i+1-Ji<0.00001)時退出。

循環逼近求解θ的方法包括兩種: Batch gradient decent(批量梯度下降)

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

上面樣本數m=5,j為每個特征.如果你感覺不好了解,可以結合下面程式

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

和Stochastic gradient decent(随機梯度下降)

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸
機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

相信通過對比,你已經清楚了,批量梯度下降是所有樣本用完後才更新一次權重,而随機梯度下降是對于每個樣本用完後都更新一次權重.

批量梯度下降的優勢是可以找到全局最優解,但是速度慢;而随機梯度下降容易陷入局部最優解,但是速度快。樣本量小兩個差別不明顯,樣本量大時可能用很少一部分資料就找到θ的穩定值。

矩陣精确求解

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

如果X超級大,這樣求解是很吃記憶體的。

需要注意的一點是上面損失函數采用的是平方損失,這是由于假設樣本是高斯分布。如果樣本偏離高斯分布較大,而是比如伯努利分布,則應該采用邏輯回歸。

Model2:嶺回歸以及Lasso回歸

我們設想一下假如解決線性回歸過程中出現過拟合以及在通過正規方程方法求解θ的過程中出現的x轉置乘以x不可逆這兩類問題,怎麼辦。

為了回答這個問題,我們搬出來監督學習兩大基本政策,經驗風險最小化和結構風險最小化。經驗風險最小化政策為求解最優化問題,線性回歸中的求解損失函數最小化問題即是經驗風險最小化政策。 經驗風險最小化的定義為:

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

結構風險最小化是為了防止過拟合現象而提出的政策。結構風險最小化等價于正則化,在經驗風險上加上表示模型複雜度的正則化項或者稱作罰項。在确定損失函數和訓練集資料的情況下其定義為:

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

上面兩種回歸均通過在損失函數中引入正則化項來達到目的

其中λ稱為正則化參數,如果λ選取過大,會把所有參數θ均最小化,造成欠拟合,如果λ選取過小,會導緻對過拟合問題解決不當,是以λ的選取是一個技術活。

嶺回歸與Lasso回歸的差別在于嶺回歸引入的是L2範數懲罰項,Lasso回歸引入的是L1範數懲罰項.

L2範數:向量各個元素的平方求和然後求平方根,在這裡我們一般為了友善,不再取開平方根

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

L1範數:向量各個元素絕對值之和,在這裡

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

為什麼L2正則化可以獲得θ值很小的參數,避免過拟合呢?

機器學習1基礎回歸模型之線性回歸,嶺回歸和Lasso回歸

Lasso回歸能夠使得損失函數中的許多θ均變成0,這點要優于嶺回歸,因為嶺回歸是要所有的θ均存在的,這樣計算量Lasso回歸将遠遠小于嶺回歸。

在python中,我們可以友善地利用sklearn包

from sklearn import linear_model

線性模型: linearRegression = linear_model.LinearRegression()

linearRegression.fit(X_train, y_train)

嶺回歸:ridgeRegression = linear_model.Ridge()

ridgeRegression.fit(X_train, y_train)

Lasso回歸:lassoRegression = linear_model.Lasso()

lassoRegression.fit(X_train, y_train)**

*小白求大神指點*