支持向量機SVM總結

支持向量機SVM(Support Vector Machine)

概念介紹

一個有監督的學習模型,通常用來進行模式識別、分類、迴歸分析等。

SVM在很多諸如文本分類,圖像分類,生物序列分析和生物數據挖掘,手寫字符識別等領域有很多的應用。

通俗來說,它是一種二類分類模型,其基本模型定義爲特徵空間上的間隔最大的線性分類器,其學習策略是間隔最大化,最終可以轉化爲一個凸二次規劃問題的求解。

分類標準的起源,是邏輯迴歸,需要找到一個合適的線性分類器,目標是在N維數據空間中找到一個超平面。

線性分類:原始問題通過滿足KKT條件(首先已經滿足Slater條件,再者f和gi也都是可微的,即L對w和b都可導),已經轉化成了對偶問題。而求解這個對偶學習問題,分爲3個步驟:首先要讓L(w,b,a) 關於 w 和 b 最小化,然後求對α的極大,最後利用SMO算法求解對偶問題中的拉格朗日乘子。

求解對偶問題的序列最小最優化SMO算法。

非線性分類,SVM 的處理方法是選擇一個核函數 κ(⋅,⋅) ,通過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。

具體來說,在線性不可分的情況下,支持向量機首先在低維空間中完成計算,然後通過核函數將輸入空間映射到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上本身不好分的非線性數據分開。如圖所示,一堆數據在二維空間無法劃分,從而映射到三維空間裏劃分。

建立非線性學習器分爲兩步:首先使用一個非線性映射將數據變換到一個特徵空間F,然後在特徵空間使用線性學習器分類。

遠離正常位置的點,通過建立鬆弛變量來允許在一定程度上偏離超平面。

不準確的說,SVM它本質上即是一個分類方法,用w^T+b定義分類函數,於是求w、b,爲尋最大間隔,引出1/2||w||^2,繼而引入拉格朗日因子,化爲對拉格朗日乘子a的求解(求解過程中會涉及到一系列最優化或凸二次規劃等問題),如此,求w.b與求a等價,而a的求解可以用一種快速學習算法SMO,至於核函數,是爲處理非線性情況,若直接映射到高維計算恐維度爆炸,故在低維計算,等效高維表現。

SMO算法的基本思想是將Vapnik在1982年提出的Chunking方法推到極致,SMO算法每次迭代只選出兩個分量ai和aj進行調整,其它分量則保持固定不變,在得到解ai和aj之後,再用ai和aj改進其它分量。與通常的分解算法比較,儘管它可能需要更多的迭代次數,但每次迭代的計算量比較小,所以該算法表現出較好的快速收斂性,且不需要存儲核矩陣,也沒有矩陣運算。

在面試時,考察SVM可考察機器學習各方面能力:目標函數,優化過程,並行方法,算法收斂性,樣本複雜度,適用場景,調參經驗,不過個人認爲考察boosting和LR也還不錯啊。此外,隨着統計機器學習不斷進步,SVM只被當成使用了一個替代01損失hinge研究,更通用的方法被提出,損失函數研究替代損失與貝葉斯損失關係,算法穩定性研究替代損失與推廣性能關係,凸優化研究如何求解凸目標函數,SVM,boosting等算法只是這些通用方法的一個具體組建而已。

R語言的SVM建模

使用SVM需要安裝e1071包,兩種建模方法:

1、svm(formula, data= NULL, subset, na.action = na.omit , scale= TRUE)

formula:函數模型的形式

data:模型中包含的有變量的一組可選格式數據。

索引向量subset用於指定那些將被來訓練模型的採樣數據。

參數na.action用於指定當樣本數據中存在無效的空數據時系統應該進行的處理。默認值na.omit表明程序會忽略那些數據缺失的樣本。另外一個可選的賦值是na.fail,它指示系統在遇到空數據時給出一條錯誤信息。

參數scale爲一個邏輯向量,指定特徵數據是否需要標準化(默認標準化爲均值0,方差1)。

2、svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),coef0 = 0, cost = 1, nu = 0.5, subset, na.action = na.omit)

x可以是一個數據矩陣,也可以是一個數據向量,同時也可以是一個稀疏矩陣。

y是對於x數據的結果標籤,它既可以是字符向量也可以爲數值向量。

x和y共同指定了將要用來建模的訓練數據以及模型的基本形式。

