Scikit Learn - 隨機梯度下降



在這裡,我們將學習 Sklearn 中的一種最佳化演算法,稱為隨機梯度下降 (SGD)。

隨機梯度下降 (SGD) 是一種簡單而高效的最佳化演算法,用於查詢函式引數/係數的值,以最小化成本函式。換句話說,它用於在凸損失函式(如 SVM 和邏輯迴歸)下進行線性分類器的判別式學習。它已成功應用於大型資料集,因為對係數的更新是針對每個訓練例項進行的,而不是在例項結束時進行的。

SGD 分類器

隨機梯度下降 (SGD) 分類器基本上實現了一個簡單的 SGD 學習程式,支援各種用於分類的損失函式和懲罰。Scikit-learn 提供了 **SGDClassifier** 模組來實現 SGD 分類。

引數

下表包含 **SGDClassifier** 模組使用的引數:

序號 引數及描述
1

**loss** − str,預設值 = ‘hinge’

它表示實現時要使用的損失函式。預設值為“hinge”,這將為我們提供線性 SVM。其他可選引數包括:

  • **log** − 此損失將為我們提供邏輯迴歸,即機率分類器。

  • **modified_huber** − 一種平滑損失,它對異常值具有容忍度,並提供機率估計。

  • **squared_hinge** − 與“hinge”損失類似,但它進行了二次懲罰。

  • **perceptron** −顧名思義,它是由感知器演算法使用的線性損失。

2

**penalty** − str,'none','l2','l1','elasticnet'

它是模型中使用的正則化項。預設情況下,它是 L2。我們也可以使用 L1 或“elasticnet”,但兩者都可能使模型稀疏,因此 L2 無法實現。

3

**alpha** − float,預設值 = 0.0001

Alpha,即乘以正則化項的常數,是決定我們想要對模型進行多少懲罰的調整引數。預設值為 0.0001。

4

**l1_ratio** − float,預設值 = 0.15

這稱為 ElasticNet 混合引數。其範圍是 0 < = l1_ratio < = 1。如果 l1_ratio = 1,則懲罰將是 L1 懲罰。如果 l1_ratio = 0,則懲罰將是 L2 懲罰。

5

**fit_intercept** − 布林值,預設值 = True

此引數指定是否應將常數(偏差或截距)新增到決策函式中。如果將其設定為 false,則計算中將不使用截距,並且假設資料已居中。

6

**tol** − float 或 none,可選,預設值 = 1.e-3

此引數表示迭代的停止條件。其預設值為 False,但如果設定為 None,則當連續 n_iter_no_change 個 epoch 的 𝑙𝑜𝑠𝑠 > 𝑏𝑒𝑠𝑡_𝑙𝑜𝑠𝑠 − 𝑡𝑜𝑙 時,迭代將停止。

7

**shuffle** − 布林值,可選,預設值 = True

此引數表示我們是否希望在每個 epoch 後洗牌我們的訓練資料。

8

**verbose** − 整數,預設值 = 0

它表示詳細程度。其預設值為 0。

9

**epsilon** − float,預設值 = 0.1

此引數指定不敏感區域的寬度。如果 loss = 'epsilon-insensitive',則當前預測與正確標籤之間的任何差異小於閾值都將被忽略。

10

**max_iter** − int,可選,預設值 = 1000

顧名思義,它表示對 epoch(即訓練資料)的最大迭代次數。

11

**warm_start** − bool,可選,預設值 = false

將此引數設定為 True,我們可以重用先前對 fit 的呼叫的解決方案作為初始化。如果我們選擇預設值 false,它將清除之前的解決方案。

12

**random_state** − int,RandomState 例項或 None,可選,預設值 = none

此引數表示在洗牌資料時使用的偽隨機數生成的種子。選項如下:

  • **int** − 在這種情況下,**random_state** 是隨機數生成器使用的種子。

  • **RandomState 例項** − 在這種情況下,**random_state** 是隨機數生成器。

  • **None** − 在這種情況下,隨機數生成器是 np.random 使用的 RandonState 例項。

