【机器学习】SVM多分类问题及基于sklearn的Python代码实现

news2025/4/7 0:46:36

SVM多分类问题及Python代码实现

  • 1. 什么是SVM?
  • 2. SVM的分类
  • 3. SVM决策函数类型
  • 4. SVM多分类的Python代码实现
  • 参考资料

1. 什么是SVM?

对于这个点已经介绍的非常多了,不管是西瓜书还是各种博客,就是需要找到一个超平面,用这个超平面把数据划分成两个类别,最开始的SVM就是在二分类的问题上应用,在之后被扩展到多类别的分类。对于SVM的推导公式不是很复杂,在此就不进行推导,大概清楚最基本的原理然后就进行应用就可以了。
SVM示意图
如上图所示,我们就是要找到中间这条线,使得 ∣ ∣ w ∣ ∣ ||w|| w的值尽可能小,是正负样本离超平面的距离越大越好,分类的效果就越好。所有的优化都是围绕 ∣ ∣ w ∣ ∣ ||w|| w开展的。

2. SVM的分类

对于线性的数据集而且是二分类的,我们可以直接使用SVM进行分类,就可以到得到一个超平面将这两个样本分离开,如图所示。我们大概是可以找到一个超平面将这个两个类别分离开。
SVM的二分类
如果遇到的数据集是线性不可分的,那就不太容易了,因此需要用到一个核函数,这个函数的作用就是将平面的数据都映射到高维空间去,比如把二维的数据映射到三维的立体空间中去,可以想象这样一个按类,如果桌子上有两个颜色的豆子,分布是非线性的,有可能红色的豆子包围着黑色的豆子,这样导致线性不可分,那么我们可以用手敲桌子然后让豆子都弹起来,这样把它映射到了三维的空间,我们就可以找到一个超平面然后进行分类了。
线性不可分数据
在这个过程中需要用到核函数,核函数主要就是把数据映射到高维,常用的核函数有如下

  • 线性核函数
  • 多项式核函数
  • 高斯核函数
  • 拉普拉斯核函数
  • Sigmoid核函数

3. SVM决策函数类型

目前SVM进行多分类主要是两种决策函数(decision function)类型:OVR和OVO。假如现在有A B C这三个类别,然后需要进行多分类,然后针对不同的类别需要详细阐述

  1. OVR
    • 将A分类正样本,BC那个类分为负样本
    • 将B分类正样本,AC那个类分为负样本
    • 将C分类正样本,AB那个分类为负样本
      现有测试数据D,分别丢到3个分类器中,然后看哪个分类器的得分高,那么就把数据判别为哪个类别
  2. OVO
    • 将AB分为一组正负样本
    • 将AC分为一组正负样本
    • 将BC分为一组正负样本
      现有测试数据D,分别丢到3个分类器中,统计哪个类别出现的次数最多,那就把数据判别为哪个类别

一般情况,使用OVR还是比较多的,默认也就是OVR。如果有n个类别,那么使用OVO训练的分类器就是 ( 2 n ) \binom{2}{n} (n2),因此一般情况下使用OVR这种分类。

SVM都已经有写好的库函数,只需要进行调用就行了,这个SVM库集中在sklearn中,可以从sklearn导入。如果进行二分类那就使用svm.LinearSVC(),当然SVM中还有SVR(支持向量回归)

class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', 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', break_ties=False, random_state=None)

参数解释:

  • C越大说明分类的越准确,但是有可能出现过拟合;C越小,噪声点越多,泛化能力越强,容易欠拟合
  • decision_function_shape=‘ovr’,如果进行多分类是需要声明的,不声明默认就是ovr
  • degree 多项式的维度
  • gamma 就是高斯函数中的 σ \sigma σ
  • kernel 就是核函数默认是rbf,也就是高斯核函数
  • max_iter 最大的迭代次数
  • propobaility是否采用概率估计,默认是否
  • tol 误差控制在0.001的时候就停止训练,max_iter默认是-1,就用tol来控制什么时候停止训练
  • verbose允许冗余输出

