Scikit-learn之支持向量机

2023-11-03

1. 支持向量机简介

SVM(支持向量机)是机器学习中监督学习算法里面的一个分类算法。SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面,从而实现分类目的。(关于SVM的算法流程,建议学习凸优化、分离超平面等理论知识)

2. SVM在sklearn中的实现

2.1 实现目标

现有已知所属类别数据如下:

x y label
0.1 0.7 0
0.3 0.6 0
0.4 0.1 0
0.5 0.4 0
0.8 0.04 0
0.42 0.6 0
0.9 0.4 1
0.6 0.5 1
0.7 0.2 1
0.27 0.8 1
0.7 0.67 1
0.5 0.72 1

前6条数据集的类别为0;后6条数据集的类别为1。
现有未知类别数据如下:

import numpy as np
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.002),
                     np.arange(y_min, y_max, 0.002)) # meshgrid如何生成网格

现要求,根据已知类别数据来预测未知类别数据的所属类别(使用SVM,并利用多种核函数进行实践)。

2.2 实现步骤

  1. 数据预处理
    在这一步应通过相关数据处理方法,获得属性数据和标签数据。
  2. 指定模型
    sklearn库中有多种类型的SVM模型,主要通过更改核函数来实现。常见的核函数有线性(linear)、多项式(ploy)、高斯(rbf)。
  3. 训练模型
    将训练数据属性、训练数据对应的标签输入模型,获得模型参数。
  4. 测试模型
    利用测试数据集来对模型进行测试,判断模型的优劣。
  5. 应用模型

2.3 线性核函数

import numpy as np
from matplotlib import pyplot as plt
from sklearn import svm


#第一步,数据预处理(这里使用没有实际含义的数据)

#首先生成训练数据
data = np.array([
    [0.1, 0.7],
    [0.3, 0.6],
    [0.4, 0.1],
    [0.5, 0.4],
    [0.8, 0.04],
    [0.42, 0.6],
    [0.9, 0.4],
    [0.6, 0.5],
    [0.7, 0.2],
    [0.7, 0.67],
    [0.27, 0.8],
    [0.5, 0.72]
])#data的第一列为x,第二列为y
label = [1] * 6 + [0] * 6#label反应了数据所属类别

#接着生成测试数据
x_min, x_max = data[:, 0].min() - 0.2, data[:, 0].max() + 0.2
y_min, y_max = data[:, 1].min() - 0.2, data[:, 1].max() + 0.2
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.002),np.arange(y_min, y_max, 0.002)) 
#meshgrid生成网格,例如np.meshgrid([1,2],[4,5])会生成一个2*2网格,返回两个数组
#array([[1,2],[1,2]]、array([[4,4],[5,5]]),即四个点(1,4), (2,4), (1,5), (2,5)



#第二步,指定模型
model_linear=svm.SVC(kenel='linear',C=0.001)
#kenel参数表达了想要使用的核函数,C是惩罚因子,越大再训练的时候训练结果的正确率越高
#(但是容易出现过拟合状况)


#第三步,训练模型
model_linear.fit(data,label)
#这一步将会根据data和label得出模型参数,为后续预测未知类别数据提供基础

#第四步,测试模型
Z = model_linear.predict(np.c_[xx.flatten(), yy.ravel()]) 
# 预测,这一步将会得到每一个(x,y)对应的预测标签
#xx、yy均是一个二维数组,这里使用flatten和ravel两种方法将二维数组降维为一维数组

#首先声明两者所要实现的功能是一致的(将多维数组降位一维)。这点从两个单词的意也可以看出
#来,ravel(散开,解开),flatten(变平)。两者的区别在于返回拷贝(copy)还是返回视图
#(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩
#阵,而numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),
#会影响(reflects)原始矩阵。
#若测试数据有其label_text,则可以利用model_linear.score(np.c_[xx.flatten(), yy.ravel(),label_test]测试模型

#第五步,结果可视化
Z = Z.reshape(xx.shape)#输出标签结果为一维数组,为了做等高线图,将标签结果重设为何xx或yy一样的结构
plt.contourf(xx, yy, Z, cmap = plt.cm.ocean, alpha=0.6)
plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3) 
plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
plt.title('Linear SVM')
plt.show()
#函数功能:用来绘制等高线和决策边界
#调用方法:plt.contourf(X,Y,Z,cmap)
#参数说明:
#X:网格点的横坐标
#Y:网格点的纵坐标
#Z:网格点的值(等高线图的高度值)
#cmap:颜色图,指定Z不同值(不同高度)所对应不同的填充色

