0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器學(xué)習(xí)之支持向量機(jī)SVM

zhKF_jqr_AI ? 來源:未知 ? 作者:胡薇 ? 2018-05-16 17:01 ? 次閱讀

掌握機(jī)器學(xué)習(xí)算法并不是什么神話。對(duì)于大多數(shù)機(jī)器學(xué)習(xí)初學(xué)者來說,回歸算法是很多人接觸到的第一類算法,它易于理解、方便使用,堪稱學(xué)習(xí)工作中的一大神器,但它真的是萬能的嗎?通過這篇文章,論智希望大家明白,有時(shí)候,生活中的一些萬金油工具其實(shí)并不是我們的唯一選擇。

如果把機(jī)器學(xué)習(xí)看做是一個(gè)堆滿刀、劍、斧、弓等兵器的軍械庫,里面有成千上萬種工具,我們的選擇余地的確很大,但我們應(yīng)該學(xué)會(huì)在正確的時(shí)間和場(chǎng)合使用正確的武器。如果把回歸算法看作是其中的劍,它可以輕松刺穿敵人(數(shù)據(jù))的堅(jiān)甲,但不能被庖丁用來解牛。對(duì)于這類問題高度復(fù)雜的數(shù)據(jù)處理任務(wù),一把鋒利的“小刀”——支持向量機(jī)(SVM)往往更有效——它可以在較小的數(shù)據(jù)集上工作,并構(gòu)建出更強(qiáng)大的模型。

1. 什么是支持向量機(jī)?

在機(jī)器學(xué)習(xí)領(lǐng)域中,支持向量機(jī)”(SVM)是一種可用于分類和回歸任務(wù)監(jiān)督學(xué)習(xí)算法,在實(shí)踐中,它的主要應(yīng)用場(chǎng)景是分類。為了解釋這個(gè)算法,首先我們可以想象一大堆數(shù)據(jù),其中每個(gè)數(shù)據(jù)是高維空間中的一個(gè)點(diǎn),數(shù)據(jù)的特征有多少,空間的維數(shù)就有多少。相應(yīng)的,數(shù)據(jù)的位置就是其對(duì)應(yīng)各特征的坐標(biāo)值。為了用一個(gè)超平面盡可能完美地分類這些數(shù)據(jù)點(diǎn),我們就要用SVM算法來找到這個(gè)超平面。

在這個(gè)算法中,所謂“支持向量”指的是那些在間隔區(qū)邊緣的訓(xùn)練樣本點(diǎn),而“機(jī)”則是用于分類的那個(gè)最佳決策邊界(線/面/超平面)。

2. SVM的工作原理

下面我們用圖像演示如何找出正確的超平面的幾種方法。

情景1

下圖中有三個(gè)超平面:A、B和C。那么其中哪個(gè)是正確的邊界呢?只需記住一點(diǎn):SVM選擇的是能分類兩種數(shù)據(jù)的決策邊界。很顯然,相比A和C,B更好地分類了圓和星,所以它是正確的超平面。

情景2

下圖中同樣有A、B、C三個(gè)超平面,和情景1不同,這次三個(gè)超平面都很好地完成了分類,那么其中哪個(gè)是正確的超平面呢?對(duì)此,我們?cè)傩薷囊幌轮暗谋硎觯篠VM選擇的是能更好地分類兩種數(shù)據(jù)的決策邊界。

在這里,我們可以繪制數(shù)據(jù)到?jīng)Q策邊界的距離來輔助判斷。如下圖所示,無論是星還是圓,它們到C的距離都是最遠(yuǎn)的,因此這里C就是我們要找的最佳決策邊界。

之所以選擇邊距更遠(yuǎn)的超平面,是因?yàn)樗€(wěn)健,容錯(cuò)率更高。如果選擇A或C,如果后期我們繼續(xù)輸入樣本,它們發(fā)生錯(cuò)誤分類的可能性會(huì)更高。

情景3

這里我們先看圖,試著用上一情景的結(jié)論做出選擇。

也許有些讀者最終選擇了B,因?yàn)閮深悢?shù)據(jù)和它的邊距較A更遠(yuǎn)。但是其中有個(gè)問題,就是B沒有正確分類,而A正確分類了。那么在SVM算法面前,正確分類和最大邊距究竟孰重孰輕?很顯然,SVM首先考慮的是正確分類,其次才是優(yōu)化數(shù)據(jù)到?jīng)Q策邊界的距離。情景3的正確超平面是A。

