机器学习-SVM方法
文章目录
- 一、SVM介绍
- 1.含义
- 2.SVM 的核心思想
- 3.SVM的参数
- 1). 惩罚系数C(Cost)
- 2). 核函数(Kernel)
- 3). 多项式核的阶数(Degree)
- 4). 核函数系数(Gamma)
- 5). 核函数常数值(Coef0)
- 6). 概率估计(Probability)
- 7). 缓存大小(Cache Size)
- 8). 类别权重(Class Weight)
- 9). 最大迭代次数(Max Iterations)
- 二、代码实现
- 1.读取和准备数据并进行可视化
- 2.使用SVM进行训练
- 3.可视化SVM结果
- 4.全部代码
- 三、总结
一、SVM介绍
1.含义
SVM(Support Vector Machine,支持向量机)是一种监督学习的方,用于分类和回归分析。在分类问题中,SVM 的目标是找到一个超平面(在二维空间中是一条线,在三维空间中是一个平面,以此类推),这个超平面能够将不同类别的样本分开,并且使得不同类别之间的间隔最大化。这种间隔最大化的特性使得 SVM 成为一种强大的分类器,尤其适用于高维空间中的分类问题。
2.SVM 的核心思想
- 最大间隔:SVM试图找到一个超平面,使得不同类别的样本到这个超平面的距离(称为间隔)最大化。这样的超平面具有更好的泛化能力,因为它对训练数据中的噪声和异常值不那么敏感。
- 支持向量:在训练过程中,只有少数几个样本点(即支持向量)对最终的超平面位置有影响。这些支持向量是距离超平面最近的样本点,它们决定了超平面的位置。
- 核函数:为了处理非线性问题,SVM引入了核函数的概念。通过将样本映射到一个更高维的空间(称为特征空间),在这个空间中寻找一个线性超平面来分隔样本。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。
3.SVM的参数
1). 惩罚系数C(Cost)
- 定义:错误项的惩罚系数,用于控制损失函数的惩罚程度。
- 影响:C值越大,对分错样本的惩罚程度越大,模型在训练样本上的准确率会提高,但可能导致过拟合,即模型在测试数据上的分类准确率降低。相反,C值越小,模型的容错能力增强,泛化能力较强,但也可能出现欠拟合。
- 调优建议:通过交叉验证等方法选择合适的C值,以平衡模型的训练误差和测试误差。
2). 核函数(Kernel)
- 定义:核函数是SVM中的关键组件,用于将输入数据映射到高维空间,以便在该空间中找到最佳的超平面进行分类。
- 类型:常用的核函数包括线性核(Linear)、多项式核(Poly)、径向基函数(RBF,即高斯核)等。
- 影响:不同的核函数适用于不同类型的数据和问题。例如,线性核适用于线性可分的数据集,而RBF核则适用于大多数非线性问题。
- 调优建议:根据数据的特性和问题的复杂程度选择合适的核函数。
3). 多项式核的阶数(Degree)
- 定义:当使用多项式核时,需要指定多项式的阶数。
- 影响:阶数越高,模型的复杂度越高,可能导致过拟合。
- 调优建议:根据数据的特性和模型的性能表现选择合适的阶数。
4). 核函数系数(Gamma)
- 定义:对于RBF、多项式核和Sigmoid核,Gamma是核函数的系数,它影响了核函数的形状和宽度。
- 影响:Gamma值越大,核函数越窄,模型可能只关注支持向量附近的样本,导致过拟合;Gamma值越小,核函数越宽,模型可能过于平滑,导致欠拟合。
- 调优建议:通过交叉验证等方法选择合适的Gamma值。
5). 核函数常数值(Coef0)
- 定义:对于多项式核和Sigmoid核,Coef0是核函数的常数值。
- 影响:Coef0值的变化会影响核函数的形状和模型的性能。
- 调优建议:根据模型的性能表现调整Coef0值。
6). 概率估计(Probability)
- 定义:是否启用概率估计功能,即在预测时给出样本属于各个类别的概率。
- 影响:启用概率估计会降低模型的训练速度,但可以提供更丰富的预测信息。
- 调优建议:根据实际需求选择是否启用概率估计。
7). 缓存大小(Cache Size)
- 定义:用于限制SVM训练过程中的计算量大小,以MB为单位。
- 影响:较大的缓存大小可以加快训练速度,但会占用更多的内存资源。
- 调优建议:根据计算机的内存资源和训练数据集的大小选择合适的缓存大小。
8). 类别权重(Class Weight)
- 定义:用于设置不同类别的权重,以解决类别不平衡问题。
- 影响:通过设置类别权重,可以使模型更加关注少数类样本,从而提高模型在少数类样本上的性能。
- 调优建议:根据数据的类别分布和实际需求设置合适的类别权重。
9). 最大迭代次数(Max Iterations)
- 定义:设置SVM训练过程中的最大迭代次数。
- 影响:较大的迭代次数可能使模型训练更充分,但也会增加训练时间;较小的迭代次数可能导致模型训练不充分。
- 调优建议:根据模型的训练速度和性能表现选择合适的迭代次数。
二、代码实现
1.读取和准备数据并进行可视化
import pandas as pd
data = pd.read_csv("iris.csv", header=None)
"""
可视化原始数据
"""
import matplotlib.pyplot as plt
data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原始数据是四维,无法展示,选择两个进行展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')
这部分代码读取了名为iris.csv的CSV文件,其中没有列名(header=None),并将数据分割为两部分(通常假设前50个样本是Setosa类别,后100个是非Setosa类别),使用matplotlib.pyplot来可视化两个特征(假设是花瓣长度和花瓣宽度)的散点图,分别用不同的标记表示两个子集的数据。
2.使用SVM进行训练
from sklearn.svm import SVC
X = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(X, y)
这里,使用SVC类从sklearn.svm模块创建了一个线性SVM模型,其中C被设置为float(‘inf’),这实际上是一个极端的设置,因为它试图完全正确地分类所有训练样本(即不允许任何错误)。random_state用于确保结果的可重复性。
3.可视化SVM结果
# 参数w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项[原始数据为一维数组]
b = svm.intercept_[0]
import numpy as np
x1 = np.linspace(0, 7, 300) # 在0~7之间产生300个数据
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]
# 可视化原始数据,选取1维核3维的数据进行可视化
# plt.scatter(data1[1],data1[3],marker='+',color='b')
# plt.scatter(data2[1],data2[3],marker='o',color='b')
# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 5)
# 找到支持向量[二维数组]可视化支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
plt.show()
这部分代码计算了SVM决策边界和间隔边界的方程,并使用matplotlib将它们绘制在图上。同时,它还绘制了支持向量,即那些对决策边界位置有影响的训练样本。
4.全部代码
在这段代码中,成功地使用SVM(支持向量机)对Iris数据集的一个二维特征子集进行了训练和可视化。
import pandas as pd
data = pd.read_csv("iris.csv", header=None)
"""
可视化原始数据
"""
import matplotlib.pyplot as plt
data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原始数据是四维,无法展示,选择两个进行展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')
"""
使用SVM进行训练
"""
from sklearn.svm import SVC
X = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(X, y)
"""
可视化SVM结果
"""
# 参数w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项[原始数据为一维数组]
b = svm.intercept_[0]
import numpy as np
x1 = np.linspace(0, 7, 300) # 在0~7之间产生300个数据
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]
# 可视化原始数据,选取1维核3维的数据进行可视化
# plt.scatter(data1[1],data1[3],marker='+',color='b')
# plt.scatter(data2[1],data2[3],marker='o',color='b')
# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 5)
# 找到支持向量[二维数组]可视化支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
plt.show()
三、总结
SVM 在许多领域都有广泛的应用,包括文本分类、图像识别、生物信息学、金融数据分析等。由于其强大的分类能力和对高维数据的适应性,SVM 成为了机器学习领域中最受欢迎和广泛使用的算法之一。但也有自己优缺点。
SVM 的优点
- 高效性:在中小规模数据集上,SVM 的训练速度通常较快,并且分类效果良好。
- 泛化能力强:由于 SVM 试图最大化不同类别之间的间隔,因此它对训练数据中的噪声和异常值具有较好的鲁棒性。
适用于高维空间:SVM 可以有效地处理高维数据,因为它只依赖于支持向量,而不是整个数据集。
SVM 的缺点
- 计算复杂度高:对于大规模数据集,SVM 的训练时间可能会非常长,因为需要计算所有样本点之间的距离。
- 参数选择敏感:SVM 的性能对参数(如正则化参数 C 和核函数的参数)的选择非常敏感,需要仔细调整。
- 核函数选择:选择合适的核函数对于 SVM 的性能至关重要,但核函数的选择通常依赖于经验和试错。 应用场景