SGDClassifier#
- class sklearn.linear_model.SGDClassifier(loss='hinge', *, penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal', eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, warm_start=False, average=False)[source]#
使用 SGD 訓練的線性分類器(SVM、邏輯迴歸等)。
這個估計器使用隨機梯度下降(SGD)學習實現正則化的線性模型:損失的梯度是每次針對一個樣本估算的,並且模型會隨著時間推移以遞減的強度排程(也稱為學習率)進行更新。 SGD 允許通過
partial_fit
方法進行小批量(線上/核外)學習。為了在使用預設學習率排程時獲得最佳結果,數據應具有零均值和單位變異數。此實作適用於表示為特徵的浮點數值的密集或稀疏陣列的數據。它擬合的模型可以透過 loss 參數控制;預設情況下,它擬合線性支援向量機 (SVM)。
正規化器是添加到損失函數的懲罰,它使用平方歐幾里德範數 L2 或絕對範數 L1 或兩者的組合(彈性網絡)將模型參數縮小到零向量。如果參數更新由於正規化器而越過 0.0 值,則更新會被截斷為 0.0,以允許學習稀疏模型並實現線上特徵選擇。
請在 使用者指南 中閱讀更多內容。
- 參數:
- loss{‘hinge’, ‘log_loss’, ‘modified_huber’, ‘squared_hinge’, ‘perceptron’, ‘squared_error’, ‘huber’, ‘epsilon_insensitive’, ‘squared_epsilon_insensitive’}, default=’hinge’
要使用的損失函數。
‘hinge’ 提供線性 SVM。
‘log_loss’ 提供邏輯迴歸,一種機率分類器。
‘modified_huber’ 是另一個平滑損失,它為離群值帶來容差以及機率估計。
‘squared_hinge’ 類似於 hinge,但會受到二次懲罰。
‘perceptron’ 是感知器演算法使用的線性損失。
其他損失函數「squared_error」、「huber」、「epsilon_insensitive」和「squared_epsilon_insensitive」是為迴歸設計的,但在分類中也很有用;請參閱
SGDRegressor
以了解說明。
- penalty{‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’
要使用的懲罰(又稱正規化項)。預設為 ‘l2’,它是線性 SVM 模型的標準正規化器。 ‘l1’ 和 ‘elasticnet’ 可能會為模型帶來 ‘l2’ 無法達到的稀疏性(特徵選擇)。設定為
None
時,不會新增懲罰。您可以在 SGD:懲罰中看到懲罰的可視化。
- alphafloat, default=0.0001
乘以正規化項的常數。值越高,正規化越強。當
learning_rate
設定為 'optimal' 時,也用於計算學習率。值必須在[0.0, inf)
範圍內。- l1_ratiofloat, default=0.15
彈性網路混合參數,其中 0 <= l1_ratio <= 1。l1_ratio=0 對應於 L2 懲罰,l1_ratio=1 對應於 L1。僅當
penalty
為 'elasticnet' 時使用。值必須在[0.0, 1.0]
範圍內。- fit_interceptbool, default=True
是否應該估計截距。如果為 False,則假定數據已居中。
- max_iterint, default=1000
訓練資料的最大遍歷次數(也稱為 epoch)。它只會影響
fit
方法中的行為,而不會影響partial_fit
方法。值必須在[1, inf)
範圍內。於 0.19 版本新增。
- tolfloat 或 None, default=1e-3
停止標準。如果不是 None,當連續
n_iter_no_change
個 epoch 的 (loss > best_loss - tol) 時,訓練將會停止。根據early_stopping
參數,會針對訓練損失或驗證損失檢查收斂。值必須在[0.0, inf)
範圍內。於 0.19 版本新增。
- shufflebool, 預設值=True
是否在每個 epoch 之後打亂訓練資料。
- verboseint, 預設值=0
詳細程度。數值必須在
[0, inf)
範圍內。- epsilonfloat, 預設值=0.1
在 epsilon 不敏感損失函數中的 epsilon 值;僅當
loss
為 'huber'、'epsilon_insensitive' 或 'squared_epsilon_insensitive' 時適用。對於 'huber',它決定了預測達到何種程度就不再需要完全正確的閾值。對於 epsilon 不敏感,如果當前預測與正確標籤之間的差異小於此閾值,則會被忽略。數值必須在[0.0, inf)
範圍內。- n_jobsint, 預設值=None
用於執行 OVA(One Versus All,針對多類別問題)計算的 CPU 數量。
None
表示 1,除非在joblib.parallel_backend
環境中。-1
表示使用所有處理器。請參閱 詞彙表 以取得更多詳細資訊。- random_stateint, RandomState 實例, 預設值=None
當
shuffle
設定為True
時,用於打亂資料。傳遞整數以在多次函式呼叫中產生可重複的輸出。請參閱詞彙表。整數值必須在[0, 2**32 - 1]
範圍內。- learning_ratestr, 預設值='optimal'
學習率排程
‘constant’:
eta = eta0
‘optimal’:
eta = 1.0 / (alpha * (t + t0))
,其中t0
由 Leon Bottou 提出的啟發式方法選擇。‘invscaling’:
eta = eta0 / pow(t, power_t)
‘adaptive’:
eta = eta0
,只要訓練持續減少。每次 n_iter_no_change 個連續的 epochs 無法將訓練損失減少 tol 或無法將驗證分數提高 tol(如果early_stopping
為True
),目前的學習率會除以 5。
在 0.20 版本中新增: 新增 'adaptive' 選項。
- eta0float, 預設值=0.0
‘constant’、‘invscaling’ 或 ‘adaptive’ 排程的初始學習率。預設值為 0.0,因為預設排程 'optimal' 不使用 eta0。數值必須在
[0.0, inf)
範圍內。- power_tfloat, 預設值=0.5
反向縮放學習率的指數。數值必須在
(-inf, inf)
範圍內。- early_stoppingbool, 預設值=False
是否使用提前停止來終止訓練,當驗證分數沒有改進時。如果設定為
True
,它會自動預留一部分分層的訓練資料作為驗證集,並且當score
方法傳回的驗證分數在 n_iter_no_change 個連續的 epochs 中未至少改進 tol 時終止訓練。請參閱 隨機梯度下降的提前停止,以查看提前停止效果的範例。
在 0.20 版本中新增: 新增 'early_stopping' 選項
- validation_fractionfloat, 預設值=0.1
預留作為提前停止驗證集的訓練資料比例。必須介於 0 和 1 之間。僅在
early_stopping
為 True 時使用。數值必須在(0.0, 1.0)
範圍內。在 0.20 版本中新增: 新增 'validation_fraction' 選項
- n_iter_no_changeint, 預設值=5
在停止擬合之前,等待沒有改進的迭代次數。根據
early_stopping
參數,針對訓練損失或驗證損失檢查收斂。整數值必須在[1, max_iter)
範圍內。在 0.20 版本中新增: 新增 'n_iter_no_change' 選項
- class_weightdict, {class_label: weight} 或 “balanced”, 預設值=None
class_weight 擬合參數的預設值。
與類別相關聯的權重。如果未給定,則假設所有類別的權重均為 1。
“balanced” 模式使用 y 的值自動調整權重,權重與輸入資料中類別頻率成反比,如
n_samples / (n_classes * np.bincount(y))
。- warm_startbool, 預設值=False
當設定為 True 時,重複使用先前呼叫 fit 的解決方案作為初始化,否則,只需清除先前的解決方案。請參閱詞彙表。
當 warm_start 為 True 時,重複呼叫 fit 或 partial_fit 可能會導致與單次呼叫 fit 不同的解決方案,因為資料被打亂的方式不同。如果使用動態學習率,則學習率會根據已看到的樣本數進行調整。呼叫
fit
會重置此計數器,而partial_fit
將導致增加現有的計數器。- averagebool 或 int, 預設值=False
當設定為
True
時,會計算所有更新的平均 SGD 權重,並將結果儲存在coef_
屬性中。如果設定為大於 1 的整數,則在看到的樣本總數達到average
時開始平均。因此,average=10
將在看到 10 個樣本後開始平均。整數值必須在[1, n_samples]
範圍內。
- 屬性:
- coef_ndarray,形狀為 (1, n_features) 如果 n_classes == 2,否則為 (n_classes, n_features)
分配給特徵的權重。
- intercept_ndarray,形狀為 (1,) 如果 n_classes == 2,否則為 (n_classes,)
決策函數中的常數。
- n_iter_int
達到停止條件前的實際迭代次數。對於多類別擬合,它是每個二元擬合的最大值。
- classes_array,形狀為 (n_classes,)
- t_int
在訓練期間執行的權重更新次數。與
(n_iter_ * n_samples + 1)
相同。- n_features_in_int
在 fit 期間看到的特徵數量。
在 0.24 版本中新增。
- feature_names_in_ndarray,形狀為 (
n_features_in_
,) 在 fit 期間看到的特徵名稱。僅當
X
具有全部為字串的特徵名稱時定義。在 1.0 版本中新增。
參見
sklearn.svm.LinearSVC
線性支持向量分類。
LogisticRegression
邏輯回歸。
Perceptron
繼承自 SGDClassifier。
Perceptron()
等效於SGDClassifier(loss="perceptron", eta0=1, learning_rate="constant", penalty=None)
。
範例
>>> import numpy as np >>> from sklearn.linear_model import SGDClassifier >>> from sklearn.preprocessing import StandardScaler >>> from sklearn.pipeline import make_pipeline >>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) >>> Y = np.array([1, 1, 2, 2]) >>> # Always scale the input. The most convenient way is to use a pipeline. >>> clf = make_pipeline(StandardScaler(), ... SGDClassifier(max_iter=1000, tol=1e-3)) >>> clf.fit(X, Y) Pipeline(steps=[('standardscaler', StandardScaler()), ('sgdclassifier', SGDClassifier())]) >>> print(clf.predict([[-0.8, -1]])) [1]
- decision_function(X)[來源]#
預測樣本的信賴分數。
樣本的信賴分數與該樣本到超平面的有符號距離成正比。
- 參數:
- X類陣列,稀疏矩陣,形狀為 (n_samples, n_features)
我們想要取得信賴分數的資料矩陣。
- 回傳值:
- scoresndarray,形狀為 (n_samples,) 或 (n_samples, n_classes)
每個
(n_samples, n_classes)
組合的信賴分數。在二元情況下,self.classes_[1]
的信賴分數,其中 >0 表示將預測此類別。
- densify()[來源]#
將係數矩陣轉換為密集陣列格式。
將
coef_
成員(返回)轉換為 numpy.ndarray。這是coef_
的預設格式,並且是擬合所必需的,因此僅在先前已稀疏化的模型上才需要呼叫此方法;否則,它是一個空操作。- 回傳值:
- self
擬合的估計器。
- fit(X, y, coef_init=None, intercept_init=None, sample_weight=None)[原始碼]#
使用隨機梯度下降法擬合線性模型。
- 參數:
- X{類陣列, 稀疏矩陣}, 形狀 (n_samples, n_features)
訓練資料。
- y形狀為 (n_samples,) 的 ndarray
目標值。
- coef_init形狀為 (n_classes, n_features) 的 ndarray, 預設值為 None
用於熱啟動優化的初始係數。
- intercept_init形狀為 (n_classes,) 的 ndarray, 預設值為 None
用於熱啟動優化的初始截距。
- sample_weight類陣列, 形狀為 (n_samples,), 預設值為 None
應用於個別樣本的權重。如果未提供,則假設為均勻權重。如果指定了 class_weight (透過建構子傳遞),這些權重將會與 class_weight 相乘。
- 回傳值:
- self物件
返回自身的實例。
- get_metadata_routing()[原始碼]#
取得此物件的中繼資料路由。
請查看使用者指南,了解路由機制如何運作。
- 回傳值:
- routingMetadataRequest
封裝路由資訊的
MetadataRequest
。
- get_params(deep=True)[原始碼]#
取得此估計器的參數。
- 參數:
- deepbool, 預設值為 True
如果為 True,將返回此估計器和包含的子物件(屬於估計器)的參數。
- 回傳值:
- paramsdict
參數名稱對應到其值的字典。
- partial_fit(X, y, classes=None, sample_weight=None)[原始碼]#
對給定樣本執行一次隨機梯度下降的迭代。
在內部,此方法使用
max_iter = 1
。因此,不保證在呼叫一次後會達到成本函數的最小值。目標收斂、提前停止和學習率調整等事項應由使用者處理。- 參數:
- X{類陣列, 稀疏矩陣}, 形狀 (n_samples, n_features)
訓練資料的子集。
- y形狀為 (n_samples,) 的 ndarray
目標值的子集。
- classes形狀為 (n_classes,) 的 ndarray, 預設值為 None
跨所有 partial_fit 呼叫的類別。可以透過
np.unique(y_all)
取得,其中 y_all 是整個資料集的目標向量。此引數是第一次呼叫 partial_fit 所必需的,並且可以在後續呼叫中省略。請注意,y 不需要包含classes
中的所有標籤。- sample_weight類陣列, 形狀為 (n_samples,), 預設值為 None
應用於個別樣本的權重。如果未提供,則假設為均勻權重。
- 回傳值:
- self物件
返回自身的實例。
- predict(X)[原始碼]#
預測 X 中樣本的類別標籤。
- 參數:
- X類陣列,稀疏矩陣,形狀為 (n_samples, n_features)
我們想要取得預測的資料矩陣。
- 回傳值:
- y_pred形狀為 (n_samples,) 的 ndarray
包含每個樣本類別標籤的向量。
- predict_log_proba(X)[原始碼]#
機率估計的對數值。
此方法僅適用於對數損失和修改後的 Huber 損失。
當 loss="modified_huber" 時,機率估計可能是硬性零和一,因此無法取對數。
請參閱
predict_proba
以了解詳細資訊。- 參數:
- X類陣列,稀疏矩陣,形狀為 (n_samples, n_features)
用於預測的輸入資料。
- 回傳值:
- T類陣列, 形狀為 (n_samples, n_classes)
返回模型中每個類別的樣本對數機率,其中類別的排序方式與
self.classes_
中相同。
- predict_proba(X)[原始碼]#
機率估計。
此方法僅適用於對數損失和修改後的 Huber 損失。
多類別機率估計是透過簡單的正規化,從二元 (一對多) 估計導出的,正如 Zadrozny 和 Elkan 所建議的。
loss="modified_huber" 的二元機率估計由 (clip(decision_function(X), -1, 1) + 1) / 2 給出。對於其他損失函數,有必要透過使用
CalibratedClassifierCV
包裝分類器來執行適當的機率校準。- 參數:
- X{類陣列, 稀疏矩陣}, 形狀 (n_samples, n_features)
用於預測的輸入資料。
- 回傳值:
- 形狀為 (n_samples, n_classes) 的 ndarray
返回模型中每個類別的樣本機率,其中類別的排序方式與
self.classes_
中相同。
參考文獻
Zadrozny 和 Elkan, “Transforming classifier scores into multiclass probability estimates”, SIGKDD’02, https://dl.acm.org/doi/pdf/10.1145/775047.775151
loss="modified_huber" 情況下公式的理由在附錄 B 中:http://jmlr.csail.mit.edu/papers/volume2/zhang02c/zhang02c.pdf
- score(X, y, sample_weight=None)[原始碼]#
返回給定測試資料和標籤的平均準確度。
在多標籤分類中,這是子集準確度,這是一個嚴苛的指標,因為您需要每個樣本都正確預測每個標籤集。
- 參數:
- X形狀為 (n_samples, n_features) 的類陣列
測試樣本。
- y形狀為 (n_samples,) 或 (n_samples, n_outputs) 的類陣列
X
的正確標籤。- sample_weight形狀為 (n_samples,) 的類陣列,預設值為 None
樣本權重。
- 回傳值:
- scorefloat
self.predict(X)
相對於y
的平均準確度。
- set_fit_request(*, coef_init: bool | None | str = '$UNCHANGED$', intercept_init: bool | None | str = '$UNCHANGED$', sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier [原始碼]#
請求傳遞給
fit
方法的中繼資料。請注意,此方法僅在
enable_metadata_routing=True
時適用(請參閱sklearn.set_config
)。關於路由機制如何運作,請參閱使用者指南。每個參數的選項如下:
True
:請求元數據,並在提供時傳遞給fit
。如果未提供元數據,則忽略該請求。False
:不請求元數據,並且元估計器不會將其傳遞給fit
。None
:不請求元數據,如果使用者提供元數據,元估計器將會引發錯誤。str
:元數據應使用此給定的別名傳遞給元估計器,而不是原始名稱。
預設值 (
sklearn.utils.metadata_routing.UNCHANGED
) 保留現有的請求。這允許您更改某些參數的請求,而不更改其他參數的請求。於 1.3 版本新增。
注意
此方法僅在此估計器用作元估計器的子估計器時適用,例如在
Pipeline
內部使用。否則,它不會產生任何影響。- 參數:
- coef_initstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
fit
中coef_init
參數的元數據路由。- intercept_initstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
fit
中intercept_init
參數的元數據路由。- sample_weightstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
fit
中sample_weight
參數的元數據路由。
- 回傳值:
- self物件
更新後的物件。
- set_params(**params)[來源]#
設定此估計器的參數。
此方法適用於簡單的估計器以及巢狀物件(例如
Pipeline
)。後者具有<component>__<parameter>
形式的參數,因此可以更新巢狀物件的每個組件。- 參數:
- **params字典
估計器參數。
- 回傳值:
- self估計器實例
估計器實例。
- set_partial_fit_request(*, classes: bool | None | str = '$UNCHANGED$', sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier [來源]#
請求傳遞給
partial_fit
方法的元數據。請注意,此方法僅在
enable_metadata_routing=True
時適用(請參閱sklearn.set_config
)。關於路由機制如何運作,請參閱使用者指南。每個參數的選項如下:
True
:請求元數據,並在提供時傳遞給partial_fit
。如果未提供元數據,則忽略該請求。False
:不請求元數據,並且元估計器不會將其傳遞給partial_fit
。None
:不請求元數據,如果使用者提供元數據,元估計器將會引發錯誤。str
:元數據應使用此給定的別名傳遞給元估計器,而不是原始名稱。
預設值 (
sklearn.utils.metadata_routing.UNCHANGED
) 保留現有的請求。這允許您更改某些參數的請求,而不更改其他參數的請求。於 1.3 版本新增。
注意
此方法僅在此估計器用作元估計器的子估計器時適用,例如在
Pipeline
內部使用。否則,它不會產生任何影響。- 參數:
- classesstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
partial_fit
中classes
參數的元數據路由。- sample_weightstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
partial_fit
中sample_weight
參數的元數據路由。
- 回傳值:
- self物件
更新後的物件。
- set_score_request(*, sample_weight: bool | None | str = '$UNCHANGED$') SGDClassifier [來源]#
請求傳遞給
score
方法的元數據。請注意,此方法僅在
enable_metadata_routing=True
時適用(請參閱sklearn.set_config
)。關於路由機制如何運作,請參閱使用者指南。每個參數的選項如下:
True
:請求元數據,並在提供時傳遞給score
。如果未提供元數據,則忽略該請求。False
:不請求元數據,並且元估計器不會將其傳遞給score
。None
:不請求元數據,如果使用者提供元數據,元估計器將會引發錯誤。str
:元數據應使用此給定的別名傳遞給元估計器,而不是原始名稱。
預設值 (
sklearn.utils.metadata_routing.UNCHANGED
) 保留現有的請求。這允許您更改某些參數的請求,而不更改其他參數的請求。於 1.3 版本新增。
注意
此方法僅在此估計器用作元估計器的子估計器時適用,例如在
Pipeline
內部使用。否則,它不會產生任何影響。- 參數:
- sample_weightstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED
score
中sample_weight
參數的元數據路由。
- 回傳值:
- self物件
更新後的物件。
- sparsify()[來源]#
將係數矩陣轉換為稀疏格式。
將
coef_
成員轉換為 scipy.sparse 矩陣,對於 L1 正規化的模型而言,這比通常的 numpy.ndarray 表示法更節省記憶體和儲存空間。intercept_
成員不會被轉換。- 回傳值:
- self
擬合的估計器。
注意事項
對於非稀疏模型,也就是說,當
coef_
中沒有太多零時,這實際上可能會增加記憶體使用量,因此請謹慎使用此方法。一個經驗法則是,零元素的數量(可以使用(coef_ == 0).sum()
計算)必須超過 50% 才能提供顯著的優勢。在呼叫此方法之後,除非呼叫 densify,否則使用 partial_fit 方法(如果有的話)進行進一步擬合將無法運作。