情景4

在前幾個(gè)例子里,雖然我們把決策邊界表述為超平面,但它們?cè)趫D像中都是一條直線,這其實(shí)是不符合現(xiàn)實(shí)的。如在下圖中,我們就無法用直線進(jìn)行分類。

紅色的圓點(diǎn)之間出現(xiàn)了一顆藍(lán)色的星,并且它和其他同類數(shù)據(jù)不在同一側(cè)。那么我們是否要繪制一條曲線來分類?或者說,是否要把它單獨(dú)氛圍一類?答案是否定的。

對(duì)比情景3,我們可以推斷此處的星是一個(gè)異常值,所以在這里SVM算法不受分類前提困擾,可以直接在圓和星之間找出一個(gè)最合適的超平面進(jìn)行分類。換句話說,SVM對(duì)于異常值是有效的。

情景5

讓我們繼續(xù)關(guān)注直線這個(gè)話題。在下圖中,兩類數(shù)據(jù)之間已經(jīng)不具備直線邊界了,那么SVM算法會(huì)怎么分類?請(qǐng)想象電視劇中大俠拍桌震起酒杯的畫面。圖中目前只有X和Y兩個(gè)特征,為了分類,我們可以添加一個(gè)新特征Z = X2+ Y2,并繪制數(shù)據(jù)點(diǎn)在X軸和Z軸上的位置。

數(shù)據(jù)點(diǎn)被“震起來”后,星和圓在Z軸上出現(xiàn)了一個(gè)清晰的決策邊界,它在上圖中表示為一條二維的線,這里有幾個(gè)注意點(diǎn):

Z的所有值都是正的,因?yàn)樗荴和Y的平方和;

在原圖中,圓的分布比星更靠近坐標(biāo)軸原點(diǎn),這也是它們?cè)赯軸上的值較低的原因。

在SVM中,我們通過增加空間維度能很輕易地在兩類數(shù)據(jù)間獲得這樣的線性超平面,但另一個(gè)亟待解決的問題是,像Z = X2+ Y2這樣的新特征是不是都得由我們手動(dòng)設(shè)計(jì)?不需要,SVM中有一種名為kernel的函數(shù),它們能把低維輸入映射進(jìn)高維空間,把原本線性不可分的數(shù)據(jù)變?yōu)榫€性可分,我們也稱它們?yōu)楹撕瘮?shù)。

核函數(shù)主要用于非線性分離問題。簡(jiǎn)而言之,它會(huì)自動(dòng)執(zhí)行一些非常復(fù)雜的數(shù)據(jù)轉(zhuǎn)換,然后根據(jù)你定義的標(biāo)簽或輸出找出分離數(shù)據(jù)的過程。

當(dāng)我們把數(shù)據(jù)點(diǎn)從三維壓縮回二維后,這個(gè)超平面就成了一個(gè)圓圈:

3. 如何在Python和R中實(shí)現(xiàn)SVM

在Python中,scikit-learn是一個(gè)受眾極廣的方便又強(qiáng)大的機(jī)器學(xué)習(xí)算法庫,所以我們可以直接在scikit-learn里找到SVM。

#Import Library

from sklearn import svm

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create SVM classification object

model = svm.svc(kernel='linear', c=1, gamma=1)

# there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score

model.fit(X, y)

model.score(X, y)

#Predict Output

predicted= model.predict(x_test)

對(duì)于R語言,e1071軟件包可用于輕松創(chuàng)建SVM,它具有輔助函數(shù)以及Naive Bayes分類器的代碼,和Python大體相同。

#Import Library

require(e1071) #Contains the SVM

Train <- read.csv(file.choose())

Test <- read.csv(file.choose())

# there are various options associated with SVM training; like changing kernel, gamma and C value.

# create model

model <- svm(Target~Predictor1+Predictor2+Predictor3,data=Train,kernel='linear',gamma=0.2,cost=100)

#Predict Output

preds <- predict(model,Test)

table(preds)

4. 如何調(diào)整SVM參數(shù)

在機(jī)器學(xué)習(xí)中,調(diào)參是提高模型性能額一種有效做法,我們先來看看SVM中的可用參數(shù)。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)

這里我們只介紹幾個(gè)重要參數(shù)的調(diào)參方法。

