下面我就来详细讲解支持向量机SVM分类算法的完整攻略。
什么是支持向量机SVM
支持向量机SVM是一种分类算法,它通过构建超平面将数据集分成不同的类别。SVM的基本思想是找到最优的超平面,使得该平面划分出的每个类别的样本点到该平面的距离尽可能远。这个距离被称为“间隔”,SVM的最终目标就是找到最大间隔的超平面。
SVM分类算法的步骤
以下是SVM算法的基本步骤:
- 收集数据,准备数据
- 选择合适的超平面划分数据集
- 训练模型
- 测试模型
下面我将详细介绍每个步骤的具体内容。
数据准备
SVM算法适用于二分类问题,因此我们需要准备两个类别的数据,这些数据必须是数值型的。数据集应该被分成训练集和测试集,通常使用的比例是70%的数据用于训练,30%的数据用于测试。
选择超平面
在SVM算法中,超平面是通过数据的特征向量构建的。我们需要在所有可能的超平面中选择最优的那个。通常,最优的超平面是能够最大化两个类别之间的间隔的超平面。
训练模型
SVM模型的训练过程涉及到寻找最优的超平面,即最大化分类间隔。这个过程可以通过优化问题来解决。通过使用凸优化算法,可以找到一个解决方案,最大化分类间隔,并找到超平面。
测试模型
在测试模型时,我们需要将测试集中的样本点带入到训练好的模型中。如果样本点位于超平面的一侧,则将其归类为“正类”,否则,归类为“负类”。
SVM算法示例
以下是两个SVM算法的示例:
示例一:使用SVM分类鸢尾花
下面是一个使用SVM对鸢尾花分类的Python示例:
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
# 导入数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征作为X
y = iris.target
# SVM分类
C = 1.0 # SVM正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)
# 创建网格以绘制决策边界
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 500),
np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 500))
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
# 绘制决策边界和数据点
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
这个示例中,我们使用了SVM对鸢尾花进行分类,通过选择超平面将数据分成3类。
示例二:SVM垃圾邮件分类
下面是一个使用SVM对垃圾邮件进行分类的Python示例:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
# 读取数据
with open('spam_data') as f:
content = f.readlines()
content = [x.strip() for x in content]
# 将数据分割为训练和测试分组
X_train, X_test, y_train, y_test = train_test_split(content, y, test_size=0.2)
# 构建tf-idf向量
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(X_train)
X_test = vectorizer.transform(X_test)
# 使用SVM分类器
clf = LinearSVC()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
# 计算准确率
acc = np.mean(y_pred == y_test)
print("准确率: {:.2f}%".format(acc * 100))
这个示例中,我们使用SVM对垃圾邮件进行分类,通过选择超平面将数据分成“是垃圾邮件”和“不是垃圾邮件”两类。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:初识支持向量机SVM分类算法 - Python技术站