[英]Why SGDClassifier with hinge loss is faster than SVC implementation in scikit-learn
也許最好開始嘗試一些實際案例並閱讀代碼。 開始吧...
首先,如果我們閱讀 SGDC 的文檔,它說僅使用線性 SVM:
帶有 SGD 訓練的線性分類器(SVM、邏輯回歸、ao)
如果我們不使用通常的 SVC,而是使用LinearSVC 會怎樣?
與參數 kernel='linear' 的 SVC 類似,但根據 liblinear 而不是 libsvm 實現,因此它在懲罰和損失函數的選擇上具有更大的靈活性,並且應該更好地擴展到大量樣本。
讓我們為三種類型的算法添加一個示例:
from sklearn.svm import SVC
from sklearn.linear_model import SGDClassifier
from sklearn.svm import LinearSVC
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = np.random.rand(20000,2)
Y = np.random.choice(a=[False, True], size=(20000, 1))
# hinge is used as the default
svc = SVC(kernel='linear')
sgd = SGDClassifier(loss='hinge')
svcl = LinearSVC(loss='hinge')
使用 jupyter 和命令%%time
我們得到執行時間(你可以在普通 python 中使用類似的方法,但我是這樣做的):
%%time
svc.fit(X, Y)
掛壁時間:5.61 秒
%%time
sgd.fit(X, Y)
掛牆時間:24ms
%%time
svcl.fit(X, Y)
掛牆時間:26.5ms
正如我們所見,它們之間存在巨大差異,但線性和 SGDC 或多或少具有相同的時間。 時間總是有點不同,但這總是會發生的,因為每個算法的執行不是來自相同的代碼。
如果你對每一個實現都感興趣,建議你使用新的github閱讀工具閱讀github代碼,真的很不錯!
線性SVC代碼
SGDC代碼
與 loss='hinge' 的 sklearn SGD 分類器相比,sklearn SVM 在計算上是昂貴的。 因此我們使用更快的 SGD 分類器。 這僅適用於線性 SVM。 如果我們使用 'rbf' 內核,那么 SGD 是不合適的。
我認為這是因為 SGD 中使用的批量大小,如果您使用帶有 SGD 分類器的完整批量,它應該與 SVM 花費相同的時間,但更改批量大小可以導致更快的收斂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.