參數type用於指定建立模型的類別。支持向量機模型通常可以用作分類模型、迴歸模型或者異常檢測模型。根據用途的差異,在svm()函數中的type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression這五種類型中。其中,前三種是針對於字符型結果變量的分類方式,其中第三種方式是邏輯判別,即判別結果輸出所需判別的樣本是否屬於該類別;而後兩種則是針對數值型結果變量的分類方式。

此外,kernel是指在模型建立過程中使用的核函數。針對線性不可分的問題,爲了提高模型預測精度,通常會使用核函數對原始特徵進行變換,提高原始特徵維度,解決支持向量機模型線性不可分問題。svm()函數中的kernel參數有四個可選核函數,分別爲線性核函數、多項式核函數、高斯核函數及神經網絡核函數。其中,高斯核函數與多項式核函數被認爲是性能最好、也最常用的核函數。

核函數有兩種主要類型:局部性核函數和全局性核函數,高斯核函數是一個典型的局部性核函數,而多項式核函數則是一個典型的全局性核函數。局部性核函數僅僅在測試點附近小領域內對數據點有影響,其學習能力強、泛化性能較弱;而全局性核函數則相對來說泛化性能較強、學習能力較弱。

對於選定的核函數,degree參數是指核函數多項式內積函數中的參數,其默認值爲3。gamma參數給出了核函數中除線性內積函數以外的所有函數的參數,默認值爲l。coef0參數是指核函數中多項式內積函數與sigmoid內積函數中的參數,默認值爲0。

另外,參數cost就是軟間隔模型中的離羣點權重。最後,參數nu是用於nu-regression、nu-classification和one-classification類型中的參數。

一個經驗性的結論是,在利用svm()函數建立支持向量機模型時,使用標準化後的數據建立的模型效果更好。

#通過summary函數可以得到關於模型的相關信息。其中,SVM-Type項目說明本模型的類別爲C分類器模型;SVM-Kernel項目說明本模型所使用的核函數爲高斯內積函數且核函數中參數gamma的取值爲0.11;cost項目說明本模型確定的約束違反成本爲l。

通過案例發現,

1.支持向量機雖然在訓練集擬合度不如隨機森林和神經網絡,但是測試集準確率較高;

2.隨機森林明顯過擬合;

3.對比發現神經網絡不管訓練集還是測試集效果都最好。

該對比只是簡單的對比,不能直接說明哪種算法最好。

原因:

1.數據樣本過少;

2.實際使用算法中還要考慮到算法運行的時間,當面對海量數據時,準確複雜的算法往往運行過慢。

3.算法得出的模型“好壞”,不僅僅只看準確率,還要看其他指標比如:recall、percision、F1-score等。比如地震預測更看重recall指標

4.實際中還是要結合具體情況,選擇合適的算法。

關於SVM的幾個疑問

1、支持向量機的優缺點及適用數據類型:

優點:泛化錯誤率低,計算開銷不大,結果易於解釋。

缺點:對參數調節和核函數的選擇敏感,原始分類器不加修改僅適用於處理二類問題。

適用數據類型:數值型和標稱型數據。

SVM的優點:

1) 不需要很多樣本,不需要有很多樣本並不意味着訓練樣本的絕對量很少,而是說相對於其他訓練分類算法比起來,同樣的問題複雜度下,SVM需求的樣本相對是較少的。並且由於SVM引入了核函數,所以對於高維的樣本,SVM也能輕鬆應對。

2) 結構風險最小。這種風險是指分類器對問題真實模型的逼近與問題真實解之間的累積誤差。

3) 非線性,是指SVM擅長應付樣本數據線性不可分的情況,主要通過鬆弛變量(也叫懲罰變量)和核函數技術來實現,這一部分也正是SVM的精髓所在。

2、爲什麼叫做超平面?這是個讓人尷尬的問題!!!!

如果數據點都在二維平面上,那麼分隔超平面就是一條直線,如果所給的數據點集是三維的,那麼分隔數據的就是一個平面,更高維的以此類推,如果數據集是1024維的,那麼需要一個1023維的某某對象來對數據進行分隔,而這個1023維的某某對象被稱爲超平面。

3、SVM的一般流程:

收集數據:可以使用任意方法。

準備數據:需要數值型數據。

分析數據:有助於可視化分隔超平面

訓練算法:SVM的大部分時間都源自訓練,該過程主要實現兩個參數的調優。

測試算法:十分簡單的計算過程就可以實現。

使用算法:幾乎所有分類問題都可以使用SVM,值得一提的是,SVM本身是一個二類分類器,對多類問題應用SVM需要對代碼做一些修改。

