目录
一、SVM的概念
1.SVM
支持向量机(Support Vector Machine,SVM)是机器学习中的一个二分类模型,用于分类和回归分析。它能够有效地处理线性可分和线性不可分的数据,并在高维空间中构建最优的决策边界。
SVM 能够执行①线性或非线性分类、②回归,甚至是③异常值检测任务。
SVM的核心思想是寻找到一个超平面使样本分成两类,并且间隔最大。这个超平面称为最大间隔超平面,它可以很好地进行分类预测。
具体而言,SVM通过将样本映射到高维特征空间,使得数据在该空间中线性可分。如果在原始输入空间中无法找到一个线性超平面将数据分开,SVM引入了核函数,将计算复杂度从高维特征空间转移到原始输入空间中。常用的核函数有线性核、多项式核和高斯核等。
SVM的训练过程是一个凸优化问题,目标是最小化模型的结构风险。在求解过程中,SVM只关注那些位于决策边界附近的样本,它们被称为支持向量。这种特性使得SVM具有较好的鲁棒性和泛化能力。
总体而言,SVM是一种强大的机器学习算法,能够处理高维空间的数据,并通过寻找最优超平面实现分类和回归分析。它在许多领域如图像识别、文本分类和生物信息学中都取得了广泛的应用。
2. 线性可分
对于一个数据集合可以画一条直线将两组数据点分开,这样的数据成为线性可分(linearly separable),如下图所示:
- 分割超平面:将上述数据集分隔开来的直线称为分隔超平面。对于二维平面来说,分隔超平面就是一条直线。对于三维及三维以上的数据来说,分隔数据的是个平面,称为超平面,也就是分类的决策边界。
- 间隔:点到分割面的距离,称为点相对于分割面的间隔。数据集所有点到分隔面的最小间隔的2倍,称为分类器或数据集的间隔。SVM分类器就是要找最大的数据集间隔。
- 支持向量:离分隔超平面最近的那些点。
SVM所做的工作就是找这样个超平面,能够将两个不同类别的样本划分开来,但是这种平面是不唯一的,即可能存在无数个超平面都可以将两种样本分开。为此Vapnik提出了一种方法,对每一种可能的超平面,我们将它进行平移,直到它与空间中的样本向量相交。我们称这两个向量为支持向量,之后我们计算支持向量到该超平面的距离d,分类效果最好的超平面应该使d最大。
3. 寻找最大间隔
(1)分割超平面
二维空间一条直线的方程为,y=ax+b,推广到n维空间,就变成了超平面方程,即
(2)寻找最大超平面
支持向量机的核心思想是最大间隔化, 最不受到噪声的干扰。如图所示,分类器A比分类器B的间隔(蓝色阴影)大,因此A的分类效果更好。
寻找最佳超平面:
4. 硬间隔和软间隔
(1)硬间隔
硬间隔分类就是严格地让所有实例都不在最大间隔之间,并且位于正确的一边。【如以上使用超平面分割数据的过程就是硬间隔分类】
硬间隔分类有两个问题:
- 它只在数据是线性可分离的时候才有效
- 它对异常值非常敏感
(2)软间隔
但在现实生活中,数据往往不是线性可分的。 如下图:
为了解决这个问题,我们引入了软间隔(soft margin)的概念。相比于硬间隔的苛刻条件,我们允许个别样本点出现在间隔带里面。这样,我们就可以在最大化间隔的同时,尽量减少不满足约束的样本数量,以便更好地拟合数据。
比如:
二、SVM的优缺点与应用场景
1. 优点
- 适用于高维空间:SVM在高维空间中处理数据效果良好。它可以有效地处理具有大量特征的数据集,并且不易受到维度灾难的影响。
- 处理线性和非线性问题:SVM在处理线性可分和线性不可分的数据时都能够取得良好的效果。通过使用核函数,SVM可以将数据映射到高维特征空间,从而处理非线性问题。
- 泛化能力强:SVM通过最大化分类间隔来构建最优的决策边界,从而在训练数据之外的新数据上表现出很好的泛化能力。这意味着SVM对未见过的数据也能进行准确的分类预测。
- 鲁棒性强:SVM在构建模型时只关注支持向量,即位于决策边界附近的样本点。这使得SVM对于噪声和异常值具有较好的鲁棒性,能够减少模型的过拟合风险。
2. 缺点
- 难以处理大规模数据集:SVM的计算复杂度随着训练样本数量的增加而增加。当处理大规模数据集时,训练时间和内存消耗可能会变得非常高,甚至难以承受。
- 对参数和核函数选择敏感:SVM中有一些关键参数需要选择,如正则化参数C和核函数的参数。选择不当的参数值可能导致模型性能下降。此外,选择合适的核函数也是一个挑战,不同的数据集可能需要不同的核函数。
- 对缺失数据敏感:SVM对于缺失数据比较敏感。如果数据中存在缺失值,需要进行额外的处理,如填充缺失值或者使用特定的方法处理缺失数据,否则可能影响模型的性能。
3. 应用场景
- 二分类问题:SVM最初被设计用于解决二分类问题,特别是在数据线性可分的情况下,SVM能够找到最优的超平面来准确地将两个类别分开。
- 多分类问题:虽然SVM最初是为二分类问题设计的,但也可以通过一对多或一对一策略扩展到多类别分类问题。一对多策略将每个类别与其他所有类别进行区分,而一对一策略则构建一组分类器来处理每对类别。
- 文本分类与情感分析:SVM在文本分类任务中表现出色,可以用于将文本分为不同的类别,如垃圾邮件识别、情感分析等。通过将文本表示为特征向量,SVM可以学习一个决策边界来准确地分类新的文本样本。
三、基于SVM代码实现鸢尾花数据集分类
1. 数据集介绍
Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于(iris-setosa, iris-versicolour, iris-virginica)三种中的哪一品种。
数据集内容:
sepal_len sepal_wid petal_len petal_wid label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 2
146 6.3 2.5 5.0 1.9 2
147 6.5 3.0 5.2 2.0 2
148 6.2 3.4 5.4 2.3 2
149 5.9 3.0 5.1 1.8 2
2. 基于sklearn的代码实现
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
def create_data():
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
data = np.array(df.iloc[:100, [0, 1, -1]])
for i in range(len(data)):
if data[i,-1] == 0:
data[i,-1] = -1
return data[:,:2], data[:,-1]
X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
plt.scatter(X[:50,0],X[:50,1], label='0')
plt.scatter(X[50:,0],X[50:,1], label='1')
plt.show()
model = SVC()
model.fit(X_train, y_train)
SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
print('train accuracy: ' + str(model.score(X_train, y_train)))
print('test accuracy: ' + str(model.score(X_test, y_test)))
这段代码主要进行了以下操作:
- 通过
create_data()
函数加载了鸢尾花数据集,并处理成了特征和标签的形式,其中标签被转换为-1和1。- 将数据集划分为训练集和测试集,其中训练集占 75%。
- 使用 matplotlib 对数据进行了可视化,展示了 sepal length 和 sepal width 特征的散点图。
- 创建了一个支持向量机(SVM)的模型,并用训练集对其进行训练。
- 输出了模型在训练集和测试集上的准确率。
3. 运行结果
3.1 数据分布展示:
3.2 训练集和测试集上的准确性 :
train accuracy: 1.0
test accuracy: 0.96
四、实验结果分析
从输出结果来看,训练集准确率为 1.0,即 100%,表明模型在训练集上表现完美,而测试集准确率为 0.96,即 96%,说明模型在测试集上也有较好的表现,但仍存在一定的泛化误差。这就说明该模型可能存在轻微的过拟合,可以进行模型参数调优、交叉验证等方法来改善模型的泛化能力。
五、总结
支持向量机是一种强大的机器学习算法,用于分类和回归。它通过最优超平面来分隔不同类别的样本,并具有较好的泛化能力和鲁棒性。然而,SVM在计算复杂度和参数选择方面存在挑战。在实际应用中,需要适当调整参数和进行模型优化。