一、支持向量机理论知识
1.1 什么是支持向量机?
支持向量机(Support Vector Machine,简称SVM)是一种监督学习模型,广泛应用于分类和回归分析中。SVM的目标是找到一个最佳的决策边界(超平面),将不同类别的样本尽可能地分开,同时最大化两类样本到决策边界的最小距离,即最大化分类间隔。
1.2 核函数
在实际应用中,很多数据并不是线性可分的。为了解决这一问题,SVM引入了核函数(Kernel Function),通过将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括线性核、多项式核、高斯径向基函数(RBF核)等。
1.3 最大间隔分类器
SVM通过最大化分类间隔(Margin)来寻找最佳超平面。分类间隔定义为最近的训练样本到决策边界的距离。在线性可分的情况下,支持向量是位于分类间隔边界上的样本点。
1.4 SVM的优化目标
SVM的优化问题可以表示为:
其中,w是权重向量,同时需满足约束条件:
其中,
为样本的标签,
为样本特征,
为偏置项。
通过拉格朗日乘子法,可以将以上优化问题转换为对偶问题,从而使用更高效的算法进行求解。
二、具体实验案例
2.1 实验目的
通过一个具体案例,演示如何使用支持向量机进行二分类任务。实验将使用经典的鸢尾花数据集(Iris Dataset)中的两个类别,演示SVM的训练、预测和性能评估。
2.2 实验要求
- Python编程环境
- 安装必要的库:
numpy
、pandas
、scikit-learn
、matplotlib
2.3 实验过程
1.导入必要的库和数据集
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
# 导入Iris数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 仅选择两个类别的数据进行二分类
X = X[y != 2]
y = y[y != 2]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
2.训练SVM模型
# 使用线性核函数训练SVM模型
svm_model = SVC(kernel='linear')
svm_model.fit(X_train, y_train)
3.模型预测和性能评估
# 模型预测
y_pred = svm_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy * 100:.2f}%')
# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.title('混淆矩阵')
plt.show()
2.4 实验数据
- 数据集:鸢尾花数据集(Iris Dataset)
- 特征:萼片长度、萼片宽度、花瓣长度、花瓣宽度
- 标签:山鸢尾(Setosa)、变色鸢尾(Versicolour)
2.5 实验结果
-
准确率:实验结果显示,SVM模型在测试集上的准确率约为98.33%。
-
混淆矩阵
2.6 实验代码
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
# 导入Iris数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 仅选择两个类别的数据进行二分类
X = X[y != 2]
y = y[y != 2]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用线性核函数训练SVM模型
svm_model = SVC(kernel='linear')
svm_model.fit(X_train, y_train)
# 模型预测
y_pred = svm_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy * 100:.2f}%')
# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.title('混淆矩阵')
plt.show()
2.7运行结果
2.8实验结果分析
实验代码成功运行后,输出的混淆矩阵图像显示SVM模型在鸢尾花数据集上达到了100%的准确率。混淆矩阵中,真实标签与预测标签完全一致,说明模型在测试集上没有任何分类错误。
图像展示了模型对两个类别的分类情况,每个类别的样本均被正确分类:
- 真实为Setosa的19个样本全部被预测为Setosa。
- 真实为Versicolour的25个样本全部被预测为Versicolour。
这个实验结果显示了SVM模型在处理该数据集上的强大分类能力。
2.9 实验总结
通过本次实验,我们了解了如何使用支持向量机进行二分类任务。实验结果表明,SVM能够有效地对鸢尾花数据集进行分类,取得了较高的准确率。通过混淆矩阵的可视化,我们也可以直观地看到模型的分类效果。
支持向量机的优势在于其强大的分类能力和较好的泛化性能,尤其是在高维数据集上表现优异。然而,SVM在处理大规模数据集时的计算复杂度较高,需要更多的计算资源和时间。未来的工作可以尝试优化模型参数,使用不同的核函数,或者应用在其他更复杂的数据集上。