kernel:之前我們已經(jīng)介紹了kernel是什么,關(guān)于它,我們可以挑選各種函數(shù):線性的、RBF核的、poly函數(shù)等(默認(rèn)值為RBF核)。對(duì)非線性超平面來說,后兩種核函數(shù)效果顯著。以下是幾個(gè)例子:

例1:線性核函數(shù)

import numpy as np

import matplotlib.pyplot as plt

from sklearn import svm, datasets

# import some data to play with

iris = datasets.load_iris()

X = iris.data[:, :2] # we only take the first two features. We could

# avoid this ugly slicing by using a two-dim dataset

y = iris.target

# we create an instance of SVM and fit out data. We do not scale our

# data since we want to plot the support vectors

C = 1.0# SVM regularization parameter

svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)

# create a mesh to plot in

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1

y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

h = (x_max / x_min)/100

xx, yy = np.meshgrid(np.arange(x_min, x_max, h),

np.arange(y_min, y_max, h))

plt.subplot(1, 1, 1)

Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)

plt.xlabel('Sepal length')

plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())

plt.title('SVC with linear kernel')

plt.show()

例2:RBF核函數(shù)

把核函數(shù)類型更改為rbf,然后從圖中觀察變化。

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

如果你有大量特征(> 1000),我建議你選擇線性內(nèi)核,因?yàn)樗鼈冊(cè)诟呔S空間內(nèi)線性可分的概率更高。除此之外,那rbf就是個(gè)不錯(cuò)的選擇,但是不要忘記交叉驗(yàn)證其參數(shù)來避免過擬合。

gamma:rbf、poly和sigmoid的核系數(shù)。gamma值越高,模型就回更努力地?cái)M合訓(xùn)練數(shù)據(jù)集,所以它也是導(dǎo)致過擬合的一個(gè)要因。

例3:gamma = 0.01和100

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

C: 誤差項(xiàng)的懲罰參數(shù)C,它還控制著決策邊界的平滑與否和正確分類訓(xùn)練點(diǎn)之間的權(quán)衡。

例4:C = 100和1000

自始自終,我們都要記得用交叉驗(yàn)證來有效組合這些參數(shù),防止模型過擬合。

5. SVM的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn)

效果很好,分類邊界清晰;

在高維空間中特別有效;

在空間維數(shù)大于樣本數(shù)的情況下很有效;

它使用的是決策函數(shù)中的一個(gè)訓(xùn)練點(diǎn)子集(支持向量),所以占用內(nèi)存小,效率高。

缺點(diǎn)

如果數(shù)據(jù)量過大,或者訓(xùn)練時(shí)間過長(zhǎng),SVM會(huì)表現(xiàn)不佳;

如果數(shù)據(jù)集內(nèi)有大量噪聲,SVM效果不好;

SVM不直接計(jì)算提供概率估計(jì),所以我們要進(jìn)行多次交叉驗(yàn)證,代價(jià)過高。

小結(jié)

本文介紹了什么是支持向量機(jī)、SVM的工作原理、如何在Python和R中實(shí)現(xiàn)SVM、如何調(diào)參以及它的的優(yōu)點(diǎn)和缺點(diǎn)。希望讀者能在閱讀完畢后動(dòng)手試一試,不要受近年來出現(xiàn)的“有DL還要學(xué)SVM嗎?”的說法的影響,經(jīng)典的算法總有其可貴之處,它也是進(jìn)公司面試時(shí)的一大熱門題目。

如果不知道從何開始,可以嘗試做做論智的這道題:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SVM
    SVM
    +關(guān)注

    關(guān)注

    0

    文章

    154

    瀏覽量

    32364
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8320

    瀏覽量

    132165

原文標(biāo)題:從示例中理解SVM算法(附代碼)

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    支持向量機(jī)——機(jī)器學(xué)習(xí)中的殺手級(jí)武器!

    ` 本帖最后由 訊飛開放平臺(tái) 于 2018-8-24 09:44 編輯 作為模式識(shí)別或者機(jī)器學(xué)習(xí)的愛好者,同學(xué)們一定聽說過支持向量機(jī)這個(gè)
    發(fā)表于 08-24 09:40

    機(jī)器學(xué)習(xí)分類算法支持向量機(jī)SVM

    統(tǒng)計(jì)學(xué)習(xí)方法C++實(shí)現(xiàn)支持向量機(jī)SVM
    發(fā)表于 04-29 10:47

    支持向量機(jī)(SVM)Mercer定理與損失函數(shù)全面介紹

    支持向量機(jī)(SVM)Mercer定理與損失函數(shù)----5
    發(fā)表于 07-23 08:39

    支持向量機(jī)SVM

    支持向量機(jī)SVM
    發(fā)表于 05-20 10:21

    怎么理解支持向量機(jī)SVM

    支持向量機(jī)SVM理解篇
    發(fā)表于 06-14 09:05

    基于支持向量機(jī)(SVM)的工業(yè)過程辨識(shí)

    支持向量機(jī)應(yīng)用到典型的時(shí)變、非線性工業(yè)過程 連續(xù)攪拌反應(yīng)釜的辨識(shí)中, 并與BP 神經(jīng)網(wǎng)絡(luò)建模相比較, 仿真結(jié)果表明了支持向量
    發(fā)表于 03-30 16:12 ?42次下載
    基于<b class='flag-5'>支持</b><b class='flag-5'>向量</b><b class='flag-5'>機(jī)</b>(<b class='flag-5'>SVM</b>)的工業(yè)過程辨識(shí)

    支持向量機(jī)SVM引導(dǎo)_《OpenCV3編程入門》書本配套源代碼

    《OpenCV3編程入門》書本配套源代碼:支持向量機(jī)SVM引導(dǎo)
    發(fā)表于 06-06 15:52 ?2次下載

    支持向量機(jī)SVM引導(dǎo)_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-支持向量機(jī)SVM引導(dǎo),感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:02 ?1次下載

    基于機(jī)器學(xué)習(xí)支持向量機(jī)SVM的天氣識(shí)別和預(yù)報(bào)

    機(jī)器學(xué)習(xí)中有監(jiān)督學(xué)習(xí)模型支持向量機(jī)SVM來進(jìn)行強(qiáng)對(duì)
    發(fā)表于 11-10 17:46 ?1次下載

    機(jī)器學(xué)習(xí)-8. 支持向量機(jī)(SVMs)概述和計(jì)算

    支持向量機(jī)(Support Vector Machine: SVM)是一種非常有用的監(jiān)督式機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 04-02 08:49 ?5148次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>-8. <b class='flag-5'>支持</b><b class='flag-5'>向量</b><b class='flag-5'>機(jī)</b>(SVMs)概述和計(jì)算

    關(guān)于支持向量機(jī)(SVMs)

    支持向量機(jī)(Support Vector Machine: SVM)是一種非常有用的監(jiān)督式機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 04-02 08:52 ?4131次閱讀
    關(guān)于<b class='flag-5'>支持</b><b class='flag-5'>向量</b><b class='flag-5'>機(jī)</b>(SVMs)

    人工智能機(jī)器學(xué)習(xí)Analogizer算法-支持向量機(jī)SVM

    支持向量機(jī)SVM)是由Vapnik領(lǐng)導(dǎo)的AT&T Bell實(shí)驗(yàn)室研究小組在1995年提出的一種新的非常有潛力的分類技術(shù)。剛開始主要針對(duì)二值分類問題而提出,成功地應(yīng)用子解函數(shù)回歸及一類
    發(fā)表于 05-29 19:11 ?1988次閱讀

    OpenCV機(jī)器學(xué)習(xí)SVM支持向量機(jī)的分類程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是OpenCV機(jī)器學(xué)習(xí)SVM支持向量機(jī)的分類程序免費(fèi)下載。
    發(fā)表于 10-09 11:45 ?5次下載

    什么是支持向量機(jī) 什么是支持向量

    支持向量機(jī),英文為Support Vector Machine,簡(jiǎn)稱SV機(jī)(論文中一般簡(jiǎn)稱SVM)。它是一 種監(jiān)督式
    發(fā)表于 01-28 16:01 ?2.2w次閱讀
    什么是<b class='flag-5'>支持</b><b class='flag-5'>向量</b><b class='flag-5'>機(jī)</b> 什么是<b class='flag-5'>支持</b><b class='flag-5'>向量</b>

    圖解支持向量機(jī)SVM

    作者說:我以前一直沒有真正理解支持向量機(jī),直到我畫了一張圖。 1. 問題 支持向量機(jī)
    的頭像 發(fā)表于 12-26 11:46 ?2234次閱讀