SVM分類器演算法總結&應用

Jasmine0224發表於2020-12-13

1、SVM就是尋找最大分類間隔的過程,即使得資料點到分類超平面之間的距離最大化。

2、SVM分類最初是為二分類設計,所以適合二分類問題,也可用於多分類,對多分類問題的處理有下面兩種方式:

(1)一對多法:
假設要把資料集分為A、B、C、D 4個類,可以將其中一個類作為分類1,其他類作為分類2,這樣我們要進行 4次SVM分類:
類別1:A 類別2:B、C、D
類別1:B 類別2:A、C、D
類別1:C 類別2:A、B、D
類別1:D 類別2:B、C、D

這種方法,針對 K 個分類,需要訓練 K 個分類器,分類速度較快,但訓練速度較慢,因為每個分類器都需要對全部樣本進行訓練,而且負樣本數量遠大於正樣本數量,會造成樣本不對稱的情況,而且當增加新的分類,比如第 K+1 類時,需要重新對分類器進行構造。

(2)一對一法:
在任意兩類樣本之間構造一個 SVM,這樣針對 K 類的樣本,就會有 C(k,2) 類分類器。
比如我們想要劃分 A、B、C 三個類,可以構造 3 個分類器:
a) 分類器 1:A、B; b) 分類器 2:A、C; c) 分類器 3:B、C。

當對一個未知樣本進行分類時,每一個分類器都會有一個分類結果,即為 1 票,最終得票最多的類別就是整個未知樣本的類別。

優點:如果新增一類,不需要重新訓練所有的 SVM,只需要訓練和新增這一類樣本的分類器。而且這種方式在訓練單個 SVM 模型的時候,訓練速度快。
缺點:分類器的個數與 K 的平方成正比,所以當 K 較大時,訓練和測試的時間會比較慢。

3、硬間隔:對於完全線性可分的資料集,分類全部準確,沒有錯誤,此時的線性分類器的核心思想就是找到最大分類間隔。
4、軟間隔:實際工作中的資料沒有那麼幹淨,劃分資料集時容許一定量的分類錯誤,此時的分類間隔為軟間隔。
5、對於非線性可分的資料集,引入了核函式,核函式將資料集投射到更高緯的空間,使得資料集線性可分。
6、用svm演算法對乳腺癌進行檢測:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler

# 匯入資料
data = pd.read_csv('breast_cancer_data-master/data.csv')

# 探索資料
pd.set_option('display.max_columns', None)
print(data.columns)
print(data.head())
print(data.describe())

# 資料清洗
data.drop('id', axis=1, inplace=True)
data['diagnosis'] = data['diagnosis'].map({'M':1, 'B':0}) 

# 將特徵欄位分成3組
features_mean = list(data.columns[2:12])
features_se = list(data.columns[12:22])
features_worst = list(data.columns[22:32])

# 將腫瘤診斷結果視覺化
sns.countplot(data['diagnosis'], label='Count')
plt.show()
# 用熱力圖呈現features_mean欄位之間的關係
corr = data[features_mean].corr()
plt.figure(figsize=(14,14))
# annot=True顯示每個方格的資料
sns.heatmap(corr, annot=True)
plt.show()

# 選擇特徵欄位
features_remain = ['radius_mean', 'texture_mean', 'perimeter_mean',
       'area_mean', 'smoothness_mean', 
       'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',]

# 從樣本中抽取30%資料作為測試集,其餘作為訓練集
train, test = train_test_split(data, test_size=0.3)

# 抽取特徵選擇的資料作為訓練和測試資料
train_x = train[features_remain]
train_y = train['diagnosis']
test_x = test[features_remain]
test_y = test['diagnosis']

# 規範化資料,保證每個特徵維度的資料均值為0,方差為1
ss = StandardScaler()
train_x = ss.fit_transform(train_x)
test_x = ss.fit_transform(test_x)

# 建立svm分類器
model = svm.SVC()
model.fit(train_x, train_y)
prediction = model.predict(test_x)
print('準確率為:{}'.format(metrics.accuracy_score(prediction, test_y)))

相關文章