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 以了解說明。

有關損失公式的更多詳細資訊,請參閱 使用者指南,您可以在 SGD:凸損失函數中找到損失函數的可視化。

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_stoppingTrue),目前的學習率會除以 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

fitcoef_init 參數的元數據路由。

intercept_initstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED

fitintercept_init 參數的元數據路由。

sample_weightstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED

fitsample_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_fitclasses 參數的元數據路由。

sample_weightstr、True、False 或 None,預設值=sklearn.utils.metadata_routing.UNCHANGED

partial_fitsample_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

scoresample_weight 參數的元數據路由。

回傳值:
self物件

更新後的物件。

sparsify()[來源]#

將係數矩陣轉換為稀疏格式。

coef_ 成員轉換為 scipy.sparse 矩陣,對於 L1 正規化的模型而言,這比通常的 numpy.ndarray 表示法更節省記憶體和儲存空間。

intercept_ 成員不會被轉換。

回傳值:
self

擬合的估計器。

注意事項

對於非稀疏模型,也就是說,當 coef_ 中沒有太多零時,這實際上可能會增加記憶體使用量,因此請謹慎使用此方法。一個經驗法則是,零元素的數量(可以使用 (coef_ == 0).sum() 計算)必須超過 50% 才能提供顯著的優勢。

在呼叫此方法之後,除非呼叫 densify,否則使用 partial_fit 方法(如果有的話)進行進一步擬合將無法運作。