【机器学习基础】(四):通俗理解支持向量机SVM及代码实践
上一篇文章我們介紹了使用邏輯回歸來處理分類問題,本文我們講一個更強大的分類模型。本文依舊側重代碼實踐,你會發現我們解決問題的手段越來越豐富,問題處理起來越來越簡單。
支持向量機(Support Vector Machine, SVM)是最受歡迎的機器學習模型之一。它特別適合處理中小型復雜數據集的分類任務。
一、什么是支持向量機
SMV在眾多實例中尋找一個最優的決策邊界,這個邊界上的實例叫做支持向量,它們“支持”(支撐)分離開超平面,所以它叫支持向量機。
那么我們如何保證我們得到的決策邊界是最優的呢?
如上圖,三條黑色直線都可以完美分割數據集。由此可知,我們僅用單一直線可以得到無數個解。那么,其中怎樣的直線是最優的呢?
如上圖,我們計算直線到分割實例的距離,使得我們的直線與數據集的距離盡可能的遠,那么我們就可以得到唯一的解。最大化上圖虛線之間的距離就是我們的目標。而上圖中重點圈出的實例就叫做支持向量。
這就是支持向量機。
二、從代碼中映射理論
2.1 導入數據集
添加引用:
import?numpy?as?np import?pandas?as?pd import?seaborn?as?sns import?matplotlib.pyplot?as?plt導入數據集(大家不用在意這個域名):
df?=?pd.read_csv('https://blog.caiyongji.com/assets/mouse_viral_study.csv') df.head()| 0 | 6.50823 | 8.58253 | 0 |
| 1 | 4.12612 | 3.07346 | 1 |
| 2 | 6.42787 | 6.36976 | 0 |
| 3 | 3.67295 | 4.90522 | 1 |
| 4 | 1.58032 | 2.44056 | 1 |
該數據集模擬了一項醫學研究,對感染病毒的小白鼠使用不同劑量的兩種藥物,觀察兩周后小白鼠是否感染病毒。
特征:1. 藥物Med_1_mL 藥物Med_2_mL
標簽:是否感染病毒(1感染/0不感染)
2.2 觀察數據
sns.scatterplot(x='Med_1_mL',y='Med_2_mL',hue='Virus?Present',data=df)我們用seaborn繪制兩種藥物在不同劑量特征對應感染結果的散點圖。
sns.pairplot(df,hue='Virus?Present')我們通過pairplot方法繪制特征兩兩之間的對應關系。
我們可以做出大概的判斷,當加大藥物劑量可使小白鼠避免被感染。
2.3 使用SVM訓練數據集
#SVC:?Supprt?Vector?Classifier支持向量分類器 from?sklearn.svm?import?SVC#準備數據 y?=?df['Virus?Present'] X?=?df.drop('Virus?Present',axis=1)?#定義模型 model?=?SVC(kernel='linear',?C=1000)#訓練模型 model.fit(X,?y)#?繪制圖像 #?定義繪制SVM邊界方法 def?plot_svm_boundary(model,X,y):X?=?X.valuesy?=?y.values#?Scatter?Plotplt.scatter(X[:,?0],?X[:,?1],?c=y,?s=30,cmap='coolwarm')#?plot?the?decision?functionax?=?plt.gca()xlim?=?ax.get_xlim()ylim?=?ax.get_ylim()#?create?grid?to?evaluate?modelxx?=?np.linspace(xlim[0],?xlim[1],?30)yy?=?np.linspace(ylim[0],?ylim[1],?30)YY,?XX?=?np.meshgrid(yy,?xx)xy?=?np.vstack([XX.ravel(),?YY.ravel()]).TZ?=?model.decision_function(xy).reshape(XX.shape)#?plot?decision?boundary?and?marginsax.contour(XX,?YY,?Z,?colors='k',?levels=[-1,?0,?1],?alpha=0.5,linestyles=['--',?'-',?'--'])#?plot?support?vectorsax.scatter(model.support_vectors_[:,?0],?model.support_vectors_[:,?1],?s=100,linewidth=1,?facecolors='none',?edgecolors='k')plt.show() plot_svm_boundary(model,X,y)我們導入sklearn下的SVC(Supprt Vector Classifier)分類器,它是SVM的一種實現。
2.4 SVC參數C
SVC方法參數C代表L2正則化參數,正則化的強度與C的值成反比,即C值越大正則化強度越弱,其必須嚴格為正。
model?=?SVC(kernel='linear',?C=0.05) model.fit(X,?y) plot_svm_boundary(model,X,y)我們減少C的值,可以看到模型擬合數據的程度減弱。
2.5 核技巧
SVC方法的kernel參數可取值{'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}。像前文中所使用的那樣,我們可以使kernel='linear'進行線性分類。那么如果我們想進行非線性分類呢?
2.5.1 多項式內核
多項式內核kernel='poly'的原理簡單來說就是,用單一特征生成多特征來擬合曲線。比如我們拓展X到y的對應關系如下:
| 0 | 6.50823 | 6.50823**2 | 6.50823**3 | 0 |
| 1 | 4.12612 | 4.12612**2 | 4.12612**3 | 1 |
| 2 | 6.42787 | 6.42787**2 | 6.42787**3 | 0 |
| 3 | 3.67295 | 3.67295**2 | 3.67295**3 | 1 |
| 4 | 1.58032 | 1.58032**2 | 1.58032**3 | 1 |
這樣我們就可以用曲線來擬合數據集。
model?=?SVC(kernel='poly',?C=0.05,degree=5) model.fit(X,?y) plot_svm_boundary(model,X,y)我們使用多項式內核,并通過degree=5設置多項式的最高次數為5。我們可以看出分割出現了一定的弧度。
2.5.2 高斯RBF內核
SVC方法默認內核為高斯RBF,即Radial Basis Function(徑向基函數)。這時我們需要引入gamma參數來控制鐘形函數的形狀。增加gamma值會使鐘形曲線變得更窄,因此每個實例影響的范圍變小,決策邊界更不規則。減小gamma值會使鐘形曲線變得更寬,因此每個實例的影響范圍變大,決策邊界更平坦。
model?=?SVC(kernel='rbf',?C=1,gamma=0.01) model.fit(X,?y) plot_svm_boundary(model,X,y)2.6 調參技巧:網格搜索
from?sklearn.model_selection?import?GridSearchCV svm?=?SVC() param_grid?=?{'C':[0.01,0.1,1],'kernel':['rbf','poly','linear','sigmoid'],'gamma':[0.01,0.1,1]} grid?=?GridSearchCV(svm,param_grid) grid.fit(X,y) print("grid.best_params_?=?",grid.best_params_,",?grid.best_score_?="?,grid.best_score_)我們可以通過GridSearchCV方法來遍歷超參數的各種可能性來尋求最優超參數。這是通過算力碾壓的方式暴力調參的手段。當然,在分析問題階段,我們必須限定了各參數的可選范圍才能應用此方法。
因為數據集太簡單,我們在遍歷第一種可能性時就已經得到100%的準確率了,輸出如下:
grid.best_params_?=??{'C':?0.01,?'gamma':?0.01,?'kernel':?'rbf'}?,?grid.best_score_?=?1.0總結
當我們處理線性可分的數據集時,可以使用SVC(kernel='linear')方法來訓練數據,當然我們也可以使用更快的方法LinearSVC來訓練數據,特別是當訓練集特別大或特征非常多的時候。
當我們處理非線性SVM分類時,可以使用高斯RBF內核,多項式內核,sigmoid內核來進行非線性模型的的擬合。當然我們也可以通過GridSearchCV尋找最優參數。
往期文章:
機器學習(三):理解邏輯回歸及二分類、多分類代碼實踐
機器學習(二):理解線性回歸與梯度下降并做簡單預測
機器學習(一):5分鐘理解機器學習并上手實踐
前置機器學習(五):30分鐘掌握常用Matplotlib用法
前置機器學習(四):一文掌握Pandas用法
前置機器學習(三):30分鐘掌握常用NumPy用法
前置機器學習(二):30分鐘掌握常用Jupyter Notebook用法
前置機器學習(一):數學符號及希臘字母
總結
以上是生活随笔為你收集整理的【机器学习基础】(四):通俗理解支持向量机SVM及代码实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知识星球如何升级为正式星球 知识星球怎么
- 下一篇: win10 edge默认浏览器设置更改教