📜  使用Python的支持向量机(SVM)对数据进行分类(1)

📅  最后修改于: 2023-12-03 14:49:50.797000             🧑  作者: Mango

使用Python的支持向量机(SVM)对数据进行分类

支持向量机(Support Vector Machine, SVM)是一种常见的分类算法。SVM可以用于二分类和多分类问题,其优点在于具有较高的准确度和良好的泛化性能。

SVM基本原理

SVM基于结构风险最小化原则,学习的目标是求解一个能够将正负样本完全分离的超平面。超平面的方程为:

$$ \vec{w} \cdot \vec{x} - b = 0 $$

其中 $\vec{w}$ 是法向量,$\vec{x}$ 是样本数据,$b$ 是偏置项。正负样本应该满足如下约束条件:

$$ \begin{cases} \vec{w} \cdot \vec{x}_i - b \geqslant 1, & y_i = +1 \ \vec{w} \cdot \vec{x}_i - b \leqslant -1, & y_i = -1 \end{cases} $$

其中 $y_i$ 是样本的类别标签,可以是 $+1$ 或 $-1$。SVM的学习目标是最大化超平面到正负样本之间的间隔,即最大化 $2/|\vec{w}|$,等价于最小化 $1/2 |\vec{w}|^2$。因此,SVM问题可以转化为以下优化问题:

$$ \min_{\vec{w},b} \frac{1}{2}|\vec{w}|^2 \ s.t. \ y_i (\vec{w}\cdot\vec{x}_i-b) \geqslant 1 $$

当数据线性不可分时,可以通过引入惩罚因子 $\xi_i\geqslant0$,对样本违反约束条件的情况进行处理。对于上述优化问题可以修改为:

$$ \min_{\vec{w},b} \frac{1}{2}|\vec{w}|^2 + C\sum_{i=1}^{m}\xi_i \ s.t. \ y_i (\vec{w}\cdot\vec{x}_i-b) \geqslant 1-\xi_i $$

其中常数 $C$ 可以根据实际情况进行调整。

Python中的SVM

在Python中,可以使用sklearn库中的svm模块来训练SVM。

数据准备

在进行分类任务时,首先需要准备训练数据和测试数据。假设我们要对鸢尾花数据进行分类,可以使用如下代码读取数据集:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 载入数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
SVM模型训练

使用sklearn库中的svm模块可以很方便地训练SVM模型。以下代码演示了如何使用线性核函数训练SVM模型:

from sklearn.svm import SVC

# 定义模型
model = SVC(kernel='linear', C=1)

# 训练模型
model.fit(X_train, y_train)

其中,kernel指定使用的核函数类型,可以选择linearrbf等,C指定正则化强度,具体数值应根据实际情况进行调整。

SVM模型评估

可以使用如下代码对SVM模型进行评估:

from sklearn.metrics import accuracy_score

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

其中,accuracy_score函数可以计算模型在测试集上的准确率。

总结

本文介绍了支持向量机(SVM)的基本原理和使用Python实现的方法。通过准备训练数据、训练模型和对模型进行评估,可以很容易地应用SVM算法进行数据分类任务。SVM算法具有较高的准确度和泛化性能,在一些问题上具有良好的效果。