13

**n_jobs** − int 或 none,可選,預設值 = None

它表示在多類問題中 OVA(一對多)計算中要使用的 CPU 數量。預設值為 none,這意味著 1。

14

**learning_rate** − string,可選,預設值 = ‘optimal’

  • 如果學習率為“constant”,eta = eta0;

  • 如果學習率為“optimal”,eta = 1.0/(alpha*(t+t0)),其中 t0 由 Leon Bottou 選擇;

  • 如果學習率 = 'invscalling',eta = eta0/pow(t, power_t)。

  • 如果學習率 = 'adaptive',eta = eta0。

15

**eta0** − double,預設值 = 0.0

它表示上述學習率選項(即“constant”、“invscalling”或“adaptive”)的初始學習率。

16

**power_t** − idouble,預設值 =0.5

它是“incscalling”學習率的指數。

17

**early_stopping** − bool,預設值 = False

此引數表示使用提前停止,當驗證分數沒有提高時終止訓練。其預設值為 false,但當設定為 true 時,它會自動將訓練資料的分層部分作為驗證集,並在驗證分數沒有提高時停止訓練。

18

**validation_fraction** − float,預設值 = 0.1

僅當 early_stopping 為 true 時才使用。它表示要作為驗證集留出的訓練資料的比例,用於提前終止訓練資料。

19

**n_iter_no_change** − int,預設值 = 5

它表示在提前停止之前演算法應該執行的沒有改進的迭代次數。

20

**class_weight** − dict,{class_label: weight} 或“balanced”,或 None,可選

此引數表示與類相關的權重。如果未提供,則假設類權重為 1。

20

**warm_start** − bool,可選,預設值 = false

將此引數設定為 True,我們可以重用先前對 fit 的呼叫的解決方案作為初始化。如果我們選擇預設值 false,它將清除之前的解決方案。

21

**average** − iBoolean 或 int,可選,預設值 = false

它表示在多類問題中 OVA(一對多)計算中要使用的 CPU 數量。預設值為 none,這意味著 1。

屬性

下表包含 **SGDClassifier** 模組使用的屬性:

序號 屬性及描述
1

**coef_** − array,形狀為 (1, n_features) 如果 n_classes==2,否則為 (n_classes, n_features)

此屬性提供分配給特徵的權重。

2

**intercept_** − array,形狀為 (1,) 如果 n_classes==2,否則為 (n_classes,)

它表示決策函式中的獨立項。

3

**n_iter_** − int

它給出達到停止條件的迭代次數。

實現示例

與其他分類器一樣,隨機梯度下降 (SGD) 必須使用以下兩個陣列擬合:

  • 包含訓練樣本的陣列 X。其大小為 [n_samples, n_features]。

  • 包含目標值(即訓練樣本的類標籤)的陣列 Y。其大小為 [n_samples]。

示例

以下 Python 指令碼使用 SGDClassifier 線性模型:

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
SGDClf = linear_model.SGDClassifier(max_iter = 1000, tol=1e-3,penalty = "elasticnet")
SGDClf.fit(X, Y)

輸出

SGDClassifier(
   alpha = 0.0001, average = False, class_weight = None,
   early_stopping = False, epsilon = 0.1, eta0 = 0.0, fit_intercept = True,
   l1_ratio = 0.15, learning_rate = 'optimal', loss = 'hinge', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, n_jobs = None, penalty = 'elasticnet',
   power_t = 0.5, random_state = None, shuffle = True, tol = 0.001,
   validation_fraction = 0.1, verbose = 0, warm_start = False
)

示例

現在,擬合後,模型可以預測新值,如下所示:

SGDClf.predict([[2.,2.]])

輸出

array([2])

示例

