1. 程式人生 > 實用技巧 >【SVM】理解與使用(不好完全掌握,知道如何使用即可)

【SVM】理解與使用(不好完全掌握,知道如何使用即可)

1:原理理解

圖中有分別屬於兩類的一些二維資料點和三條直線。如果三條直線分別代表三個分類器的話,請問哪一個分類器比較好?

我們憑直觀感受應該覺得答案是H3。首先H1不能把類別分開,這個分類器肯定是不行的;H2可以,但分割線與最近的資料點只有很小的間隔,如果測試資料有一些噪聲的話可能就會被H2錯誤分類(即對噪聲敏感、泛化能力弱)。H3以較大間隔將它們分開,這樣就能容忍測試資料的一些噪聲而正確分類,是一個泛化能力不錯的分類器。

對於支援向量機來說,資料點若是維向量,我們用維的超平面來分開這些點。但是可能有許多超平面可以把資料分類。最佳超平面的一個合理選擇就是以最大間隔把兩個類分開的超平面。因此,SVM選擇能夠使離超平面最近的資料點的到超平面距離最大的超平面。

以上介紹的SVM只能解決線性可分的問題,為了解決更加複雜的問題,支援向量機學習方法有一些由簡至繁的模型:

  • 線性可分SVM
當訓練資料線性可分時,通過硬間隔(hard margin,什麼是硬、軟間隔下面會講)最大化可以學習得到一個線性分類器,即硬間隔SVM,如上圖的的H3。
  • 線性SVM
當訓練資料不能線性可分但是可以近似線性可分時,通過軟間隔(soft margin)最大化也可以學習到一個線性分類器,即軟間隔SVM。
  • 非線性SVM
當訓練資料線性不可分時,通過使用核技巧(kernel trick)和軟間隔最大化,可以學習到一個非線性SVM。

2:使用

import numpy as
np import sklearn.svm as sk_svm import sklearn.datasets as datasets iris = datasets.load_iris() # 鳥分類資料集 X = iris['data'] y = iris['target'] from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2) print("訓練集:",X_train.shape,y_train.shape) print(
"測試集:",X_test.shape,y_test.shape) model = sk_svm.SVC(C=1,kernel='rbf',gamma='auto') model.fit(X_train,y_train) acc=model.score(X_test,y_test) #根據給定資料與標籤返回正確率的均值 print('SVM模型評價:',acc)