在这里插入图片描述从结果可以看到,线性核分类基本上达到了目的,但是还有提升空间。

2.4 多项式核函数

本节数据集继续使用2.3节设定的数据集

plt.figure(figsize=(16, 15))
for i, degree in enumerate([1, 3, 5, 7, 9, 12]):
    # C: 惩罚系数
    model_poly = svm.SVC(C=0.0001, kernel='poly', degree=degree) # 多项式核
    model_poly.fit(data, label)
    # ravel - flatten
    # c_ - vstack
    # 把后面两个压扁之后变成了x1和x2,然后进行判断,得到结果在压缩成一个矩形
    Z = model_poly.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.subplot(3, 2, i + 1)
    plt.subplots_adjust(wspace=0.4, hspace=0.4)
    plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.6)
 
    # 画出训练点
    plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3)
    plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
    plt.title('Poly SVM with $\degree=$' + str(degree))
plt.show()

在这里插入图片描述

2.5 高斯核函数

本节数据集继续使用2.3节设定的数据集

plt.figure(figsize=(16, 15))
 
for i, gamma in enumerate([1, 5, 15, 35, 45, 55]):
    # C: 惩罚系数,gamma: 高斯核的系数
    model_rbf = svm.SVC(kernel='rbf', gamma=gamma, C= 0.0001)
    model_rbf.fit(data, label)
 
    # ravel - flatten
    # c_ - vstack
    # 把后面两个压扁之后变成了x1和x2,然后进行判断,得到结果在压缩成一个矩形
    Z = model_rbf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.subplot(3, 2, i + 1)
    plt.subplots_adjust(wspace=0.4, hspace=0.4)
    plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.6)
 
    # 画出训练点
    plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3)
    plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
    plt.title('RBF SVM with $\gamma=$' + str(gamma))
plt.show()

在这里插入图片描述

2.6 总结

