machine learning 下的support vector machine實作(使用python)

yuwei
Jacky’s blog
Published in
Oct 6, 2018

想必大家都已經看過之前的linear regression 和logistic regression實作的演算法, 我也將在這邊繼續為各位實作support vector machine, 順序也依序是function, loss function, data 的格式, 也謝謝各位舊雨新知的人們來觀看小弟的文章, 我也會繼續努力的, 那就讓我們開始吧!

Support Vector machine

source

1. function

首先svm這是一個機器學習下的演算法, 可以應用在regression和classification的一個強大的演算法, 但通常用在classification, 會follow一個最佳的hyperplane(超平面)(在2維時會是線性)下分類出兩個或多個target, 而你一定會好奇, 那什麼是support vectors呢? 就是為了離hyperplane最近的點, 來讓演算法可以倚靠這些點去做最有效的分割, 如果把這些support vectors拔掉, 就會扭轉hyperplane的位置, 所以support vectors 是很重要的!

在function的部分,其實是與linear regressiont差不多的都是

只是返回出來的會是如果是target1就是+1, target2就是-1

2. Loss function

現在, 我們要經歷比較特別的Loss function,是由正規化(regularization)和hinge loss來組成,目的依舊是將loss function最小化,並透過gradient descent的方法求出w參數,

以線性的SVM為主的話, 我這邊會使用siraj大神裡面github對svm所闡述的內容

首先是hinge loss

source

c為loss function, x為樣本,y代表的是real target,而f(x)則為predicted target, 那個+的意思是如果>0,就會以原本的loss function表示,如果<0,loss function就會是0

我們的目的是要求loss function的最小, 但是當我們的learning rate過高時, 在做gradient descent(梯度下降)時, 有可能會錯過最佳點, 如果learning rate太低時, 有可能會花太久時間而無法收斂到最佳解, 這個時候, 就必須派’regularizer’登場了, 藉由它來調整W的變動幅度

在這邊我們使用的是L2 (Ridge)的regularization

所以現在objective function為

我們便是要將上圖的objective function最佳化, 但我只能說, 真的不容易

3. data

一樣, 我也將繼續從引入資料集開始, 一步一步的向大家介紹

1. Gradient Descent

ok, 我們已經引入資料集了,接下來我們要開始針對target去做處理,原因是因為在hyperplane分兩類的過程中,該hyperplane為0 ,而兩邊分別為’正’的hyperplane +1和’負’的hyperplane -1

for i in range(len(y)):
if y[i]==0:
y[i]=-1

現在我要建立分別取出最大和最小的值,可以供我等一下的bias建立, 可以更宏觀的建立最佳的bias

太好了, 在training資料集之前,都已經把要建立的相關資料都建立好了, 再來, 是會比較痛苦的步驟, 我自己也花了一些時間去研究這些痛苦的過程, 但我痛苦就好了, 我的目的也是為了讓你們比較好懂,剛剛上面的公式經過gradient descent 之後,會呈現兩種情況,

但首先,先給看看在siraj大神給大家看得gradient descent

source

1. 準確預測的時候

因為在準確預測的時候,你會在margin所畫出線的兩邊, 表示你在預測該值屬於1,實際上也確實為1, 相乘起來便會是1, 即使大於1,相乘起來也對會是正的, 而預測-1,結果為-1的target,也與上述相同, 所以根據上圖,我們可確認只有yi*yhat(預測值)≥1的話,針對hinge loss 的微分值就會是0, w的調整方程式就為

2. 沒有準確預測的時候

現在的情況為,如果預測沒成功,表示會變成-yi*xi,所以新的方程式會屬於

在這邊, 我已經介紹完這兩種狀況, 我也將開始貼上code, 如果在這裡已經頭暈了,可以寄信給我,問我你不了解的部分, 我可以盡我的微薄力量幫助你,

好的,那就讓我們繼續,

落落長的, 對但這僅是linear svc的部分, 非linear 的部分我將只會帶領大家使用sklearn的方法而已

這是我們所找到的最好的weight值

接下來就來到了畫圖的部分, 我也將依據hyperplane分成3個不同的hyperplane (0, 1 ,-1)去做分割, 在這邊, 我沒有達到最佳解, 我還在試圖尋找原因, 如有知道如何解的, 煩請再來信(jacky308082@gmail.com)告訴我

呼~真的不容易, 相信你們會比較難消化, 但各位可以看到雖然還有參數需要再被調整, 但已經很趨近完美分割了

2. Scikit Learn

以sklearn來表達svm模型就會變得稍微簡單一點, 但在繪圖上還是會有點tricky的

首先依舊是import sklearn 裡的svm, 再告訴model說要用linear方式表達之

from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(x,y)

這樣模型就建立好了, 是不是很棒

接下來我們就來看weight和bias

可以看得出來,剛剛透過gradient descent 的方法所獲得的並離這些好的weight還是有點差距, 也煩請各位前輩指導小弟我了, 輪到畫圖階段了

在處理完線性的linear svm之後, 我就簡單的使用同一個dataset來向各位示範一下 non linear svm要怎麼使用囉!

non linear 的svm其實和linear regression中的一元多次方程式很相似, 我們也都會再次import Polynomial和 標準化

from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

再來就是全部放入Pipeline裡,並fit 資料

很簡單的, 我們有建立好了新的definition, 放入資料, 套上去

plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='autumn')
poly_polynoimal_svm_classifier(polynoimal_svm_classifier)

結論

這樣的話, svm就簡單的介紹完成了,謝謝你們堅持到這一刻, machine learning依舊是博大精深, 在這篇文章中, 我也只是碰到一點皮毛而已, 但堅持下去, 收穫就會是你的, 一起加油!

同樣的, 如果有任何問題都可以來信與我討論, 我的信箱是jacky308082@gmail.com

謝謝!

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/