4、基於SVM的數字識別:

a)收集數據:提供的文本文件。

b)準備數據:基於二值圖像構造向量。

c)分析數據:對圖像向量進行目測。

d)訓練算法:採用兩種不同的核函數,並對徑向基核函數採用不同的設置來運行SMO算法。

e)測試算法:編寫一個函數來測試不同的核函數並計算錯誤率。

f)使用算法。

5、關於核函數

核函數的作用其實很簡單就是把低維映射到高維中,便於分類。核函數有高斯核等,下面就直接上圖看參數對模型的影響,從下圖可以瞭解,當C變化時候,容錯變小,泛化能力變小;當選擇高斯核函數的時候,隨時R參數調大,準確高提高,最終有過擬合風險;

6、鬆弛變量的引入,解決容錯性,即加入損失函數;

再加入懲罰因子C(cost),代表了對離羣點帶來的損失的重視程度,它的值越大,對目標函數的損失越大,意味着你非常不願意放棄這些點。它是由使用者指定的一個值(libsvm中的參數C),是參數調優的重點所在。

引入鬆弛變量後,就允許某些樣本點的函數間隔小於1,即在最大間隔區間裏面,或者函數間隔是負數,即樣本點在對方的區域中。C是離羣點的權重,值越大說明離羣點對目標函數影響越大,這時候間隔就會很小。

7、爲什麼要轉爲對偶問題?(阿里面試)

(a)   目前處理的模型嚴重依賴於數據集的維度d,如果維度d太高就會嚴重提升運算時間;

(b)   對偶問題事實上把SVM從依賴d個維度轉變到依賴N個數據點,考慮到在最後計算時只有支持向量纔有意義,所以這個計算量實際上比N小很多。

8、SMO算法實現SVM

基本思想:將大優化的問題分解成多個小優化問題,這些小問題往往比較容易求解,並且對他們進行順序求解的結果與他們作爲整體來求解的結果完全一致。

9、如何選取核函數?

1.當樣本的特徵很多時,特徵的維數很高,這是往往樣本線性可分,可考慮用線性核函數的SVM或LR(如果不考慮核函數,LR和SVM都是線性分類算法,也就是說他們的分類決策面都是線性的)。

2.當樣本的數量很多,但特徵較少時,可以手動添加一些特徵,使樣本線性可分,再考慮用線性核函數的SVM或LR。

3.當樣特徵維度不高時,樣本數量也不多時,考慮用高斯核函數(RBF核函數的一種,指數核函數和拉普拉斯核函數也屬於RBF核函數)。

LR和SVM都是判別模型,判別模型會生成一個表示P(Y|X)的判別函數(或預測模型),而生成模型先計算聯合概率p(Y,X)然後通過貝葉斯公式轉化爲條件概率。簡單來說,在計算判別模型時,不會計算聯合概率,而在計算生成模型時,必須先計算聯合概率。或者這樣理解:生成算法嘗試去找到底這個數據是怎麼生成的(產生的),然後再對一個信號進行分類。基於你的生成假設,那麼那個類別最有可能產生這個信號,這個信號就屬於那個類別。判別模型不關心數據是怎麼生成的,它只關心信號之間的差別,然後用差別來簡單對給定的一個信號進行分類。常見的判別模型有:KNN、SVM、LR,常見的生成模型有:樸素貝葉斯,隱馬爾可夫模型

常用核函數的公式:

https://img-my.csdn.net/uploads/201302/25/1361786433_5005.jpg

如果如果特徵數遠遠大於樣本數的情況下,使用線性核就可以了.

如果特徵數和樣本數都很大,例如文檔分類,一般使用線性核, LIBLINEAR比LIBSVM速度要快很多.

如果特徵數遠小於樣本數,這種情況一般使用RBF.但是如果一定要用線性核,則選擇LIBLINEAR較好,而且使用-s 2選項。

選擇核函數的方法:

如果特徵的數量大到和樣本數量差不多,則選用LR或者線性核的SVM;

如果特徵的數量小,樣本的數量正常,則選用SVM+高斯核函數;

如果特徵的數量小,而樣本的數量很大,則需要手工添加一些特徵從而變成第一種情況。

一般選擇線性核和高斯核,也就是Linear核與RBF核。

Linear核:主要用於線性可分的情形。參數少,速度快,對於一般數據,分類效果已經很理想了。

