[機器學習][監督式][資料分群] 支持向量機 (Support Vector Machine, SVM)

更新於 發佈於 閱讀時間約 8 分鐘

I. 前言

支持向量機 (Support Vector Machine, 簡稱SVM),是一種將資料分群的機器學習方法。

屬於監督式學習 (supervised learning),因為:

  1. 給定已標記的數據 (labeled data),SVM可以透過訓練得到分類器模型 (classifier model)。
  2. 對於未標記的數據 (unlabeled data),可以利用訓練好的SVM模型來預測未知數據的類別。

II. 原理

在二維平面上,有紅色與藍色兩種顏色的球 (可視為已標記的數據)。

二維平面SVM分類原理

二維平面SVM分類原理

圖上有三條線 (H1、H2、H3),若想用其中一條線將紅藍球分開,

哪一條是最佳的呢? 一起來看看!

  • H1: 無法分開紅、藍球,不考慮。
  • H2: 雖可以將紅、藍球分開,但有沒有更好的選擇?
  • H3: 可以準確地將紅、藍球分開,且向量到距離最近的紅、藍球已最大化,此二向量也作為支持向量 (support vector),其之間的空隙稱為margin,最大化空隙 (maximised margin)視為最佳解。

由上述例子可知,若想找到最佳的分割線 (二維空間)分割平面 (三維空間)需要將支持向量之間的margin最大化 (SVM最主要的核心概念)

III. SVM學習動畫

展示在多維空間找到分割平面的過程。

IV. 範例 (鳶尾花分類)

  1. 載入iris資料集
  2. 70%、30%切分訓練集 (train set)與測試集 (test set)
  3. 以訓練集的特徵 (花萼、花瓣長度與寬度)、類別 (花的種類)訓練SVM模型
    (因為是分類問題,這裡用是使用Support Vector Classifier, SVC)
  4. 訓練完成後,用測試集的特徵預測花的種類
  5. 評估正確率
  6. 視覺化:
    - 用花萼長度與寬度作圖呈現訓練集與測試集的種類分布
    - 測試集種類分布圖上標記黃色星為預測錯誤的點
    (亦可用其他特徵作圖,有多種呈現方式)
訓練集種類分布

訓練集種類分布

測試集種類分布

測試集種類分布

V. 程式碼 (python)

import pandas as pd
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

#%% 取得當前程式放置目錄
current_path = os.getcwd()

#%% 載入iris資料集
iris = datasets.load_iris()

#%% 抓出資料特徵與種類標記
features = pd.DataFrame(iris.data, columns = iris.feature_names)
species = pd.DataFrame(iris.target, columns = ['species'])

#%% 以70%/30%拆分訓練集與測試集
x_train, x_test, y_train, y_test = train_test_split(features, species, test_size = 0.3)

train_set = pd.concat([x_train, y_train], axis = 1).reset_index(drop = True)
test_set = pd.concat([x_test, y_test], axis = 1).reset_index(drop = True)

#%% SVM訓練
svc = SVC()
svc.fit(train_set[iris.feature_names], train_set['species'])

y_pred = svc.predict(test_set[iris.feature_names])
test_set['species_pred'] = y_pred

# SVM分類準確率
SVM_accuracy = round(accuracy_score(test_set['species_pred'], test_set['species']), 4)
print(f'SVM accuracy: {round(SVM_accuracy * 100, 2)}%')

#%% 以花萼長度(sepal length)與花萼寬度(sepal width)作圖
### 畫出訓練集的群集分布
plt.figure()
for i in range(3):
if i == 0: c = 'blue'
if i == 1: c = 'red'
if i == 2: c = 'black'

item = train_set[train_set['species'] == i]
plt.scatter(item[iris.feature_names[0]], item[iris.feature_names[1]], color = c, label = f'species {i}')

