文章目录
支持向量机
支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,主要用于分类和回归分析,尤其擅长处理二元分类问题。以下是关于SVM的详细解析:
一、基本概念
- 定义:SVM是一种按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。
- 核心思想:通过寻找一个超平面来划分样本空间,使得不同类别的样本尽可能被分开,并且不同类别样本之间的间隔最大化。
二、工作原理
线性可分:线性可分(Linearly Separable)是机器学习中的一个概念,特别是在分类问题中。它指的是在一个特征空间中,如果存在一个超平面(Hyperplane),能够将不同类别的样本完全分开,则称这些样本是线性可分的。
-
线性可分情况:
- 当数据线性可分时,SVM的目标是找到一个超平面,使得该超平面两侧的样本点分别属于不同的类别,并且超平面到最近样本点的距离(即边距)最大化。
- 这些距离超平面最近的样本点被称为支持向量(support vectors),它们对确定超平面的位置至关重要。
-
非线性可分情况:
- 对于非线性可分的数据集,SVM可以通过核方法(kernel method)将数据映射到高维空间,使其在高维空间中线性可分。
- 常见的核函数包括线性核、多项式核、径向基函数(RBF)核等。
三、算法特点
- 稀疏性:SVM的解具有稀疏性,即大部分训练样本不会对决策边界产生影响,只有支持向量才会影响决策边界的位置。
- 稳健性:由于决策边界仅由支持向量决定,因此SVM对异常点(噪声)的鲁棒性较强。
- 适用小样本:SVM在小样本集、非线性数据集和高维空间中表现出色。
- 准确率高:SVM的准确率通常较高,尤其是在处理分类问题时。
四、优缺点
优点
- 对小样本集、非线性数据集和高维空间有较好的效果。
- 准确率很高。
- 自带L2正则化,一定程度减少过拟合。
- 维数大于样本数情况有效,比如文本分类。
缺点
- 大量数据集训练时间比较长:如果特征和数据量均较大,训练时间可能会显著增加。
- 不适用大型数据集:由于SVM算法的时间复杂度与训练样本的数量呈正比,因此在大规模数据集上应用时可能受到限制。
- 数据集有较多噪声时,SVM效果不好:虽然SVM对异常点有一定的鲁棒性,但当噪声过多时,其性能可能会受到影响。
- 参数选择复杂:SVM中存在一些重要的参数(如正则化参数C、核函数参数等),这些参数的选择对模型的性能影响较大,需要进行交叉验证等复杂的调参过程。
五、构建模型
模型参数
class sklearn.svm.SVC(C=1.0,kernel='rbf',degree=3,
gamma='auto_deprecated',coef0=0.0,shrinking=True,probability=False,
tol=0.001,cache_size=200,class_weight=None,verbose=False,max_iter=-1,
decision_function_shape='ovr',random_state=None)[source]
重要的参数有:C、kernel、degree、gamma:
-- C :惩罚因子【浮点数,默认为1.】【软间隔】
(1)C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱;
(2)C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
->>建议通过交叉验证来选择
-- kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】可以选择线性(linear)、多项式(poly)、sigmoid->>多数情况下选择rbf
-- degree:【整型,默认3维】多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。->>按默认【选择rbf之后,此参数不起作用】
-- gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。
(1)如果gamma是’auto’,那么实际系数是1 / n_features,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)
(2)在sklearn0.22版本中,默认为’scale’,此时gamma=1 / (n_features*X.var())#X.var()数据集所有值的方差。
<1>gamma越大,过拟合风险越高
<2> gamma越小,过拟合风险越低
->>建议通过交叉验证来选择
了解参数之后,我们就来尝试完成对模型的搭建吧!
- 训练模型
- 可视化svm结果
训练模型
-
收集数据
链接: 训练数据
提取码: 3k7s -
数据预处理
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('iris.csv',header=None)
x = data.iloc[:,[1,3]] #选取第二列和第四列
y = data.iloc[:,-1]
- 训练模型
from sklearn.svm import SVC
svm = SVC(kernel='linear',C = float('inf'),random_state=0)
svm.fit(x,y)
训练完成模型之后,查看参数w与偏置项b:
fit()完模型后,会有coef_和intercept_属性,分别对应参数w和b,可将其取出来:
#参数w[原始数据为二维数组]
w = svm.coef_[0]
#偏置项b[原始数据为一维数组]
b = svm.intercept_[0]
可视化svm结果
#超平面方程:w1x1+w2x2+b=0 ----> x2 = -(w1x1+b)/w2
import numpy as np
x1 = np.linspace(0,7,300)#在0~7之间产生300个数据
#超平面方程
x2 = -(w[0]*x1+b)/w[1] #自动计算得到x2
#上超平面方程
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模型
- 如何将模型结果可视化