RBF核:主要用於線性不可分的情形。參數多,分類結果非常依賴於參數。有很多人是通過訓練數據的交叉驗證來尋找合適的參數,不過這個過程比較耗時。

如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM。

如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel。

10、爲什麼SVM對缺失數據敏感?

這裏說的缺失數據是指缺失某些特徵數據,向量數據不完整。SVM沒有處理缺失值的策略(決策樹有)。而SVM希望樣本在特徵空間中線性可分,所以特徵空間的好壞對SVM的性能很重要。缺失特徵數據將影響訓練結果的好壞。

 

LR和SVM的異同點

邏輯迴歸和支持向量機的共同點

1、都是分類算法

2、本質上都是線性分類算法,只是SVM考慮了核函數的轉換

3、都是監督學習算法

4、都是判別模型

常見的判別模型有:KNN、SVM、LR,常見的生成模型有:樸素貝葉斯,隱馬爾可夫模型。

邏輯迴歸和支持向量機的區別

1、損失函數不同

邏輯迴歸方法基於概率理論,假設樣本爲1的概率可以用sigmoid函數來表示,然後通過極大似然估計的方法估計出參數的值。

支持向量機​基於幾何間隔最大化原理,認爲存在最大幾何間隔的分類面爲最優分類面。

通常在lr的推倒的時候,我們是直接用 最大似然估計的,然後只有當 誤差的分佈滿足高斯分佈的時候,最大似然的結果纔會和最小二乘相同(loss function 爲均方誤差)。

lr 和 svm本質不同在於loss function的不同,不過想想這幾乎對所有的單層模型都使用,lr的損失函數是 cross entropy loss, adaboost的損失函數是 expotional loss ,svm是hinge loss,常見的迴歸模型通常用 均方誤差 loss。

爲什麼LR要用似然估計來求概率最大?

似然函數求解概率最大(被問到:爲什麼可以用似然函數。答:因爲目標是要讓預測爲正的的概率最大,且預測爲負的概率也最大,即每一個樣本預測都要得到最大的概率,將所有的樣本預測後的概率進行相乘都最大,這就能到似然函數了。)

2、SVM只考慮局部邊界線附近的點,而LR考慮全局的點

線性SVM不直接依賴於數據分佈,分類平面不受一類點影響;LR則受所有數據點的影響,如果數據不同類別strongly unbalance,一般需要先對數據做balancing。

3、處理非線性的方法不同

SVM採用核函數解決非線性的問題;計算決策面時,SVM算法裏只有少數幾個代表支持向量的樣本參與了計算,也就是隻有少數幾個樣本需要參與覈計算(即kernal machine解的係數是稀疏的)。

LR算法裏,每個樣本點都必須參與決策面的計算過程,也就是說,假設我們在LR裏也運用核函數的原理,那麼每個樣本點都必須參與覈計算,這帶來的計算複雜度是相當高的。所以,在具體應用時,LR很少運用核函數機制。

LR解決非線性問題,通常採用特徵工程的辦法,如特徵離散化。很少直接將連續值作爲特徵餵給邏輯迴歸模型,而是將連續特徵離散化爲一系列0、1特徵交給邏輯迴歸模型。

特徵離散化的好處:稀疏向量內積乘法運算速度快,計算結果方便存儲,容易scalable(擴展);離散化後的特徵對異常數據有很強的魯棒性:比如一個特徵是年齡>30是1,否則0。如果特徵沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾;邏輯迴歸屬於廣義線性模型,表達能力受限;單變量離散化爲N個後,每個變量有單獨的權重,相當於爲模型引入了非線性,能夠提升模型表達能力,加大擬合;離散化後可以進行特徵交叉,由M+N個變量變爲M*N個變量,進一步引入非線性,提升表達能力;特徵離散化後,模型會更穩定,比如如果對用戶年齡離散化,20-30作爲一個區間,不會因爲一個用戶年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反,所以怎麼劃分區間是門學問。“海量離散特徵+簡單模型” 同 “少量連續特徵+複雜模型”的權衡

4、線性SVM依賴數據表達的距離測度,所以需要對數據先做normalization,LR不受其影響。

5、SVM的損失函數自帶L2正則表達式,LR需要另外添加正則

在訓練誤差和模型複雜度之間尋求平衡,防止過擬合,從而達到真實誤差的最小化。

對於SVM來說,有兩個常用的損失算法max(1-yiwTxi,0)和max(1-yiwTxi,0)2,分別指的是L1-SVM和L2-SVM。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章