SVM和logistic回歸分別在什麼情況下使用?

兩者都是線性分類器的話,只是實現方式不同,那麼各自適用於什麼樣的場景呢?


兩種方法都是常見的分類演算法,從目標函數來看,區別在於邏輯回歸採用的是logistical loss,svm採用的是hinge loss。這兩個損失函數的目的都是增加對分類影響較大的數據點的權重,減少與分類關係較小的數據點的權重。SVM的處理方法是只考慮support vectors,也就是和分類最相關的少數點,去學習分類器。而邏輯回歸通過非線性映射,大大減小了離分類平面較遠的點的權重,相對提升了與分類最相關的數據點的權重。兩者的根本目的都是一樣的。此外,根據需要,兩個方法都可以增加不同的正則化項,如l1,l2等等。所以在很多實驗中,兩種演算法的結果是很接近的。

但是邏輯回歸相對來說模型更簡單,好理解,實現起來,特別是大規模線性分類時比較方便。而SVM的理解和優化相對來說複雜一些。但是SVM的理論基礎更加牢固,有一套結構化風險最小化的理論基礎,雖然一般使用的人不太會去關注。還有很重要的一點,SVM轉化為對偶問題後,分類只需要計算與少數幾個支持向量的距離,這個在進行複雜核函數計算時優勢很明顯,能夠大大簡化模型和計算量。


一個統計的方法,一個幾何的方法,我的經驗是:同樣的線性分類情況下,如果異常點較多的話,無法剔除,首先LR,LR中每個樣本都是有貢獻的,最大似然後會自動壓制異常的貢獻,SVM+軟間隔對異常還是比較敏感,因為其訓練只需要支持向量,有效樣本本來就不高,一旦被干擾,預測結果難以預料。


下面一些觀點幾乎都在的這個talk里 http://www.csie.ntu.edu.tw/~cjlin/talks/msri.pdf 如果我哪理解錯了,請以slides為準。

問題是比較LR和SVM,那就首先得畫好起跑線,應該比什麼。
1.比Model的準確率?那麼問題來了,貌似沒有哪個Model可以宣稱在所有data下面都能贏。所以Model的準確率本身就是data-dependent。
2.比訓練Time/Space Complexity?那我覺得在Formulation可比的情況下,更多是Optimization的問題。
3.比可解釋性,上面有朋友已經說到這點,兩者都不錯,至少都比#**好 XD。
下面就一些點拋磚引玉和大家討論,

1.SVM總是讓人覺得比LR結果好?SVM是不是Linear Classifier?


其實很好奇SVM為何要和Kernel Trick畫上連線的,難道是因為LibSVM默認使用RBF kernel?儘管Kernel確實幫助提高Linear的結果,如同下圖:

可是並不代表Kernel是SVM專有的
可是並不代表Kernel是SVM專有的
可是並不代表Kernel是SVM專有的

Kernel Logistic Regression(KLR)也很常見,(為了不引起專有名詞紛爭,我這裡的kernel涵蓋一切nonlinear的feature mapping),只是往往不同的feature mapping會讓它有一個更炫酷的model名字,NN使用logistic error,或者最近在CTR比賽很有名的logistic error 的FM/FFM不也算是KRL么?如同上面的朋友所言SVM的Hinge Loss(l1/l2)或者LR的Logistic loss都是loss function罷了,和是否要用kernel或者是否linear以及使用什麼regularizer沒啥關係。
2. SVM跑的總是比LR慢?LR能跑出來的SVM跑不出來?SGD是萬能的?
上面有說到,我們的比較要在Formulation是在可比的情況下。這裡的可比主要指的是用相同的feature mapping以及相同的Regularizer等等等,拿Poly-9的SVM(別笑!Yan LeCun用過這個級別的kernel)跟純LR的比速度我相信任何大data,LR都會更快,參數都會更少,但不能這麼比不是么。當有可比性的時候剩下的問題多少都是Optimization的問題。
都是linear case的話,兩者在不同Optimization方法的複雜度幾乎都是相同的。無論是Features多還是Instances多,都可以通過是否導dual來解決,其實就實現的情況來看,我反倒覺得LR的問題會更多,我一直堅信目前人類目前的exp/log實現方法是logloss的optimization發展的主要障礙
我不知道online learning和batch learning做對比是否有意義,但SGD會更快這點其實也不make sense。首先你得確保你的SGD能找到能在這個data上收斂的learning rate,儘管使用一勞永逸的Adagrad。再者無論linear-SVM或者LR的dual problems使用coordinate descent methods複雜度和SGD是相同的。就算是使用複雜的Inexact Newton Method,我們最近在sub-hessian上的一些研究和實驗也發現可以做到 大data下不比SGD慢同時有很好的並行/分散式的特性

3.無論LR/SVM 是不是想要好的結果就要用Kernel?想要快的速度就不能不能有好的結果?
lab的一個大二學弟最近的一篇work探討這個 http://www.csie.ntu.edu.tw/~cjlin/papers/kernel-check/kcheck.pdf 這裡的kernel check可以幫你根據data選是否kernel或者如何使用linear 有更好的結果。