C和gamma都是典型的超参数,可以通过列举组合法最终判定模型最优的时候超参数的设置。

4. SVM多分类的Python代码实现

背景:训练集有500条,测试集有400条。每一个对象对应的类别都是不一样的,对象的维度是64维,分类为20类,因此就需要用使用SVM进行多分类。

import numpy as np
from sklearn import svm

from utils import get_basic_config
from data import DefineData

print(">>> Load Dataset!")
basic_config = get_basic_config()
dataset = DefineData(data_config=basic_config)

X = pd.DataFrame(dataset.feature_mat)
Y = pd.DataFrame(dataset.labels)

train_features = np.array(X.loc[dataset.idx_train])
test_features = np.array(X.loc[dataset.idx_test])

train_label = np.array(Y.loc[dataset.idx_train][0])
test_label = np.array(Y.loc[dataset.idx_test][0])

clf = svm.SVC(C=10, gamma=0.8, max_iter=200)
clf.fit(train_features, train_label)

train_result = clf.predict(train_features)
precision = np.sum(train_result == train_label)/train_label.shape[0]
print('Training precision:', precision) # Training precision: 0.5396419437340153

test_result = clf.predict(evaluation_features)
precision = np.sum(test_result == evaluation_label)/evaluation_label.shape[0]
print('Test precision:', precision)  # Test precision: 0.37662337662337664

参考资料

[1] https://blog.csdn.net/weixin_37724529/article/details/109320365
[2] 利用pytorch实现多分类器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Zset和Hash类型

Hash类型 Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Hash 类型的底层数据结构是由压缩列表或哈希表实现的: 如果哈希类型元素小于512个,所有值的大小小于64字节。Redis…

一不小心手动实现了k8s的自动化构建

背景 由于公司需要对公司内部的软件需要对外部署,对于前端的部署,需要一套部署的方案。尝试了写了一个适配多模块可配置的部署脚本,本文对实现的过程进行一个记录。 目的 脚本采用的是node,前端同学的首选。脚本的目的就是实现k8s…

企业在ERP系统下的全面预算管理系统的实现

现代企业的发展离不开各种管理系统的建立和应用,针对于企业预算管理而言,全面的管理系统对于企业实现现代化管理有着较为深入的影响,ERP系统可以帮助企业更好的实现此项功能,本文就是在此背景下展开论述的。 编辑搜图 一、全面预算…

文件上传自动化测试方案

一、概述 【测试地址】:https://pan.baidu.com 【测试工具】selenium、requests 【脚本语言】Python 【运行环境】Windows 百度网盘作为文件存储及分享的平台,核心功能大部分是对文件的操作,如果要对它进行自动化测试,优先覆…

马克思主义基本原理笔记(黄色标记要求会背)

马克思主义基本组成部分 马克思主义哲学马克思主义政治经济学科学社会主义历史学、政治学、法学、文化学、新闻学、军事学等 唯物主义,唯心主义划分标准 唯物主义:把世界的本原归结为物质,主张物质是第一性,意识第二性&#xff0c…

Docker容器网络入门

1、查看默认网络模式 首先假定已经安装好docker了,不会安装的可以看我其他文章,很简单。docker安装好后默认是提供三种网络模式(bridge、host、none),可以使用命令docker network ls查看网络状态 [rootlocalhost ~]#…

构建平衡二叉树(数据结构)

构建二又平衡树,插入的节点序列依次为:70 60 40 90 80 98 我们先了解一个构造规则 1、将每一个节点按照顺序依次使用 2、先将第一个节点画在图上,将第二个节点与第一个节点比较, (1)若比该节点大,第二个…

飞行员兄弟(蓝桥杯C/C++B组真题详解)