plt.legend()
plt.xlabel(f'{iris.feature_names[0]}')
plt.ylabel(f'{iris.feature_names[1]}')
plt.title('(Train set) clustering distribution')
plt.savefig(current_path + '\\train set_clustering distribution.jpeg')

### 畫出測試集的群集分布,以及標記SVM預測錯誤的點
plt.figure()
for i in range(3):
if i == 0: c = 'blue'
if i == 1: c = 'red'
if i == 2: c = 'black'

item = test_set[test_set['species'] == i]
plt.scatter(item[iris.feature_names[0]], item[iris.feature_names[1]], color = c, marker = 's', label = f'species {i}')

item_pred_error = test_set[test_set['species_pred'] != test_set['species']]
if len(item_pred_error) != 0:
plt.scatter(item_pred_error[iris.feature_names[0]], item_pred_error[iris.feature_names[1]], color = 'orange', marker = '*', s = 100, label = 'error prediction')

plt.legend()
plt.xlabel(f'{iris.feature_names[0]}')
plt.ylabel(f'{iris.feature_names[1]}')
plt.title('(Test set) clustering distribution')
plt.savefig(current_path + '\\test set_clustering distribution.jpeg')


參考資料

  1. Ch. 1. 什麼是人工智慧
留言
avatar-img
留言分享你的想法!
avatar-img
River的沙龍
3會員
1內容數
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
大語言模型(如GPT-3和GPT-4)的出現改變了我們與機器互動的方式。這些模型能夠理解和生成自然語言,實現許多以前無法想像的應用。然而,你可能會好奇,這些模型究竟是如何理解語言的?這裡,我們來探討一個關鍵的概念:「一切語義都是關係」。
Thumbnail
大語言模型(如GPT-3和GPT-4)的出現改變了我們與機器互動的方式。這些模型能夠理解和生成自然語言,實現許多以前無法想像的應用。然而,你可能會好奇,這些模型究竟是如何理解語言的?這裡,我們來探討一個關鍵的概念:「一切語義都是關係」。
Thumbnail
[機器學習][監督式][資料分群] 支持向量機 (Support Vector Machine, SVM)
Thumbnail
[機器學習][監督式][資料分群] 支持向量機 (Support Vector Machine, SVM)
Thumbnail
Mplus是一種用於統計分析和結構方程模型(SEM)的軟體,通常用於處理複雜的數據分析和模型建立。以下是一些Mplus的基本語法示例,用於不同類型的分析。
Thumbnail
Mplus是一種用於統計分析和結構方程模型(SEM)的軟體,通常用於處理複雜的數據分析和模型建立。以下是一些Mplus的基本語法示例,用於不同類型的分析。
Thumbnail
数学对于计算机编程来说重要性是毋庸置疑的,更何况我们现在不仅仅是编程,而是走在「人工智能」的路上。可以说,数学应该是最重要的基础。 我们在学习AI的过程当中可能会遇到的一些关于数学方面的一些东西,比如说线性代数里面的矩阵运算,比如说求导,还有一些概率统计,图论方面的一些东西。
Thumbnail
数学对于计算机编程来说重要性是毋庸置疑的,更何况我们现在不仅仅是编程,而是走在「人工智能」的路上。可以说,数学应该是最重要的基础。 我们在学习AI的过程当中可能会遇到的一些关于数学方面的一些东西,比如说线性代数里面的矩阵运算,比如说求导,还有一些概率统计,图论方面的一些东西。
Thumbnail
在我們的上一篇文章,我們把神經網路的架構用簡化再簡化的方式來說明,本篇文章我們會說明神經網路怎麼透過很多輸入資料來調整神經網路裡面的權重跟誤差值,藉由得到接近完美個權重跟誤差值,來做到學習的效果
Thumbnail
在我們的上一篇文章,我們把神經網路的架構用簡化再簡化的方式來說明,本篇文章我們會說明神經網路怎麼透過很多輸入資料來調整神經網路裡面的權重跟誤差值,藉由得到接近完美個權重跟誤差值,來做到學習的效果
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News