1. 程式人生 > 其它 >spring Cloud 定時任務

spring Cloud 定時任務

技術標籤:機器學習機器學習演算法python人工智慧

@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. 找到山的最低點,也就是山谷)。但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的資訊去找到下山的路徑。這個時候,他就可以利用梯度下降演算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基準,尋找這個位置最陡峭的地方,然後朝著山的高度下降的地方走,(同理,如果我們的目標是上山,也就是爬到山頂,那麼此時應該是朝著最陡峭的方向往上走)。然後每走一段距離,都反覆採用同一個方法,最後就能成功的抵達山谷。

梯度下降的基本過程就和下山的場景很類似。

首先,我們有一個可微分的函式。這個函式就代表著一座山。

我們的目標就是找到這個函式的最小值,也就是山底。

根據之前的場景假設,最快的下山的方式就是找到當前位置最陡峭的方向,然後沿著此方向向下走,對應到函式中,就是找到給定點的梯度 ,然後朝著梯度相反的方向,就能讓函式值下降的最快!因為梯度的方向就是函式之變化最快的方向。 所以,我們重複利用這個方法,反覆求取梯度,最後就能到達區域性的最小值,這就類似於我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。

梯度的概念

梯度是微積分中一個很重要的概念

在單變數的函式中,梯度其實就是函式的微分,代表著函式在某個給定點的切線的斜率

在多變數函式中,梯度是一個向量,向量有方向,梯度的方向就指出了函式在給定點的上升最快的方向

這也就說明了為什麼我們需要千方百計的求取梯度!我們需要到達山底,就需要在每一步觀測到此時最陡峭的地方,梯度就恰巧告訴了我們這個方向。梯度的方向是函式在給定點上升最快的方向,那麼梯度的反方向就是函式在給定點下降最快的方向,這正是我們所需要的。所以我們只要沿著梯度的反方向一直走,就能走到區域性的最低點!

梯度下降公式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-wrYJ6RuS-1583244411306)(../images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

  • α是什麼含義?

    α在梯度下降演算法中被稱作為學習率或者步長,意味著我們可以通過α來控制每一步走的距離,以保證不要步子跨的太大扯著蛋,哈哈,其實就是不要走太快,錯過了最低點。同時也要保證不要走的太慢,導致太陽下山了,還沒有走到山下。所以α的選擇在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的話,可能導致遲遲走不到最低點,太大的話,會導致錯過最低點!

  • 為什麼梯度要乘以一個負號

    梯度前加一個負號,就意味著朝著梯度相反的方向前進!我們在前文提到,梯度的方向實際就是函式在此點上升最快的方向!而我們需要朝著下降最快的方向走,自然就是負的梯度的方向,所以此處需要加上負號

線性迴歸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

  1. GD

    梯度下降(Gradient Descent),原始的梯度下降法需要計算所有樣本的值才能夠得出梯度,計算量大,所以後面才有會一系列的改進。

  2. SGD

    隨機梯度下降(Stochastic gradient descent)是一個優化方法。它在一次選代時只考慮一個訓練樣本。

    • SGD的優點是:
      • 高效
      • 容易實現
    • SGD的缺點是:
      • CSGD需要許多超引數:比如正則項引數、選代數。
      • SGD對於特徵標準化是敏感的。
  3. SAG
    隨機平均梯度法(Stochasitc Average Gradient),由於收斂的速度太慢,有人提出SAG等基於梯度下降的演算法
    Scikit-learn:嶺迴歸、邏輯迴歸等當中都會有SAG優化