日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【机器学习基础】(四):通俗理解支持向量机SVM及代码实践

發布時間:2025/3/12 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习基础】(四):通俗理解支持向量机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()


Med_1_mLMed_2_mLVirus Present
06.508238.582530
14.126123.073461
26.427876.369760
33.672954.905221
41.580322.440561

該數據集模擬了一項醫學研究,對感染病毒的小白鼠使用不同劑量的兩種藥物,觀察兩周后小白鼠是否感染病毒。

  • 特征: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的對應關系如下:


XX^2X^3y
06.508236.50823**26.50823**30
14.126124.12612**24.12612**31
26.427876.42787**26.42787**30
33.672953.67295**23.67295**31
41.580321.58032**21.58032**31

這樣我們就可以用曲線來擬合數據集。

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用法

  • 前置機器學習(一):數學符號及希臘字母

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站qq群704220115,加入微信群請掃碼: 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【机器学习基础】(四):通俗理解支持向量机SVM及代码实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。