目录 题目链接:116. 飞行员兄弟 - AcWing题库​​​​​​ 题目思路: 代码详解: 题目链接:116. 飞行员兄弟 - AcWing题库​​​​​​ 题目思路: 1.我们可以知道 对于任意一个点 重复的按两次的话 回不改变原状…

ADI Blackfin DSP处理器-BF533的开发详解43:图像处理专题-ReverseColor (图像反色处理)(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像反色处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

Linux下局域网yum源配置

文章目录一 需求二 搭建环境准备三 服务端1 创建镜像存放目录与挂载目录2 上传centos7镜像3 对镜像文件进行挂载4 配置本地yum源5 对挂载点建立软链接6 安装http服务7 浏览器验证http服务是否正常启动四 客户端1 修改yum配置文件2 查看yum源一 需求 公司集群架构中&#xff0c…

【linux】之大数据基础平台实施及运维上

一、大数据介绍 学习目标 能够了解为什么使用大数据技术 能够了解大数据指的是什么 为什么使用大数据技术? 数据量越来越大 数据量越来越大数据分析的实时性越来越强数据结果的应用越来越广泛 结论:我们需要使用大数据技术 大数据的定义 大数据是收…

GC垃圾回收器

分代收集器 新生代回收器 Serial:复制算法 | 单线程 | 适合内存不大的场景 ParNew:复制算法 | 多线程 | Serial收集器多线程版本 Parallel Scavenge:复制算法 | 多线程 | 类ParNew,更关注吞吐量 老年代回收器 Serial Old&#xf…

postgresql文件结构

一、控制文件 pg_controldata $PGDATA 二、数据文件 pg中,每个索引、每个表都是一个单独的文件,pg中称为page(也称为段),默认是每个大于1G的page会被分割。例如某个表有200g的大小,那么会被分割为200个文件存储 sel…

Gateway限流的使用

目录 1. 限流的使用场景 2. gateway限流实现 2.1 前提: 2.2 导入依赖包 2.3 在项目配置文件中配置redis​编辑 2.4 开发限流需要的Bean​编辑 2.5 为服务配置限流参数 2.6 压力测试 3. 熔断 3.1 熔断的使用场景 1. 限流的使用场景 为什么限流 限流就是限制…

web网页设计期末课程大作业 基于HTML+CSS+JavaScript制作八大菜系介绍舌尖上的美食5页

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

4、Metasploit系列----未知目标测试

靶机Metasploitable2:192.168.11.105 攻击机kail:192.168.11.106 一、创建工作空间 显示数据库未连接:使用msfdb init对数据进行初始化:db_status显示数据库已连接。使用命令workspace -a 192.168.11.105创建目标工作空间。二、信…

Spring Batch 批处理-作业参数校验

引言 接着上篇:Spring Batch 批处理-作业参数设置与获取,了解作业参数设置与获取后,本篇就来了解一下Spirng Batch 作业参数的校验。 作业参数校验 当外部传入的参数进入步骤处理时,我们需要确保参数符合期望。比如&#xff1a…

前端实现电子签名(web、移动端)通用

前言 在现在的时代发展中,从以前的手写签名,逐渐衍生出了电子签名。电子签名和纸质手写签名一样具有法律效应。电子签名目前主要还是在需要个人确认的产品环节和司法类相关的产品上较多。 举个常用的例子,大家都用过钉钉,钉钉上…

对于双欧拉角(正反欧拉角)的一些理解和思考

文章目录一、正反欧拉角定义二、相关文献阐述三、对正反欧拉角的思考四、参考代码五、参考文献最近看到有人讨论“双欧拉角”或者“正反欧拉角”的问题,因为自己之前没听说过这个概念,为了避免无知,因此找了一些文献进行学习和理解。不过基于…

mysql优化,SELECT语句创建理想索引

思考索引的问题: 1.为什么主键索引比非主键索引快? 2.为什么sql使用like关键字 “%XXX%”无法走索引,而“XXX%”可以? 3.为什么有索引的字段,数据量大了后,增删改会很慢? 一. 了解数据库索引的必…