最後,請允許我print出來目前liblinear支持的所有solver

-s type : set type of solver (default 1)
for multi-class classification
0 -- L2-regularized logistic regression (primal)
1 -- L2-regularized L2-loss support vector classification (dual)
2 -- L2-regularized L2-loss support vector classification (primal)
3 -- L2-regularized L1-loss support vector classification (dual)
4 -- support vector classification by Crammer and Singer
5 -- L1-regularized L2-loss support vector classification
6 -- L1-regularized logistic regression
7 -- L2-regularized logistic regression (dual)
for regression
11 -- L2-regularized L2-loss support vector regression (primal)
12 -- L2-regularized L2-loss support vector regression (dual)
13 -- L2-regularized L1-loss support vector regression (dual)

其實想說的是,好吧,我上面說的都是錯的,請對你的data多做實驗,實驗數據才能說明一切.


=======================From Andrew Ng=============================
n是feature的數量 m是樣本數
1、如果n相對於m來說很大,則使用LR演算法或者不帶核函數的SVM(線性分類)
n遠大於m,n=10000,m=10-1000
2、如果n很小,m的數量適中(n=1-1000,m=10-10000)
使用帶有核函數的SVM演算法
3、如果n很小,m很大(n=1-1000,m=50000+)
增加更多的feature然後使用LR演算法或者不帶核函數的SVM
LR和不帶核函數的SVM比較類似。


正解其實是:

當你的數據非常非常非常非常非常大然後完全跑不動SVM的時候,跑LR。

多大算是非常非常非常非常非常非常大? 比如幾個G,幾萬維特徵,就勉強算大吧...

而實際問題上幾萬個參數實在完全不算個事兒,太常見了。隨隨便便就得上spark。讀一遍數據就尼瑪老半天,一天能訓練出來的模型就叫高效了。
所以在新時代,LR其實反而比以前用的多了=. =


至於更複雜的模型,很多時候其實是「非不為也,實不能也」。對著電費哭泣然後做夢都想有更多GPU,更大內存的同學們都懂T T


我不分析理論,hinge loss,linear, nonlinear whatever。難道不是應該拿數據集跑一下看看結果嗎?如果你的數據集太大,那就sample一下再跑結果唄。你的數據集如果經常變,那就隔一段時間比較一下唄。

順便一提,你既然拿著兩個比,那都是binary 分類啦?你注意svm搞不成多class的分類,而logisitic 能搞。

還有,用svm別忘了kernel,沒kernel,svm的優勢就體現不出來啦。先用高斯,rbf kernel哦,再試試。

類似svm,logistic也可以在dual上加kernel,但訓練起來沒有svm那種目標函數只有幾個支持向量那麼好的特性,訓練就慢一點。這都是理論上的,實際我覺得你就普通logi就好了,加啥kernel。

你如果不是搞理論的,推下界上界什麼的,就多跑實驗唄,調用個函數的事情,很快。


@Orangeprince 講得很清楚了,對LR和SVM理解比較深。
在Andrew NG的課里講到過:
1. 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM
2. 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel
3. 如果Feature的數量比較小,而樣本數量很多,需要手工添加一些feature變成第一種情況
仔細想想,為什麼是這樣?


這種事情,小孩沒娘、說來話長。
Logistic速度快,並行好,但是SVM也不是完全不能並行化啊,這麼吵下去,天荒地老。
一般來說,如果數據的維度特別高,高的變態,有18層樓那麼高,那麼我會使用SVM
如果維度不是很高,我會逐一查看每個特徵的分布(正負類分開),對一些分布性質不是很好的維度做一個非線性變換,比如log之類
然後送入Logistic裡面去跑一下,讓SPSS評價一下每一個維度的貢獻,去掉貢獻程度低的。
Logistic的容錯能力很好,這導致了它適用於數據混淆的比較嚴重時候的分類,而且你也不要指望混淆的數據能給你一個精確的模型。
如果對精度要求高,就送入SVM中去,並且設置cross-validation防止過擬合,你也不要關心模型最後為什麼work,也不要刪除特徵。
SVM的參數也很有講究,不同的參數帶來的過擬合風險是不一樣的,這個說起來就更長了,在此不累述,參見林智仁的libsvm的說明。


SVM與LR的主要區別可能是準確率與效率的區別。
SVM有多種核可以選擇,可以處理各種非線性問題(條件是選對核函數)。大多數情況準確率都比LR要高,但是模型較大,訓練效率低。
LR是很基礎和普適的廣義線性模型,非常適合超高特徵維度,超大數據量,因為其效率非常高,還可以改造成online learning。(百萬以上的特徵或訓練數據,一般都建議使用LR。)
從我的經驗上看,在文本分類領域,訓練數據量不是太大的話,SVM(線性核linear SVC)+正則是最優的,如果數據量太大,建議用MNB或LR。
當然,上面說的是不考慮Deep Learning的情況。


