
- 機器學習基礎
- ML - 首頁
- ML - 簡介
- ML - 入門
- ML - 基本概念
- ML - 生態系統
- ML - Python 庫
- ML - 應用
- ML - 生命週期
- ML - 必備技能
- ML - 實現
- ML - 挑戰與常見問題
- ML - 限制
- ML - 現實生活中的例子
- ML - 資料結構
- ML - 數學
- ML - 人工智慧
- ML - 神經網路
- ML - 深度學習
- ML - 獲取資料集
- ML - 分類資料
- ML - 資料載入
- ML - 資料理解
- ML - 資料準備
- ML - 模型
- ML - 監督學習
- ML - 無監督學習
- ML - 半監督學習
- ML - 強化學習
- ML - 監督學習與無監督學習
- 機器學習資料視覺化
- ML - 資料視覺化
- ML - 直方圖
- ML - 密度圖
- ML - 箱線圖
- ML - 相關矩陣圖
- ML - 散點矩陣圖
- 機器學習統計學
- ML - 統計學
- ML - 平均值、中位數、眾數
- ML - 標準差
- ML - 百分位數
- ML - 資料分佈
- ML - 偏度和峰度
- ML - 偏差和方差
- ML - 假設
- ML中的迴歸分析
- ML - 迴歸分析
- ML - 線性迴歸
- ML - 簡單線性迴歸
- ML - 多元線性迴歸
- ML - 多項式迴歸
- ML中的分類演算法
- ML - 分類演算法
- ML - 邏輯迴歸
- ML - K近鄰演算法 (KNN)
- ML - 樸素貝葉斯演算法
- ML - 決策樹演算法
- ML - 支援向量機
- ML - 隨機森林
- ML - 混淆矩陣
- ML - 隨機梯度下降
- ML中的聚類演算法
- ML - 聚類演算法
- ML - 基於質心的聚類
- ML - K均值聚類
- ML - K中心點聚類
- ML - 均值漂移聚類
- ML - 層次聚類
- ML - 基於密度的聚類
- ML - DBSCAN聚類
- ML - OPTICS聚類
- ML - HDBSCAN聚類
- ML - BIRCH聚類
- ML - 親和傳播
- ML - 基於分佈的聚類
- ML - 凝聚層次聚類
- ML中的降維
- ML - 降維
- ML - 特徵選擇
- ML - 特徵提取
- ML - 後退消除法
- ML - 前向特徵構建
- ML - 高相關性過濾器
- ML - 低方差過濾器
- ML - 缺失值比率
- ML - 主成分分析
- 強化學習
- ML - 強化學習演算法
- ML - 利用與探索
- ML - Q學習
- ML - REINFORCE演算法
- ML - SARSA強化學習
- ML - 演員-評論家方法
- 深度強化學習
- ML - 深度強化學習
- 量子機器學習
- ML - 量子機器學習
- ML - 使用Python的量子機器學習
- 機器學習雜項
- ML - 效能指標
- ML - 自動工作流
- ML - 提升模型效能
- ML - 梯度提升
- ML - 自舉匯聚 (Bagging)
- ML - 交叉驗證
- ML - AUC-ROC曲線
- ML - 網格搜尋
- ML - 資料縮放
- ML - 訓練和測試
- ML - 關聯規則
- ML - Apriori演算法
- ML - 高斯判別分析
- ML - 成本函式
- ML - 貝葉斯定理
- ML - 精確率和召回率
- ML - 對抗性
- ML - 堆疊
- ML - 輪次
- ML - 感知器
- ML - 正則化
- ML - 過擬合
- ML - P值
- ML - 熵
- ML - MLOps
- ML - 資料洩露
- ML - 機器學習的盈利化
- ML - 資料型別
- 機器學習 - 資源
- ML - 快速指南
- ML - 速查表
- ML - 面試問題
- ML - 有用資源
- ML - 討論
機器學習 - 支援向量機
支援向量機 (SVM) 是一種強大而靈活的監督式機器學習演算法,可用於分類和迴歸。但通常,它們用於分類問題。SVM 最初在 1960 年代被提出,並在 1990 年代得到了改進。與其他機器學習演算法相比,SVM 具有獨特的實現方式。如今,由於其能夠處理多個連續和分類變數,因此它們非常受歡迎。
SVM 的工作原理
SVM 的目標是找到一個超平面,將資料點分成不同的類別。超平面在 2D 空間中是一條線,在 3D 空間中是一個平面,在 n 維空間中是一個更高維度的表面。超平面的選擇方式是最大化間隔,即超平面與每個類別最近資料點之間的距離。最近的資料點稱為支援向量。
可以使用以下公式計算超平面與資料點“x”之間的距離:
distance = (w . x + b) / ||w||
其中“w”是權重向量,“b”是偏置項,“||w||”是權重向量的歐幾里得範數。權重向量“w”垂直於超平面並決定其方向,而偏置項“b”決定其位置。
最優超平面是透過解決一個最佳化問題找到的,該問題是在所有資料點都被正確分類的約束下最大化間隔。換句話說,我們希望找到最大化兩類之間間隔的超平面,同時確保沒有資料點被錯誤分類。這是一個凸最佳化問題,可以使用二次規劃來解決。
如果資料點不是線性可分的,我們可以使用一種稱為核技巧的技術將資料點對映到更高維的空間,在該空間中它們變得可分。核函式計算對映資料點之間的內積,而無需計算對映本身。這使我們能夠在更高維的空間中處理資料點,而不會產生對映它們的計算成本。
讓我們藉助下圖詳細瞭解一下:

以下是 SVM 中的重要概念:
支援向量 - 最接近超平面的資料點稱為支援向量。分離線將藉助這些資料點定義。
超平面 - 正如我們在上圖中看到的,它是一個決策平面或空間,它被分成一組具有不同類別的物件。
間隔 - 可以定義為不同類別最近資料點之間兩條線之間的間隙。它可以計算為從線到支援向量的垂直距離。大間隔被認為是好的間隔,小間隔被認為是壞的間隔。
Python 實現
我們將使用 scikit-learn 庫在 Python 中實現 SVM。Scikit-learn 是一個流行的機器學習庫,它提供了廣泛的演算法用於分類、迴歸、聚類和降維任務。
我們將使用著名的 Iris 資料集,其中包含三種鳶尾花(山鳶尾、雜色鳶尾和弗吉尼亞鳶尾)的花萼長度、花萼寬度、花瓣長度和花瓣寬度。目標是根據這四個特徵將花卉分類到各自的種類中。
示例
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score # load the iris dataset iris = load_iris() # split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42) # create an SVM classifier with a linear kernel svm = SVC(kernel='linear') # train the SVM classifier on the training set svm.fit(X_train, y_train) # make predictions on the testing set y_pred = svm.predict(X_test) # calculate the accuracy of the classifier accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy)
我們首先從 scikit-learn 匯入必要的模組:load_iris 用於載入 iris 資料集,train_test_split 用於將資料分成訓練集和測試集,SVC 用於建立具有線性核的 SVM 分類器,以及accuracy_score 用於計算分類器的準確率。
我們使用load_iris載入 iris 資料集,並使用train_test_split將資料分成訓練集和測試集。我們使用 0.2 的測試大小,這意味著 20% 的資料將用於測試,80% 用於訓練。我們將隨機狀態設定為 42 以確保結果的可重複性。
我們使用SVC(kernel='linear')建立一個具有線性核的 SVM 分類器。然後我們使用svm.fit(X_train, y_train)在訓練集上訓練 SVM 分類器。
訓練完分類器後,我們使用svm.predict(X_test)對測試集進行預測。然後我們使用accuracy_score(y_test, y_pred)計算分類器的準確率,並將其列印到控制檯。
輸出
程式碼的輸出應該類似於以下內容:
Accuracy: 1.0
調整 SVM 引數
在實踐中,SVM 通常需要調整其引數以獲得最佳效能。需要調整的最重要的引數是核函式、正則化引數 C 和特定於核函式的引數。
核函式引數決定了要使用的核函式型別。最常見的核函式型別是線性、多項式、徑向基函式 (RBF) 和 sigmoid。線性核用於線性可分資料,而其他核用於非線性可分資料。
正則化引數 C 控制最大化間隔和最小化分類誤差之間的權衡。較高的 C 值意味著分類器將嘗試以較小間隔為代價最小化分類誤差,而較低的 C 值意味著分類器將嘗試最大化間隔,即使這意味著更多的錯誤分類。
特定於核函式的引數取決於所使用的核函式型別。例如,多項式核具有多項式次數和多項式係數的引數,而 RBF 核具有高斯函式寬度的引數。
我們可以使用交叉驗證來調整 SVM 的引數。交叉驗證包括將資料分成幾個子集,並在每個子集上訓練分類器,同時使用其餘子集進行測試。這使我們能夠評估分類器在資料不同子集上的效能,並選擇最佳引數集。
示例
from sklearn.model_selection import GridSearchCV # define the parameter grid param_grid = { 'C': [0.1, 1, 10, 100], 'kernel': ['linear', 'poly', 'rbf', 'sigmoid'], 'degree': [2, 3, 4], 'coef0': [0.0, 0.1, 0.5], 'gamma': ['scale', 'auto'] } # create an SVM classifier svm = SVC() # perform grid search to find the best set of parameters grid_search = GridSearchCV(svm, param_grid, cv=5) grid_search.fit(X_train, y_train) # print the best set of parameters and their accuracy print("Best parameters:", grid_search.best_params_) print("Best accuracy:", grid_search.best_score_)
我們首先從 scikit-learn 匯入GridSearchCV模組,它是一個用於對一組引數執行網格搜尋的工具。我們定義一個引數網格,其中包含我們要調整的每個引數的可能值。
我們使用SVC()建立一個 SVM 分類器,然後將其與引數網格和交叉驗證摺疊次數 (cv=5) 一起傳遞給GridSearchCV。然後我們呼叫grid_search.fit(X_train, y_train)執行網格搜尋。
網格搜尋完成後,我們分別使用grid_search.best_params_和grid_search.best_score_列印最佳引數集及其準確率。
輸出
執行此程式後,您將獲得以下輸出:
Best parameters: {'C': 0.1, 'coef0': 0.5, 'degree': 3, 'gamma': 'scale', 'kernel': 'poly'} Best accuracy: 0.975
這意味著網格搜尋找到的最佳引數集為:C=0.1,coef0=0.5,degree=3,gamma=scale,以及kernel=poly。這組引數在訓練集上達到的準確率為97.5%。
您現在可以使用這些引數建立一個新的SVM分類器,並在測試集上測試其效能。