spring Cloud 定時任務
@top
線性迴歸的原理
線性迴歸應用場景
- 房價預測
- 銷售額度預測
- 金融:貸款額度預測、利用線性迴歸以及係數分析因子
什麼是線性迴歸
定義與公式
線性迴歸(Linear regression)是利用迴歸方程(函式)對一個或多個自變數(特徵值)和因變數(目標值)之間關係進行建模的一種分析方式。
特點:只有一個自變數的情況稱為單變量回歸,多於一個自變數情況的叫做多元迴歸
通用公式:h(w)=W1X1+W2X2+W3X3…+b=wTx+b
那麼怎麼理解呢?我們來看幾個例子
期末成績:0.7x考試成績+0.3x平時成績
上面兩個例子,我們看到特徵值與目標值之間建立了一個關係,這個關係可以理解為線性模型。
線性迴歸的特徵與目標的關係分析
線性迴歸當中線性模型有兩種,一種是線性關係,另一種是非線性關係。
- 廣義的線性模型
- 自變數一次
- 引數一次
線性迴歸的損失和優化原理
損失函式
我們要做的是依據我們的訓練集,選取最優的θ,在我們的訓練集中讓h(x)儘可能接近真實的值。h(x)和真實的值之間的差距,我們定義了一個函式來描述這個差距,這個函式稱為損失函式,表示式如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-66X7rJyC-1608563403866)(C:\Users\ASUS\Desktop\損失函式png.png)]
這裡的這個損失函式就是著名的最小二乘損失函式
如何去減少這個損失,使我們預測的更加準確些?既然存在了這個損失,我們一直說機器學習有自動學習的功能,線上性迴歸這裡更是能夠體現。這裡可以通過一些優化方法去優化(其實是數學當中的求導功能)迴歸的總損失!!!
優化演算法
如何去求模型當中的W,使得損失最小?(目的是找到最小損失對應的W值)
線性迴歸經常使用的兩種優化演算法
正規方程
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6AAaF0Zd-1608563403868)(C:\Users\ASUS\Desktop\正規方程.png)]
- 理解:X為特徵值矩陣,y為目標值矩陣。直接求到最好的結果
- 缺點:當特徵過多過複雜時,求解速度太慢並且得不到結果
梯度下降(Gradient Descent)
什麼是梯度下降
梯度下降法的基本思想可以類比為一個下山的過程。
假設這樣一個場景:一個人被困在山上,需要從山上下來(i.e. 找到山的最低點,也就是山谷)。但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的資訊去找到下山的路徑。這個時候,他就可以利用梯度下降演算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基準,尋找這個位置最陡峭的地方,然後朝著山的高度下降的地方走,(同理,如果我們的目標是上山,也就是爬到山頂,那麼此時應該是朝著最陡峭的方向往上走)。然後每走一段距離,都反覆採用同一個方法,最後就能成功的抵達山谷。
梯度下降的基本過程就和下山的場景很類似。
首先,我們有一個可微分的函式。這個函式就代表著一座山。
我們的目標就是找到這個函式的最小值,也就是山底。
根據之前的場景假設,最快的下山的方式就是找到當前位置最陡峭的方向,然後沿著此方向向下走,對應到函式中,就是找到給定點的梯度 ,然後朝著梯度相反的方向,就能讓函式值下降的最快!因為梯度的方向就是函式之變化最快的方向。 所以,我們重複利用這個方法,反覆求取梯度,最後就能到達區域性的最小值,這就類似於我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。
梯度的概念
梯度是微積分中一個很重要的概念
在單變數的函式中,梯度其實就是函式的微分,代表著函式在某個給定點的切線的斜率
在多變數函式中,梯度是一個向量,向量有方向,梯度的方向就指出了函式在給定點的上升最快的方向
這也就說明了為什麼我們需要千方百計的求取梯度!我們需要到達山底,就需要在每一步觀測到此時最陡峭的地方,梯度就恰巧告訴了我們這個方向。梯度的方向是函式在給定點上升最快的方向,那麼梯度的反方向就是函式在給定點下降最快的方向,這正是我們所需要的。所以我們只要沿著梯度的反方向一直走,就能走到區域性的最低點!
梯度下降公式
-
α是什麼含義?
α在梯度下降演算法中被稱作為學習率或者步長,意味著我們可以通過α來控制每一步走的距離,以保證不要步子跨的太大扯著蛋,哈哈,其實就是不要走太快,錯過了最低點。同時也要保證不要走的太慢,導致太陽下山了,還沒有走到山下。所以α的選擇在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的話,可能導致遲遲走不到最低點,太大的話,會導致錯過最低點!
-
為什麼梯度要乘以一個負號?
梯度前加一個負號,就意味著朝著梯度相反的方向前進!我們在前文提到,梯度的方向實際就是函式在此點上升最快的方向!而我們需要朝著下降最快的方向走,自然就是負的梯度的方向,所以此處需要加上負號
線性迴歸API
sklearn.linear_model.LinearRegression(fit_intercept=True)
- 通過正規方程優化
fit_intercept
:是否計算偏置LinearRegression.coef_
:迴歸係數LinearRegression.intercept_
:偏置
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
SGDRegressor
類實現了隨機梯度下降學習,它支援不同的loss函式和正則化懲罰項來擬合線性迴歸模型。loss
:損失型別loss="squared_loss"
: 普通最小二乘法
fit_intercept
:是否計算偏置learning_rate:string, optional
- 學習率填充
'constant': eta = eta0
'optimal':eta = 1.0/ (alpha *(t + t0)) [default]
'invscaling': eta = eta0 / pow(t, power_t)
power_t=0.25:
存在父類當中
- 對於一個常數值的學習率來說,可以使用learning_rate='constant’並使用eta0來指定學習率。
SGDRegressor.coef_
_:迴歸係數SGDRegressor.intercept_
: 偏置
sklearn提供給我們兩種實現的API. 可以根據選擇使用
波士頓房價預測
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
def linear1():
"""
正規方程的優化方法對波士頓房價進行預測
:return:
"""
# 獲取資料
boston = load_boston()
# 劃分資料
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test) # 控制變數, 用同樣的引數進行標準化
# 預估器
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 得出模型
print('正規方程——權重係數為:\n', estimator.coef_)
print('正規方程——偏重為:\n', estimator.intercept_)
def linear2():
"""
梯度下降的優化方法對波士頓房價進行預測
:return:
"""
# 獲取資料
boston = load_boston()
# 劃分資料
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test) # 控制變數, 用同樣的引數進行標準化
# 預估器
estimator = SGDRegressor()
estimator.fit(x_train, y_train)
# 得出模型
print('梯度下降——權重係數為:\n', estimator.coef_)
print('梯度下降——偏重為:\n', estimator.intercept_)
if __name__ == '__main__':
linear1()
linear2()
迴歸的效能評估
分析
迴歸當中的資料大小不一致,是否會導致結果影響較大,所以需要做標準化處理。
- 資料分割與標準化處理
- 迴歸預測
- 線性迴歸的演算法效果評估
迴歸效能評估
均方誤差(Mean Squared Error)MSE)評價機制:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-e2O2JrpN-1608563403869)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201221225400355.png)]
注:y^i為預測值,y為真實值
sklearn.metrics.mean_squared_error(y_true, y_pred)
- 均方誤差迴歸損失
y_true
:真實值y_pred
:預測值return:
浮點數結果
程式碼
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_squared_error
def linear1():
"""
正規方程的優化方法對波士頓房價進行預測
:return:
"""
# 獲取資料
boston = load_boston()
# 劃分資料
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test) # 控制變數, 用同樣的引數進行標準化
# 預估器
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 得出模型
print('正規方程——權重係數為:\n', estimator.coef_)
print('正規方程——偏重為:\n', estimator.intercept_)
# 模型評估
y_predict = estimator.predict(x_test)
print('預測房價:\n', y_predict)
error = mean_squared_error(y_test, y_predict)
print('正規方程——均方誤差為:\n', error)
def linear2():
"""
梯度下降的優化方法對波士頓房價進行預測
:return:
"""
# 獲取資料
boston = load_boston()
# 劃分資料
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test) # 控制變數, 用同樣的引數進行標準化
# 預估器
estimator = SGDRegressor()
estimator.fit(x_train, y_train)
# 得出模型
print('梯度下降——權重係數為:\n', estimator.coef_)
print('梯度下降——偏重為:\n', estimator.intercept_)
# 模型評估
y_predict = estimator.predict(x_test)
print('預測房價:\n', y_predict)
error = mean_squared_error(y_test, y_predict)
print('梯度下降——均方誤差為:\n', error)
if __name__ == '__main__':
linear1()
linear2()
梯度下降和正規方程的對比
梯度下降 | 正規方程 |
---|---|
需要選擇學習率 | 不需要 |
需要迭代求解 | 一次運算得出 |
特徵數量較大可以使用 | 需要計算方程,時間複雜度高O(n3) |
- 選擇:
- 小規模資料:
- LinearRegression(不能解決擬合問題)
- 嶺迴歸
- 大規模資料:
SGDRegressor
- 小規模資料:
拓展-關於優化方法GD、SGD、SAG
-
GD
梯度下降(Gradient Descent),原始的梯度下降法需要計算所有樣本的值才能夠得出梯度,計算量大,所以後面才有會一系列的改進。
-
SGD
隨機梯度下降(Stochastic gradient descent)是一個優化方法。它在一次選代時只考慮一個訓練樣本。
- SGD的優點是:
- 高效
- 容易實現
- SGD的缺點是:
- CSGD需要許多超引數:比如正則項引數、選代數。
- SGD對於特徵標準化是敏感的。
- SGD的優點是:
-
SAG
隨機平均梯度法(Stochasitc Average Gradient),由於收斂的速度太慢,有人提出SAG等基於梯度下降的演算法
Scikit-learn:嶺迴歸、邏輯迴歸等當中都會有SAG優化