LR和SVM都是解決分類問題吧;
首先說LR和SVM是線性分類問題是不精確的,LR可以使用特徵離散化實現擬非線性結果,LR+ regularization可以讓分類結果有比較好的結果;
SVM有線性和非線性核函數,一般性都會使用非線性核效果比較好。
在工業界實際使用中,SVM用的不多,速度慢並且效果也很難保證,用好的特徵+LR+regularization可以取得不錯的效果,上線後響應速度快。
SVM是個被理論證明得很好的理論,實際應用挺弱的,還不如用一些簡單的模型來說更好。
如果真要取得更好的效果,建議學習一下Gradient Boosting Decision Tree,RandomForest等演算法,提高分類的的Precision和Recall,SVM終歸太偏理論了,不能說在工業界沒有用,但是以現在的發展前景來看,SVM會慢慢被淡化的。


上圖來自Andrew Ng的機器學習課程,我做個搬運工:

假設: n = 特徵數量,m = 訓練樣本數量

1)如果n相對於m更大,比如 n = 10,000,m = 1,000,則使用lr

理由:特徵數相對於訓練樣本數已經夠大了,使用線性模型就能取得不錯的效果,不需要過於複雜的模型;

2)如果n較小,m比較大,比如n = 10,m = 10,000,則使用SVM(高斯核函數)

理由:在訓練樣本數量足夠大而特徵數較小的情況下,可以通過使用複雜核函數的SVM來獲得更好的預測性能,而且因為訓練樣本數量並沒有達到百萬級,使用複雜核函數的SVM也不會導致運算過慢;

3)如果n較小,m非常大,比如n = 100, m = 500,000,則應該引入/創造更多的特徵,然後使用lr或者線性核函數的SVM

理由:因為訓練樣本數量特別大,使用複雜核函數的SVM會導致運算很慢,因此應該考慮通過引入更多特徵,然後使用線性核函數的SVM或者lr來構建預測性更好的模型。


結合 kernel技巧 基本通用,分類精確率相當;
在神經網路中 分類 都是用LR/softmax regression 因為能求導 做backpropagation方便了;


logistic 是條直線。但是效率高。


首先,SVM不是線性分類器,除非你說的是Linear Kernel的SVM(Linear Kernel SVM這種東西真的好用嗎?有人用嗎?有任何優勢?連SVM唯一的優勢——實現庫多——都沒了……)。logistic regression是線性分類器。
然後,由於SVM不是線性分類器,於是計算時間上就要比logistic regression高的多,理論上O(n^3),實際上可以看做O(n^2)。logistic regression可以看做O(n)的。
最後,由於SVM不是線性分類器,同樣的數據和特徵,分類效果完爆logistic regression。

這兩個方法根本不是一個位面的,SVM應該和L1-regularized kernel logistic regression或者Bayesian sparse kernal machine(RVM)來比較,logistic regression應該和Linear Kernel SVM來比較。


svm 更多的屬於非參數模型,而logistic regression 是參數模型,本質不同。其區別就可以參考參數模型和非參模型的區別就好了。


1.數據集很大還是優先考慮 SGD regressor。
尤其特別大數據集,SGD外,幾乎別無他法。跑不動。
2.不是特別特別大的,
先試試嶺回歸或linear kernal的SVR。
3.不管用,換RBF kernal或者Ensemble regressor。
4.如果有important features要先feature selection,則適用Lasso,ElasticNet。同樣是指非特大數據集。


補充第一樓的答案:
Logistic Regression 來自於Generalized Linear Model, 其想法和Linear Regression同源。對於參數的估計、無偏、方差、一致性,有效性等都有統計理論作為支持。其Loss Function也是從統計理論中自然而然得到的。
SVM的思想來源於Perceptron Method。區別在於要找到最有效的分類器(距離Support Vector距離最遠)。


從判定的角度講 logistics的判定是條直線 決策樹是類似一個方塊 而SVM是接近一個圓

比如有一堆二維散點 紅色在外側 接近一個圓形 藍色在裡面 這種情況下要區分紅藍點的情況明顯SVM比Logistic好

但是如果需要的判定是條線 那麼logistic regression不一定比其他的差


不同
1.logistic regression適合需要得到一個分類概率的場景,SVM則沒有分類概率
2.LR其實同樣可以使用kernel,但是LR沒有support vector在計算複雜度上會高出很多。如果樣本量很大並且需要的是一個複雜模型,那麼建議SVM
3. 如果樣本比較少,模型又比較複雜。那麼建議svm,它有一套比較好的解構風險最小化理論的保障,比如large margin和soft margin

相同
1. 由於hinge loss和entropy loss很接近,因此得出來的兩個分類面是非常接近的
2. 都是在兩個loss上做了一個regularization

等等


From https://www.coursera.org/learn/machine-learning/lecture/sKQoJ/using-an-svm


說到svm,是不是可以考慮下 libsvm和liblinear,畢竟都是svm的增強版本嘛,而且世紀佳緣用的也是liblinear


推薦閱讀:

有沒有傻瓜化的機器學習界面?
該不該堅持學習Machine Learning?
用 Python 進行數據分析,不懂 Python,求合適的 Python 書籍或資料推薦?
如何評價谷歌的「人工智慧先行」(AI First)戰略?
深度機器學習中的batch的大小對學習效果有何影響?

TAG:數據挖掘 | 機器學習 | SVM |