文章目录
一、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)