簡體   English   中英

為什么具有鉸鏈損失的 SGDClassifier 比 scikit-learn 中的 SVC 實現更快

[英]Why SGDClassifier with hinge loss is faster than SVC implementation in scikit-learn

正如我們所知,對於支持向量機,我們可以使用 SVC 以及 SGDClassifier 與鉸鏈損失實現。 具有鉸鏈損失實現的 SGDClassifier 是否比 SVC 更快。 為什么?

scikit-learn 中 SVC 的兩種實現的鏈接:
SVC
SGD分類器

我在 sci-kit 的文檔頁面上讀到了 SVC 使用 libsvm 庫的一些算法進行優化。 而 SGDClassifier 使用 SGD(顯然)。

也許最好開始嘗試一些實際案例並閱讀代碼。 開始吧...

首先,如果我們閱讀 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM