(第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))
第01章 機(jī)器學(xué)習(xí)概覽
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機(jī)
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機(jī)森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動(dòng)和運(yùn)行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強(qiáng)化學(xué)習(xí)(上)
第16章 強(qiáng)化學(xué)習(xí)(下)
支持向量機(jī)(SVM)是個(gè)非常強(qiáng)大并且有多種功能的機(jī)器學(xué)習(xí)模型剖张,能夠做線性或者非線性的分類,回歸,甚至異常值檢測(cè)心剥。機(jī)器學(xué)習(xí)領(lǐng)域中最為流行的模型之一牵署,是任何學(xué)習(xí)機(jī)器學(xué)習(xí)的人必備的工具技掏。SVM 特別適合應(yīng)用于復(fù)雜但中小規(guī)模數(shù)據(jù)集的分類問題。
本章節(jié)將闡述支持向量機(jī)的核心概念择懂,怎么使用這個(gè)強(qiáng)大的模型约啊,以及它是如何工作的邑遏。
線性支持向量機(jī)分類
SVM 的基本思想能夠用一些圖片來解釋得很好,圖 5-1 展示了我們?cè)诘?章結(jié)尾處介紹的鳶尾花數(shù)據(jù)集的一部分恰矩。這兩個(gè)種類能夠被非常清晰记盒,非常容易的用一條直線分開(即線性可分的)。左邊的圖顯示了三種可能的線性分類器的判定邊界枢里。其中用虛線表示的線性模型判定邊界很差孽鸡,甚至不能正確地劃分類別。另外兩個(gè)線性模型在這個(gè)數(shù)據(jù)集表現(xiàn)的很好栏豺,但是它們的判定邊界很靠近樣本點(diǎn)彬碱,在新的數(shù)據(jù)上可能不會(huì)表現(xiàn)的很好。相比之下奥洼,右邊圖中 SVM 分類器的判定邊界實(shí)線巷疼,不僅分開了兩種類別,而且還盡可能地遠(yuǎn)離了最靠近的訓(xùn)練數(shù)據(jù)點(diǎn)。你可以認(rèn)為 SVM 分類器在兩種類別之間保持了一條盡可能寬敞的街道(圖中平行的虛線)嚼沿,其被稱為最大間隔分類估盘。
我們注意到添加更多的樣本點(diǎn)在“街道”外并不會(huì)影響到判定邊界,因?yàn)榕卸ㄟ吔缡怯晌挥凇敖值馈边吘壍臉颖军c(diǎn)確定的骡尽,這些樣本點(diǎn)被稱為“支持向量”(圖 5-1 中被圓圈圈起來的點(diǎn))遣妥。
警告
SVM 對(duì)特征縮放比較敏感,可以看到圖 5-2:左邊的圖中攀细,垂直的比例要更大于水平的比例箫踩,所以最寬的“街道”接近水平。但對(duì)特征縮放后(例如使用Scikit-Learn的StandardScaler)谭贪,判定邊界看起來要好得多境钟,如右圖。
軟間隔分類
如果我們嚴(yán)格地規(guī)定所有的數(shù)據(jù)都不在“街道”上俭识,都在正確的兩邊慨削,稱為硬間隔分類,硬間隔分類有兩個(gè)問題套媚,第一缚态,只對(duì)線性可分的數(shù)據(jù)起作用,第二堤瘤,對(duì)異常點(diǎn)敏感猿规。圖 5-3 顯示了只有一個(gè)異常點(diǎn)的鳶尾花數(shù)據(jù)集:左邊的圖中很難找到硬間隔,右邊的圖中判定邊界和我們之前在圖 5-1 中沒有異常點(diǎn)的判定邊界非常不一樣宙橱,它很難一般化。
為了避免上述的問題蘸拔,我們更傾向于使用更加軟性的模型师郑。目的在保持“街道”盡可能大和避免間隔違規(guī)(例如:數(shù)據(jù)點(diǎn)出現(xiàn)在“街道”中央或者甚至在錯(cuò)誤的一邊)之間找到一個(gè)良好的平衡。這就是軟間隔分類调窍。
在 Scikit-Learn 庫(kù)的 SVM 類宝冕,你可以用C
超參數(shù)(懲罰系數(shù))來控制這種平衡:較小的C
會(huì)導(dǎo)致更寬的“街道”,但更多的間隔違規(guī)邓萨。圖 5-4 顯示了在非線性可分隔的數(shù)據(jù)集上地梨,兩個(gè)軟間隔SVM分類器的判定邊界。左邊圖中缔恳,使用了較大的C
值宝剖,導(dǎo)致更少的間隔違規(guī),但是間隔較小歉甚。右邊的圖万细,使用了較小的C
值,間隔變大了纸泄,但是許多數(shù)據(jù)點(diǎn)出現(xiàn)在了“街道”上赖钞。然而腰素,第二個(gè)分類器似乎泛化地更好:事實(shí)上,在這個(gè)訓(xùn)練數(shù)據(jù)集上減少了預(yù)測(cè)錯(cuò)誤雪营,因?yàn)閷?shí)際上大部分的間隔違規(guī)點(diǎn)出現(xiàn)在了判定邊界正確的一側(cè)弓千。
提示
如果你的 SVM 模型過擬合,你可以嘗試通過減小超參數(shù)C
去調(diào)整献起。
以下的 Scikit-Learn 代碼加載了內(nèi)置的鳶尾花(Iris)數(shù)據(jù)集洋访,縮放特征,并訓(xùn)練一個(gè)線性 SVM 模型(使用LinearSVC
類征唬,超參數(shù)C=1
捌显,hinge 損失函數(shù))來檢測(cè) Virginica 鳶尾花,生成的模型在圖 5-4 的右圖总寒。
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.float64) # Iris-Virginica
svm_clf = Pipeline((
("scaler", StandardScaler()),
("linear_svc", LinearSVC(C=1, loss="hinge")),
))
svm_clf.fit(X_scaled, y)
Then, as usual, you can use the model to make predictions:
>>> svm_clf.predict([[5.5, 1.7]])
array([ 1.])
筆記
不同于 Logistic 回歸分類器扶歪,SVM 分類器不會(huì)輸出每個(gè)類別的概率。
作為一種選擇摄闸,你可以在 SVC 類善镰,使用SVC(kernel="linear", C=1)
,但是它比較慢年枕,尤其在較大的訓(xùn)練集上炫欺,所以一般不被推薦。另一個(gè)選擇是使用SGDClassifier
類熏兄,即SGDClassifier(loss="hinge", alpha=1/(m*C))
品洛。它應(yīng)用了隨機(jī)梯度下降(SGD 見第四章)來訓(xùn)練一個(gè)線性 SVM 分類器。盡管它不會(huì)和LinearSVC
一樣快速收斂摩桶,但是對(duì)于處理那些不適合放在內(nèi)存的大數(shù)據(jù)集是非常有用的桥状,或者處理在線分類任務(wù)同樣有用。
提示
LinearSVC
要使偏置項(xiàng)規(guī)范化硝清,首先你應(yīng)該集中訓(xùn)練集減去它的平均數(shù)辅斟。如果你使用了StandardScaler
,那么它會(huì)自動(dòng)處理芦拿。此外士飒,確保你設(shè)置loss
參數(shù)為hinge
,因?yàn)樗皇悄J(rèn)值蔗崎。最后酵幕,為了得到更好的效果,你需要將dual
參數(shù)設(shè)置為False
蚁趁,除非特征數(shù)比樣本量多(我們將在本章后面討論二元性)
非線性支持向量機(jī)分類
盡管線性 SVM 分類器在許多案例上表現(xiàn)得出乎意料的好裙盾,但是很多數(shù)據(jù)集并不是線性可分的。一種處理非線性數(shù)據(jù)集方法是增加更多的特征,例如多項(xiàng)式特征(正如你在第4章所做的那樣)番官;在某些情況下可以變成線性可分的數(shù)據(jù)庐完。在圖 5-5的左圖中,它只有一個(gè)特征x1
的簡(jiǎn)單的數(shù)據(jù)集徘熔,正如你看到的门躯,該數(shù)據(jù)集不是線性可分的。但是如果你增加了第二個(gè)特征 x2=(x1)^2
酷师,產(chǎn)生的 2D 數(shù)據(jù)集就能很好的線性可分讶凉。
為了實(shí)施這個(gè)想法,通過 Scikit-Learn山孔,你可以創(chuàng)建一個(gè)管道(Pipeline)去包含多項(xiàng)式特征(PolynomialFeatures)變換(在 121 頁(yè)的“Polynomial Regression”中討論)懂讯,然后一個(gè)StandardScaler
和LinearSVC
。讓我們?cè)谛l(wèi)星數(shù)據(jù)集(moons datasets)測(cè)試一下效果台颠。
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
polynomial_svm_clf = Pipeline((
("poly_features", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge"))
))
polynomial_svm_clf.fit(X, y)
多項(xiàng)式核
添加多項(xiàng)式特征很容易實(shí)現(xiàn)褐望,不僅僅在 SVM,在各種機(jī)器學(xué)習(xí)算法都有不錯(cuò)的表現(xiàn)串前,但是低次數(shù)的多項(xiàng)式不能處理非常復(fù)雜的數(shù)據(jù)集瘫里,而高次數(shù)的多項(xiàng)式卻產(chǎn)生了大量的特征,會(huì)使模型變慢荡碾。
幸運(yùn)的是谨读,當(dāng)你使用 SVM 時(shí),你可以運(yùn)用一個(gè)被稱為“核技巧”(kernel trick)的神奇數(shù)學(xué)技巧坛吁。它可以取得就像你添加了許多多項(xiàng)式劳殖,甚至有高次數(shù)的多項(xiàng)式,一樣好的結(jié)果拨脉。因?yàn)槟悴]有增加任何特征闷尿,所以不會(huì)導(dǎo)致大量特征的組合爆炸。這個(gè)技巧可以用 SVC 類來實(shí)現(xiàn)女坑。讓我們?cè)谛l(wèi)星數(shù)據(jù)集測(cè)試一下效果。
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline((
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
))
poly_kernel_svm_clf.fit(X, y)
這段代碼用3階的多項(xiàng)式核訓(xùn)練了一個(gè) SVM 分類器统舀,即圖 5-7 的左圖匆骗。右圖是使用了10階的多項(xiàng)式核 SVM 分類器。很明顯誉简,如果你的模型過擬合碉就,你可以減小多項(xiàng)式核的階數(shù)。相反的闷串,如果是欠擬合瓮钥,你可以嘗試增大它。超參數(shù)coef0
控制了高階多項(xiàng)式與低階多項(xiàng)式對(duì)模型的影響。
通用的方法是用網(wǎng)格搜索(grid search 見第 2 章)去找到最優(yōu)超參數(shù)碉熄。首先進(jìn)行非常粗略的網(wǎng)格搜索一般會(huì)很快桨武,然后在找到的最佳值進(jìn)行更細(xì)的網(wǎng)格搜索。對(duì)每個(gè)超參數(shù)的作用有一個(gè)很好的理解可以幫助你在正確的超參數(shù)空間找到合適的值锈津。
增加相似特征
另一種解決非線性問題的方法是使用相似函數(shù)(similarity funtion)計(jì)算每個(gè)樣本與特定地標(biāo)(landmark)的相似度呀酸。例如,讓我們來看看前面討論過的一維數(shù)據(jù)集琼梆,并在x1=-2
和x1=1
之間增加兩個(gè)地標(biāo)(圖 5-8 左圖)性誉。接下來,我們定義一個(gè)相似函數(shù)茎杂,即高斯徑向基函數(shù)(Gaussian Radial Basis Function错览,RBF),設(shè)置γ = 0.3
(見公式 5-1)
公式 5-1 高斯RBF
它是一個(gè)從 0 到 1 的鐘型函數(shù)煌往,值為 0 的離地標(biāo)很遠(yuǎn)倾哺,值為 1 的在地標(biāo)上。現(xiàn)在我們準(zhǔn)備計(jì)算新特征携冤。例如悼粮,我們看一下樣本x1=-1
:它距離第一個(gè)地標(biāo)距離是 1,距離第二個(gè)地標(biāo)是 2曾棕。因此它的新特征為x2=exp(-0.3 × (1^2))≈0.74
和x3=exp(-0.3 × (2^2))≈0.30
扣猫。圖 5-8 右邊的圖顯示了特征轉(zhuǎn)換后的數(shù)據(jù)集(刪除了原始特征),正如你看到的翘地,它現(xiàn)在是線性可分的申尤。
你可能想知道如何選擇地標(biāo)。最簡(jiǎn)單的方法是在數(shù)據(jù)集中的每一個(gè)樣本的位置創(chuàng)建地標(biāo)衙耕。這將產(chǎn)生更多的維度昧穿,從而增加了轉(zhuǎn)換后數(shù)據(jù)集是線性可分的可能性。但缺點(diǎn)是橙喘,m
個(gè)樣本时鸵,n
個(gè)特征的訓(xùn)練集被轉(zhuǎn)換成了m
個(gè)實(shí)例,m
個(gè)特征的訓(xùn)練集(假設(shè)你刪除了原始特征)厅瞎。這樣一來饰潜,如果你的訓(xùn)練集非常大,你最終會(huì)得到同樣大的特征和簸。
高斯RBF核
就像多項(xiàng)式特征法一樣彭雾,相似特征法對(duì)各種機(jī)器學(xué)習(xí)算法同樣也有不錯(cuò)的表現(xiàn)。但是在所有額外特征上的計(jì)算成本可能很高锁保,特別是在大規(guī)模的訓(xùn)練集上薯酝。然而半沽,“核” 技巧再一次顯現(xiàn)了它在 SVM 上的神奇之處:高斯核讓你可以獲得同樣好的結(jié)果成為可能,就像你在相似特征法添加了許多相似特征一樣吴菠,但事實(shí)上者填,你并不需要在RBF添加它們。我們使用SVC類的高斯RBF核來檢驗(yàn)一下橄务。
rbf_kernel_svm_clf = Pipeline((
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
))
rbf_kernel_svm_clf.fit(X, y)
這個(gè)模型在圖 5-9 的左下角表示幔托。其他的圖顯示了用不同的超參數(shù)gamma (γ)
和C
訓(xùn)練的模型。增大γ
使鐘型曲線更窄(圖 5-8 左圖)蜂挪,導(dǎo)致每個(gè)樣本的影響范圍變得更兄靥簟:即判定邊界最終變得更不規(guī)則,在單個(gè)樣本周圍環(huán)繞棠涮。相反的谬哀,較小的γ
值使鐘型曲線更寬,樣本有更大的影響范圍严肪,判定邊界最終則更加平滑史煎。所以γ是可調(diào)整的超參數(shù):如果你的模型過擬合,你應(yīng)該減小γ
值驳糯,若欠擬合篇梭,則增大γ
(與超參數(shù)C
相似)。
還有其他的核函數(shù)酝枢,但很少使用恬偷。例如,一些核函數(shù)是專門用于特定的數(shù)據(jù)結(jié)構(gòu)帘睦。在對(duì)文本文檔或者 DNA 序列進(jìn)行分類時(shí)袍患,有時(shí)會(huì)使用字符串核(String kernels)(例如,使用 SSK 核(string subsequence kernel)或者基于編輯距離(Levenshtein distance)的核函數(shù))竣付。
提示
這么多可供選擇的核函數(shù)诡延,你如何決定使用哪一個(gè)?一般來說古胆,你應(yīng)該先嘗試線性核函數(shù)(記住LinearSVC
比SVC(kernel="linear")
要快得多)肆良,尤其是當(dāng)訓(xùn)練集很大或者有大量的特征的情況下。如果訓(xùn)練集不太大逸绎,你也可以嘗試高斯RBF核妖滔,它在大多數(shù)情況下都很有效。如果你有空閑的時(shí)間和計(jì)算能力桶良,你還可以使用交叉驗(yàn)證和網(wǎng)格搜索來試驗(yàn)其他的核函數(shù),特別是有專門用于你的訓(xùn)練集數(shù)據(jù)結(jié)構(gòu)的核函數(shù)沮翔。
計(jì)算復(fù)雜性
LinearSVC
類基于liblinear
庫(kù)陨帆,它實(shí)現(xiàn)了線性 SVM 的優(yōu)化算法曲秉。它并不支持核技巧,但是它的樣本和特征的數(shù)量幾乎是線性的:訓(xùn)練時(shí)間復(fù)雜度大約為O(m × n)
疲牵。
如果你要非常高的精度承二,這個(gè)算法需要花費(fèi)更多時(shí)間。這是由容差值超參數(shù)?
(在 Scikit-learn 稱為tol
)控制的纲爸。在大多數(shù)分類任務(wù)中亥鸠,使用默認(rèn)容差值就行。
SVC 類基于libsvm
庫(kù)识啦,它實(shí)現(xiàn)了支持核技巧的算法负蚊。訓(xùn)練時(shí)間復(fù)雜度通常介于O(m^2 × n)
和O(m^3 × n)
之間。不幸的是颓哮,這意味著當(dāng)訓(xùn)練樣本變大時(shí)家妆,它將變得極其慢(例如,成千上萬個(gè)樣本)冕茅。這個(gè)算法對(duì)于復(fù)雜但小型或中等數(shù)量的數(shù)據(jù)集表現(xiàn)是完美的伤极。然而,它能對(duì)特征數(shù)量很好的縮放姨伤,尤其對(duì)稀疏特征來說(sparse features)(即每個(gè)樣本都有一些非零特征)哨坪。在這個(gè)情況下,算法對(duì)每個(gè)樣本的非零特征的平均數(shù)量進(jìn)行大概的縮放乍楚。表 5-1 對(duì) Scikit-learn 的 SVM 分類模型進(jìn)行比較当编。
SVM 回歸
正如我們之前提到的旋奢,SVM 算法應(yīng)用廣泛:不僅僅支持線性和非線性的分類任務(wù)秘蛔,還支持線性和非線性的回歸任務(wù)。技巧在于逆轉(zhuǎn)我們的目標(biāo):限制間隔違規(guī)的情況下决侈,不是試圖在兩個(gè)類別之間找到盡可能大的“街道”(即間隔)词渤。SVM 回歸任務(wù)是限制間隔違規(guī)情況下牵舱,盡量放置更多的樣本在“街道”上∪迸埃“街道”的寬度由超參數(shù)?
控制芜壁。圖 5-10 顯示了在一些隨機(jī)生成的線性數(shù)據(jù)上,兩個(gè)線性 SVM 回歸模型的訓(xùn)練情況高氮。一個(gè)有較大的間隔(?=1.5
)慧妄,另一個(gè)間隔較小(?=0.5
)剪芍。
添加更多的數(shù)據(jù)樣本在間隔之內(nèi)并不會(huì)影響模型的預(yù)測(cè)塞淹,因此,這個(gè)模型認(rèn)為是?不敏感的(?-insensitive)罪裹。
你可以使用 Scikit-Learn 的LinearSVR
類去實(shí)現(xiàn)線性 SVM 回歸饱普。下面的代碼產(chǎn)生的模型在圖 5-10 左圖(訓(xùn)練數(shù)據(jù)需要被中心化和標(biāo)準(zhǔn)化)
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)
處理非線性回歸任務(wù)运挫,你可以使用核化的 SVM 模型。比如套耕,圖 5-11 顯示了在隨機(jī)二次方的訓(xùn)練集谁帕,使用二次方多項(xiàng)式核函數(shù)的 SVM 回歸。左圖是較小的正則化(即更大的C
值)冯袍,右圖則是更大的正則化(即小的C
值)
下面的代碼產(chǎn)生了圖 5-11左邊的模型匈挖,其使用了 Scikit-Learn 的SVR
類(支持核技巧)。在回歸任務(wù)上康愤,SVR
類和SVC
類是一樣的儡循,并且LinearSVR
是和LinearSVC
等價(jià)。LinearSVR
類和訓(xùn)練集的大小成線性(就像LinearSVC
類)翘瓮,當(dāng)訓(xùn)練集變大贮折,SVR
會(huì)變的很慢(就像SVC
類)
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)
筆記
SVM 也可以用來做異常值檢測(cè),詳情見 Scikit-Learn 文檔资盅。
背后機(jī)制
這個(gè)章節(jié)從線性 SVM 分類器開始调榄,將解釋 SVM 是如何做預(yù)測(cè)的并且算法是如何工作的。如果你是剛接觸機(jī)器學(xué)習(xí)呵扛,你可以跳過這個(gè)章節(jié)每庆,直接進(jìn)入本章末尾的練習(xí)。等到你想深入了解 SVM今穿,再回頭研究這部分內(nèi)容缤灵。
首先,關(guān)于符號(hào)的約定:在第 4 章蓝晒,我們將所有模型參數(shù)放在一個(gè)矢量θ
里腮出,包括偏置項(xiàng)θ0
,θ1
到θn
的輸入特征權(quán)重芝薇,和增加一個(gè)偏差輸入x0 = 1
到所有樣本胚嘲。在本章中,我們將使用一個(gè)不同的符號(hào)約定洛二,在處理 SVM 上馋劈,這更方便,也更常見:偏置項(xiàng)被命名為b
晾嘶,特征權(quán)重向量被稱為w
妓雾,在輸入特征向量中不再添加偏置特征。
決策函數(shù)和預(yù)測(cè)
線性 SVM 分類器通過簡(jiǎn)單地計(jì)算決策函數(shù)來預(yù)測(cè)新樣本的類別:如果結(jié)果是正的垒迂,預(yù)測(cè)類別
?
是正類械姻,為 1,否則他就是負(fù)類机断,為 0楷拳。見公式 5-2
圖 5-12 顯示了和圖 5-4 右邊圖模型相對(duì)應(yīng)的決策函數(shù):因?yàn)檫@個(gè)數(shù)據(jù)集有兩個(gè)特征(花瓣的寬度和花瓣的長(zhǎng)度)材部,所以是個(gè)二維的平面。決策邊界是決策函數(shù)等于 0 的點(diǎn)的集合唯竹,圖中兩個(gè)平面的交叉處,即一條直線(圖中的實(shí)線)
虛線表示的是那些決策函數(shù)等于 1 或 -1 的點(diǎn):它們平行苦丁,且到?jīng)Q策邊界的距離相等浸颓,形成一個(gè)間隔。訓(xùn)練線性 SVM 分類器意味著找到w
值和b
值使得這一個(gè)間隔盡可能大旺拉,同時(shí)避免間隔違規(guī)(硬間隔)或限制它們(軟間隔)产上。
訓(xùn)練目標(biāo)
看下決策函數(shù)的斜率:它等于權(quán)重向量的范數(shù)。如果我們把這個(gè)斜率除于 2蛾狗,決策函數(shù)等于 ±1 的點(diǎn)將會(huì)離決策邊界原來的兩倍大晋涣。換句話,即斜率除以 2沉桌,那么間隔將增加兩倍谢鹊。在圖 5-13 中,2D 形式比較容易可視化留凭。權(quán)重向量
w
越小佃扼,間隔越大。
所以我們的目標(biāo)是最小化蔼夜,從而獲得大的間隔兼耀。然而,如果我們想要避免間隔違規(guī)(硬間隔)求冷,對(duì)于正的訓(xùn)練樣本瘤运,我們需要決策函數(shù)大于 1,對(duì)于負(fù)訓(xùn)練樣本匠题,小于 -1拯坟。若我們對(duì)負(fù)樣本(即
定義
,對(duì)正樣本(即
定義
梧躺,那么我們可以對(duì)所有的樣本表示為
似谁。
因此,我們可以將硬間隔線性 SVM 分類器表示為公式 5-3 中的約束優(yōu)化問題掠哥。
筆記
等于
巩踏,我們最小化
,而不是最小化
续搀。這會(huì)給我們相同的結(jié)果(因?yàn)樽钚』?code>w值和
b
值塞琼,也是最小化該值一半的平方),但是有很好又簡(jiǎn)單的導(dǎo)數(shù)(只有
w
)禁舷,在
w=0
處是不可微的彪杉。優(yōu)化算法在可微函數(shù)表現(xiàn)得更好毅往。
為了獲得軟間隔的目標(biāo),我們需要對(duì)每個(gè)樣本應(yīng)用一個(gè)松弛變量(slack variable)派近。
表示了第
i
個(gè)樣本允許違規(guī)間隔的程度攀唯。我們現(xiàn)在有兩個(gè)不一致的目標(biāo):一個(gè)是使松弛變量盡可能的小,從而減小間隔違規(guī)渴丸,另一個(gè)是使1/2 w·w
盡量小侯嘀,從而增大間隔。這時(shí)C
超參數(shù)發(fā)揮作用:它允許我們?cè)趦蓚€(gè)目標(biāo)之間權(quán)衡谱轨。我們得到了公式 5-4 的約束優(yōu)化問題戒幔。
二次規(guī)劃
硬間隔和軟間隔都是線性約束的凸二次規(guī)劃優(yōu)化問題。這些問題被稱之為二次規(guī)劃(QP)問題⊥镣現(xiàn)在有許多解決方案可以使用各種技術(shù)來處理 QP 問題诗茎,但這超出了本書的范圍。一般問題的公式在公式 5-5 給出献汗。
注意到表達(dá)式Ap ≤ b
實(shí)際上定義了 約束:
敢订,
是個(gè)包含了
A
的第i
行元素的向量,是
b
的第i
個(gè)元素雀瓢。
可以很容易地看到枢析,如果你用以下的方式設(shè)置 QP 的參數(shù),你將獲得硬間隔線性 SVM 分類器的目標(biāo):
-
刃麸,
n
表示特征的數(shù)量(+1 是偏置項(xiàng)) -
醒叁,
m
表示訓(xùn)練樣本數(shù)量 -
H
是單位矩陣,除了左上角為 0(忽略偏置項(xiàng))
-
f = 0
泊业,一個(gè)全為 0 的維向量
-
把沼,一個(gè)全為 1 的
維向量
-
,
等于
帶一個(gè)額外的偏置特征
所以訓(xùn)練硬間隔線性 SVM 分類器的一種方式是使用現(xiàn)有的 QP 解決方案吁伺,即上述的參數(shù)饮睬。由此產(chǎn)生的向量p
將包含偏置項(xiàng) 和特征權(quán)重
。同樣的篮奄,你可以使用 QP 解決方案來解決軟間隔問題(見本章最后的練習(xí))
然而捆愁,使用核技巧我們將會(huì)看到一個(gè)不同的約束優(yōu)化問題。
對(duì)偶問題
給出一個(gè)約束優(yōu)化問題窟却,即原始問題(primal problem)昼丑,它可能表示不同但是和另一個(gè)問題緊密相連,稱為對(duì)偶問題(Dual Problem)夸赫。對(duì)偶問題的解通常是對(duì)原始問題的解給出一個(gè)下界約束菩帝,但在某些條件下,它們可以獲得相同解。幸運(yùn)的是呼奢,SVM 問題恰好滿足這些條件宜雀,所以你可以選擇解決原始問題或者對(duì)偶問題,兩者將會(huì)有相同解握础。公式 5-6 表示了線性 SVM 的對(duì)偶形式(如果你對(duì)怎么從原始問題獲得對(duì)偶問題感興趣辐董,可以看下附錄 C)
一旦你找到最小化公式的向量α
(使用 QP 解決方案),你可以通過使用公式 5-7 的方法計(jì)算w
和b
禀综,從而使原始問題最小化郎哭。
當(dāng)訓(xùn)練樣本的數(shù)量比特征數(shù)量小的時(shí)候,對(duì)偶問題比原始問題要快得多菇存。更重要的是,它讓核技巧成為可能邦蜜,而原始問題則不然依鸥。那么這個(gè)核技巧是怎么樣的呢?
核化支持向量機(jī)
假設(shè)你想把一個(gè) 2 次多項(xiàng)式變換應(yīng)用到二維空間的訓(xùn)練集(例如衛(wèi)星數(shù)據(jù)集)悼沈,然后在變換后的訓(xùn)練集上訓(xùn)練一個(gè)線性SVM分類器贱迟。公式 5-8 顯示了你想應(yīng)用的 2 次多項(xiàng)式映射函數(shù)?
。
注意到轉(zhuǎn)換后的向量是 3 維的而不是 2 維絮供。如果我們應(yīng)用這個(gè) 2 次多項(xiàng)式映射衣吠,然后計(jì)算轉(zhuǎn)換后向量的點(diǎn)積(見公式 5-9),讓我們看下兩個(gè) 2 維向量a
和b
會(huì)發(fā)生什么壤靶。
轉(zhuǎn)換后向量的點(diǎn)積等于原始向量點(diǎn)積的平方:
關(guān)鍵點(diǎn)是:如果你應(yīng)用轉(zhuǎn)換?
到所有訓(xùn)練樣本缚俏,那么對(duì)偶問題(見公式 5-6)將會(huì)包含點(diǎn)積 。但如果
?
像在公式 5-8 定義的 2 次多項(xiàng)式轉(zhuǎn)換贮乳,那么你可以將這個(gè)轉(zhuǎn)換后的向量點(diǎn)積替換成 忧换。所以實(shí)際上你根本不需要對(duì)訓(xùn)練樣本進(jìn)行轉(zhuǎn)換:僅僅需要在公式 5-6 中,將點(diǎn)積替換成它點(diǎn)積的平方向拆。結(jié)果將會(huì)和你經(jīng)過麻煩的訓(xùn)練集轉(zhuǎn)換并擬合出線性 SVM 算法得出的結(jié)果一樣亚茬,但是這個(gè)技巧使得整個(gè)過程在計(jì)算上面更有效率。這就是核技巧的精髓浓恳。
函數(shù) 被稱為二次多項(xiàng)式核(polynomial kernel)刹缝。在機(jī)器學(xué)習(xí)中,核函數(shù)是一個(gè)能計(jì)算點(diǎn)積的函數(shù)颈将,并只基于原始向量
a
和b
梢夯,不需要計(jì)算(甚至知道)轉(zhuǎn)換?
。公式 5-10 列舉了一些最常用的核函數(shù)吆鹤。
Mercer 定理
根據(jù) Mercer 定理厨疙,如果函數(shù)K(a, b)
滿足一些 Mercer 條件的數(shù)學(xué)條件(K
函數(shù)在參數(shù)內(nèi)必須是連續(xù),對(duì)稱,即K(a, b)=K(b, a)
沾凄,等)梗醇,那么存在函數(shù)?
,將a
和b
映射到另一個(gè)空間(可能有更高的維度)撒蟀,有叙谨。所以你可以用
K
作為核函數(shù),即使你不知道?
是什么保屯。使用高斯核(Gaussian RBF kernel)情況下手负,它實(shí)際是將每個(gè)訓(xùn)練樣本映射到無限維空間,所以你不需要知道是怎么執(zhí)行映射的也是一件好事姑尺。
注意一些常用核函數(shù)(例如 Sigmoid 核函數(shù))并不滿足所有的 Mercer 條件竟终,然而在實(shí)踐中通常表現(xiàn)得很好。
我們還有一個(gè)問題要解決切蟋。公式 5-7 展示了線性 SVM 分類器如何從對(duì)偶解到原始解统捶,如果你應(yīng)用了核技巧那么得到的公式會(huì)包含 。事實(shí)上柄粹,
w
必須和 有同樣的維度喘鸟,可能是巨大的維度或者無限的維度,所以你很難計(jì)算它驻右。但怎么在不知道
w
的情況下做出預(yù)測(cè)什黑?好消息是你可以將公式 5-7 的w
代入到新的樣本 的決策函數(shù)中,你會(huì)得到一個(gè)在輸入向量之間只有點(diǎn)積的方程式堪夭。這時(shí)愕把,核技巧將派上用場(chǎng),見公式 5-11
注意到支持向量才滿足α(i)≠0
森爽,做出預(yù)測(cè)只涉及計(jì)算為支持向量部分的輸入樣本 的點(diǎn)積礼华,而不是全部的訓(xùn)練樣本。當(dāng)然拗秘,你同樣也需要使用同樣的技巧來計(jì)算偏置項(xiàng)
b
圣絮,見公式 5-12
如果你開始感到頭痛,這很正常:因?yàn)檫@是核技巧一個(gè)不幸的副作用
在線支持向量機(jī)
在結(jié)束這一章之前雕旨,我們快速地了解一下在線 SVM 分類器(回想一下扮匠,在線學(xué)習(xí)意味著增量地學(xué)習(xí),不斷有新實(shí)例)凡涩。對(duì)于線性SVM分類器棒搜,一種方式是使用梯度下降(例如使用SGDClassifire
)最小化代價(jià)函數(shù),如從原始問題推導(dǎo)出的公式 5-13活箕。不幸的是力麸,它比基于 QP 方式收斂慢得多。
代價(jià)函數(shù)第一個(gè)和會(huì)使模型有一個(gè)小的權(quán)重向量w
,從而獲得一個(gè)更大的間隔克蚂。第二個(gè)和計(jì)算所有間隔違規(guī)的總數(shù)闺鲸。如果樣本位于“街道”上和正確的一邊,或它與“街道”正確一邊的距離成比例埃叭,則間隔違規(guī)等于 0摸恍。最小化保證了模型的間隔違規(guī)盡可能小并且少。
Hinge 損失
函數(shù)
max(0, 1–t)
被稱為 Hinge 損失函數(shù)(如下)赤屋。當(dāng)t≥1
時(shí)立镶,Hinge 值為 0。如果t<1
,它的導(dǎo)數(shù)(斜率)為 -1类早,若t>1
媚媒,則等于0。在t=1
處涩僻,它是不可微的欣范,但就像套索回歸(Lasso Regression)(參見 130 頁(yè)套索回歸)一樣,你仍然可以在t=0
時(shí)使用梯度下降法(即 -1 到 0 之間任何值)
我們也可以實(shí)現(xiàn)在線核化的 SVM令哟。例如使用“增量和遞減 SVM 學(xué)習(xí)”或者“在線和主動(dòng)的快速核分類器”。但是妨蛹,這些都是用 Matlab 和 C++ 實(shí)現(xiàn)的屏富。對(duì)于大規(guī)模的非線性問題,你可能需要考慮使用神經(jīng)網(wǎng)絡(luò)(見第二部分)蛙卤。
練習(xí)
支持向量機(jī)背后的基本思想是什么狠半?
什么是支持向量?
當(dāng)使用 SVM 時(shí)颤难,為什么標(biāo)準(zhǔn)化輸入很重要神年?
分類一個(gè)樣本時(shí),SVM 分類器能夠輸出一個(gè)置信值嗎行嗤?概率呢已日?
在一個(gè)有數(shù)百萬訓(xùn)練樣本和數(shù)百特征的訓(xùn)練集上,你是否應(yīng)該使用 SVM 原始形式或?qū)ε夹问絹碛?xùn)練一個(gè)模型栅屏?
假設(shè)你用 RBF 核來訓(xùn)練一個(gè) SVM 分類器飘千,如果對(duì)訓(xùn)練集欠擬合:你應(yīng)該增大或者減小
γ
嗎?調(diào)整參數(shù)C
呢栈雳?使用現(xiàn)有的 QP 解決方案护奈,你應(yīng)該怎么樣設(shè)置 QP 參數(shù)(
H
,f
哥纫,A
霉旗,和b
)去解決一個(gè)軟間隔線性 SVM 分類器問題?在一個(gè)線性可分的數(shù)據(jù)集訓(xùn)練一個(gè)
LinearSVC
,并在同一個(gè)數(shù)據(jù)集上訓(xùn)練一個(gè)SVC
和SGDClassifier
厌秒,看它們是否產(chǎn)生了大致相同效果的模型读拆。在 MNIST 數(shù)據(jù)集上訓(xùn)練一個(gè) SVM 分類器。因?yàn)?SVM 分類器是二元分類简僧,你需要使用一對(duì)多(one-versus-all)來對(duì) 10 個(gè)數(shù)字進(jìn)行分類建椰。你可能需要使用小的驗(yàn)證集來調(diào)整超參數(shù)以加快進(jìn)程。最后你能達(dá)到多少準(zhǔn)確度岛马?
在加利福尼亞住宅(California housing)數(shù)據(jù)集上訓(xùn)練一個(gè) SVM 回歸模型棉姐?
習(xí)題答案在附錄 A。
(第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))
第01章 機(jī)器學(xué)習(xí)概覽
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)
第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(下)
第03章 分類
第04章 訓(xùn)練模型
第05章 支持向量機(jī)
第06章 決策樹
第07章 集成學(xué)習(xí)和隨機(jī)森林
第08章 降維
(第二部分 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))
第9章 啟動(dòng)和運(yùn)行TensorFlow
第10章 人工神經(jīng)網(wǎng)絡(luò)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(上)
第11章 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(下)
第12章 設(shè)備和服務(wù)器上的分布式 TensorFlow
第13章 卷積神經(jīng)網(wǎng)絡(luò)
第14章 循環(huán)神經(jīng)網(wǎng)絡(luò)
第15章 自編碼器
第16章 強(qiáng)化學(xué)習(xí)(上)
第16章 強(qiáng)化學(xué)習(xí)(下)