- Scikit Learn 教程
- Scikit Learn - 首頁
- Scikit Learn - 簡介
- Scikit Learn - 建模過程
- Scikit Learn - 資料表示
- Scikit Learn - 估計器 API
- Scikit Learn - 約定
- Scikit Learn - 線性建模
- Scikit Learn - 擴充套件線性建模
- 隨機梯度下降
- Scikit Learn - 支援向量機
- Scikit Learn - 異常檢測
- Scikit Learn - K 近鄰演算法
- Scikit Learn - KNN 學習
- 樸素貝葉斯分類
- Scikit Learn - 決策樹
- 隨機決策樹
- Scikit Learn - 整合方法
- Scikit Learn - 聚類方法
- 聚類效能評估
- 使用 PCA 的降維
- Scikit Learn 有用資源
- Scikit Learn - 快速指南
- Scikit Learn - 有用資源
- Scikit Learn - 討論
Scikit Learn - 隨機梯度下降
在這裡,我們將學習 Sklearn 中的一種最佳化演算法,稱為隨機梯度下降 (SGD)。
隨機梯度下降 (SGD) 是一種簡單而高效的最佳化演算法,用於查詢函式引數/係數的值,以最小化成本函式。換句話說,它用於在凸損失函式(如 SVM 和邏輯迴歸)下進行線性分類器的判別式學習。它已成功應用於大型資料集,因為對係數的更新是針對每個訓練例項進行的,而不是在例項結束時進行的。
SGD 分類器
隨機梯度下降 (SGD) 分類器基本上實現了一個簡單的 SGD 學習程式,支援各種用於分類的損失函式和懲罰。Scikit-learn 提供了 **SGDClassifier** 模組來實現 SGD 分類。
引數
下表包含 **SGDClassifier** 模組使用的引數:
| 序號 | 引數及描述 |
|---|---|
| 1 |
**loss** − str,預設值 = ‘hinge’ 它表示實現時要使用的損失函式。預設值為“hinge”,這將為我們提供線性 SVM。其他可選引數包括:
|
| 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 此引數表示在洗牌資料時使用的偽隨機數生成的種子。選項如下:
|
| 13 |
**n_jobs** − int 或 none,可選,預設值 = None 它表示在多類問題中 OVA(一對多)計算中要使用的 CPU 數量。預設值為 none,這意味著 1。 |
| 14 |
**learning_rate** − string,可選,預設值 = ‘optimal’
|
| 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) 需要多個超引數,例如正則化引數。
它對特徵縮放敏感。