以上内容,对支持向量机在sklearn中的实现从数据预处理、模型设定、训练模型、测试模型等方面进行了实操和展示,分析了多种核函数、参数等对SVM分类的影响。编程实现过程中,有些环节巧妙地使用了numpy中的技巧,简化了代码,所以打好numpy基础,对于提高编程技能、简化编程过程具有较好的作用。(建议读者,通过本文的学习,可以自行学习numpy中的flatten、ravel等方法,以及np.c_[]的使用方法和使用目的,掌握了这些方法,在后续学习过程中将会达到事半功倍的效果!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scikit-learn之支持向量机 的相关文章

  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • 如何在sklearn管道中通过特征消除选择特征名称?

    我在 sklearn 管道中使用递归特征消除 管道看起来像这样 from sklearn pipeline import FeatureUnion Pipeline from sklearn import feature selection
  • sklearn LogisticRegressionCV 是否使用最终模型的所有数据

    我想知道sklearn中LogisticRegressionCV的最终模型 即决策边界 是如何计算的 假设我有一些 Xdata 和 ylabels Xdata shape of this is n samples n features yl
  • 使用 scikit-learn 进行二次采样 + 分类

    我正在使用 Scikit learn 进行二元分类任务 并且我有 0 级 有 200 个观察值 第 1 类 有 50 个观察值 而且因为我有不平衡的数据 我想抽取多数类的随机子样本 其中观察数量与少数类相同 并且希望使用新获得的数据集作为分
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Learning_rate 不是合法参数

    我正在尝试通过实现 GridSearchCV 来测试我的模型 但我似乎无法在 GridSearch 中添加学习率和动量作为参数 每当我尝试通过添加这些代码来执行代码时 我都会收到错误 这是我创建的模型 def define model op
  • Scikit Learn GridSearchCV 无需交叉验证(无监督学习)

    是否可以在没有交叉验证的情况下使用 GridSearchCV 我正在尝试通过网格搜索优化 KMeans 聚类中的聚类数量 因此我不需要或想要交叉验证 The 文档 http scikit learn org stable modules g
  • 分类报告 - 精度和 F 分数定义不明确

    我从 sklearn metrics 导入了classification report 当我输入我的np arrays作为参数我收到以下错误 usr local lib python3 6 dist packages sklearn met
  • Python:由于 OSError 无法安装软件包:[Errno 2] 没有这样的文件或目录

    我尝试使用pip安装sklearn 并且我收到以下错误消息 错误 由于 OSError 无法安装软件包 Errno 2 没有这样的文件或目录 C Users 13434 AppData Local Packages PythonSoftwa
  • 使用 scikit-learn 从 GridSearchCV 获取进度更新

    我目前正在 Python 中实现支持向量回归 其中我通过 GridSearchCV 估计参数 C 和 gamma 我最初从大约 400 个 C 和 gamma 的组合中进行搜索 这是一个非常详尽的搜索 现在已经在我的计算机上运行了一个多小时
  • scikit随机森林sample_weights的使用

    我一直在试图弄清楚 scikit 的随机森林样本权重的使用 但我无法解释我看到的一些结果 从根本上说 我需要它来平衡分类问题和不平衡类 特别是 我期望如果我使用全 1 的 sample weights 数组 我会得到与以下相同的结果w sa
  • Sklearn SVM:SVR 和 SVC,为每个输入获得相同的预测

    这是代码的粘贴 支持向量机示例代码 http pastebin com dvWy5SpE 我查看了这个问题的其他几个答案 看起来这个问题的特定迭代有点不同 首先 我的输入被标准化 每个点有五个输入 这些值的大小都合理 健康的 0 5 秒和
  • Scikit - 结合比例和网格搜索

    我是 scikit 的新手 在结合数据规模和网格搜索时遇到两个小问题 高效洁牙机 考虑使用 Kfolds 进行交叉验证 我希望每次我们在 K 1 折叠上训练模型时 数据缩放器 例如使用 preprocessing StandardScale
  • 为什么 scikit learn 的平均精度分数返回 nan?

    我的 Keras 模型旨在接收两个输入时间序列 将它们连接起来 通过 LSTM 提供它们 并在下一个时间步骤中进行多标签预测 有 50 个训练样本 每个样本有 24 个时间步 每个样本有 5625 个标签 有 12 个验证样本 每个样本有
  • ValueError:未知标签类型:“连续”

    我看过其他帖子讨论过这个问题 但其中任何一个都可以帮助我 我在 Windows x6 机器上使用带有 Python 3 6 0 的 jupyter 笔记本 我有一个很大的数据集 但我只保留其中的一部分来运行我的模型 这是我使用的一段代码 d
  • 如何在sklearn决策树中显示特征名称?

    我目前有一个决策树 将功能名称显示为X index i e X 0 X 1 X 2 etc from sklearn import tree from sklearn tree import DecisionTreeClassifier d
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 编辑 scikit-learn 决策树

    我想编辑 sklearn DecisionTree 例如改变条件或切割节点 叶子等 但似乎没有功能可以做到这一点 如果我可以导出到文件 编辑它以导入 如何编辑决策树 环境 Windows 10 python3 3 sklearn 0 17
  • Scikit-learn 的内核 PCA:如何在 KPCA 中实现各向异性高斯内核或任何其他自定义内核?

    我目前正在使用Scikit learn 的 KPCA https scikit learn org stable modules generated sklearn decomposition KernelPCA html对我的数据集执行降
  • smooth_idf 是多余的吗?

    The scikit learn 文档 http scikit learn org stable modules generated sklearn feature extraction text TfidfTransformer html

随机推荐

  • react 字段拼接

    Array from columns el index1 gt
  • 正确解决:坑爹的0xc000007b

    1 出现0xc000007b 应用程序无法正常启动 其根本原因是缺乏所需要的DLL 提供了错误版本的dll相当于没有DLL 提示完全一样 2 网上有人说缺乏dx运行环境 如果属实 也是因为缺乏dx相关的dll 所以根本原因 在低一点 3 与
  • PyCharm运行Python代码时出现“未找到模块”错误

    PyCharm运行Python代码时出现 未找到模块 错误 在PyCharm中执行Python脚本时 有时会出现 ModuleNotFoundError No module named XXXX 错误 这种错误是因为在项目中没有安装对应的
  • C++求vector中的最大值

    习惯了Python的编程以后 再回过头来写C 感觉头都被搞大了 Python是一门高级语言 而C 是一门偏底层的语言 所以Python一行解决的问题用C 也许需要好几行 比如在一个列表中找最大值的问题 如果是Python的话 那么代码大概是
  • (二十八)业绩归因之Brinson模型

    单期Brinson模型 一个时期的基金收益可以分为四个部分 资产配置收益 个股选择收益 交互收益和基准组合收益 先构建4个概念性的组合 Q1 Q4 基准收益组合和实际投资组合 Q2 积极资产配置组合 这表示基金经理能自主选择资产配置的比例
  • 定时器中断控制LED状态实验

    一 STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器 PSC 驱动的 16 位自动装载计数 CNT 构成 STM32 的通用定时器可以被用于 测量输入信号的脉冲长度 输入捕获 或者产生输出波 输出比较和 PW
  • C++虚函数详解

    C 虚函数详解 前言 C 的特性使得我们可以使用函数继承的方法快速实现开发 而为了满足多态与泛型编程这一性质 C 允许用户使用虚函数 virtual function 来完成 运行时决议 这一操作 这与一般的 编译时决定 有着本质的区别 虚
  • 毕业设计-基于 MATLAB 的医学超声图像处理仿真平台设计与研究

    目录 前言 课题背景和意义 实现技术思路 一 平台的总体设计 二 医学超声图像处理仿真平台算法概述及 GUI 实现 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设
  • 管理的核心是什么?这里有一套科学、高效的团队管理法则

    员工就该牢牢约束才能管好 对于员工的管理尺度令许多管理者头大 管紧了 容易让员工产生反叛心理 甚至导致人员的流失 管的松了 员工好像又不怎么用心工作 其实在这里 很多管理者经常有一个误区就是 管理就是控制和约束 但实际上有效的管理是对员工的
  • MES系统最全介绍来了

    制造型企业在生产过程中 或多或少都会遇到以下生产问题 1 生产现场管理混乱 造成人力资源和物流的浪费 2 生产进度不透明 给业务和跟单带来诸多不便 3 不能及时了解产品不良率 质量控制难度大 4 仓储管理不规范 造成材料积压过多 物料查找麻
  • VMware Workstation 16 在此主机上不支持嵌套虚拟化 修复方法

    一 准备工作 已安装 VMware Workstation 16 Pro 以上版本 操作系统为 Windows 10 以上版本 设备已联网 并能访问到 VMware 官方服务器 二 操作步骤 1 升级 VMware Workstation
  • 想拿 20k 无压力?Android开发必读的一篇文章!

    程序员分很多种类和等级 如果要提高达到20k的概率 有两个条件如果满足的话 则很容易达到 1 一线城市 北上广深杭 2 互联网行业 如果你非得抬杠 我要在三线城市 做外包要赚20k的话 很难 我自己也做不到 所以 如果你要做程序员的话 必须
  • [Spring Boot]02 使用IDEA快速构建Spring Boot工程

    新建 Spring Initializr 项目 选择 Spring Initializr 如下图选择SDK和URL 点击NEXT 填写项目信息Group和Artifact 什么是Group和Artifact Group 是项目组织的唯一标识
  • MySQL高级篇_第18章_主从复制

    1 主从复制概述 1 1 如何提升数据库并发能力 在实际工作中 我们常常将 Redis 作为缓存与 MySQL 配合来使用 当有请求的时候 首先会从缓存中进行查找 如果存在就直接取出 如果不存在再访问数据库 这样就提升了读取的效率 也减少了
  • [vulnerhub] easy_cloudav write up

    摘要 0x1 靶机 192 168 88 13 靶机下载地址 https download vulnhub com boredhackerblog easy cloudantivirus ova 攻击机 192 168 88 8 每周六都会
  • Unity3D 移动物体方式总结

    简述 在Unity 3D中很多时候我们会想要移动一个物体到别的位置 如让想人物跑动起来 或者想要移动相机来跟随人物 有很多种方法可以改变物体的坐标 实现移动的目的 移动的本质是在每一帧中修改物体的position 在这里把之前使用过的移动物
  • python项目开发中首先要学习的几个知识点

    python项目开发中首先要学习的几个知识点 1 知识点 python中的推荐命名规范 python项目的推荐目录结构 python中 init py的作用 python中在不同文件夹 同一个文件夹两种情况下如何引用另一个 py文件 pyt
  • U-Net实现医学图像分割(pytorch)

    刚开始学习pytorch框架时候 在github上下载过大佬的图像分割代码来训练自己数据集 但是却经常报错 后面在kaggle上下载了一个比较简洁易理解的分割代码 又根据自己的需求进行了修改评价指标 网络框架搭建以及可视化功能编写 本文的主
  • 如何将LaTeX公式拷贝到Word中

    LaTeX可以方便地用来编辑公式 但是它的排版需要编译以后才能看到 Word就在公式编辑上着实让人觉得麻烦 但是Word可以及时显示你所编辑的内容 本文介绍一种方法来帮助你将LaTeX源码直接在Word中转化为公式 方法 有两种方法可供选择
  • Scikit-learn之支持向量机

    Scikit learn之支持向量机 1 支持向量机简介 2 SVM在sklearn中的实现 2 1 实现目标 2 2 实现步骤 2 3 线性核函数 2 4 多项式核函数 2 5 高斯核函数 2 6 总结 1 支持向量机简介 SVM 支持向