對於上述示例,我們可以使用以下 Python 指令碼獲取權重向量:

SGDClf.coef_

輸出

array([[19.54811198, 9.77200712]])

示例

同樣,我們可以使用以下 Python 指令碼獲取截距的值:

SGDClf.intercept_

輸出

array([10.])

示例

我們可以使用 **SGDClassifier.decision_function** 獲取到超平面的有符號距離,如以下 Python 指令碼所示:

SGDClf.decision_function([[2., 2.]])

輸出

array([68.6402382])

SGD 迴歸器

隨機梯度下降 (SGD) 迴歸器基本上實現了一個簡單的 SGD 學習程式,支援各種損失函式和懲罰,以擬合線性迴歸模型。Scikit-learn 提供了 **SGDRegressor** 模組來實現 SGD 迴歸。

引數

**SGDRegressor** 使用的引數幾乎與 SGDClassifier 模組中使用的引數相同。區別在於“loss”引數。對於 **SGDRegressor** 模組的 loss 引數,正值如下:

  • **squared_loss** − 它指的是普通最小二乘擬合。

  • **huber: SGDRegressor** − 透過在超過 epsilon 距離後從平方損失切換到線性損失來校正異常值。“huber” 的作用是修改“squared_loss”,以便演算法更少地關注校正異常值。

  • **epsilon_insensitive** − 實際上,它忽略小於 epsilon 的誤差。

  • **squared_epsilon_insensitive** − 它與 epsilon_insensitive 相同。唯一的區別是它在超過 epsilon 的容差後變成平方損失。

另一個區別是名為“power_t”的引數的預設值為 0.25,而不是 **SGDClassifier** 中的 0.5。此外,它沒有“class_weight”和“n_jobs”引數。

屬性

SGDRegressor 的屬性也與 SGDClassifier 模組的屬性相同。相反,它還有三個額外的屬性,如下所示:

  • **average_coef_** − array,形狀為 (n_features,)

顧名思義,它提供了分配給特徵的平均權重。

  • **average_intercept_** − array,形狀為 (1,)

顧名思義,它提供了平均截距項。

  • **t_** − int

它提供了在訓練階段執行的權重更新次數。

**注意** − 啟用引數“average”為 True 後,屬性 average_coef_ 和 average_intercept_ 才能工作。

實現示例

以下 Python 指令碼使用 **SGDRegressor** 線性模型:

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)
SGDReg =linear_model.SGDRegressor(
   max_iter = 1000,penalty = "elasticnet",loss = 'huber',tol = 1e-3, average = True
)
SGDReg.fit(X, y)

輸出

SGDRegressor(
   alpha = 0.0001, average = True, early_stopping = False, epsilon = 0.1,
   eta0 = 0.01, fit_intercept = True, l1_ratio = 0.15,
   learning_rate = 'invscaling', loss = 'huber', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, penalty = 'elasticnet', power_t = 0.25,
   random_state = None, shuffle = True, tol = 0.001, validation_fraction = 0.1,
   verbose = 0, warm_start = False
)

示例

現在,擬合後,我們可以使用以下 Python 指令碼獲取權重向量:

SGDReg.coef_

輸出

array([-0.00423314, 0.00362922, -0.00380136, 0.00585455, 0.00396787])

示例

同樣,我們可以使用以下 Python 指令碼獲取截距的值:

SGReg.intercept_

輸出

SGReg.intercept_

示例

我們可以使用以下 Python 指令碼獲取訓練階段的權重更新次數:

SGDReg.t_

輸出

61.0

SGD 的優缺點

以下是 SGD 的優點:

  • 隨機梯度下降 (SGD) 非常高效。

  • 它非常易於實現,因為有很多程式碼調整的機會。

以下是 SGD 的缺點:

  • 隨機梯度下降 (SGD) 需要多個超引數,例如正則化引數。

  • 它對特徵縮放敏感。

廣告
© . All rights reserved.