当前位置: 首页 > news >正文

使用SVM模型完成分类任务

    SVM,即支持向量机(Support Vector Machine),是一种常见的机器学习算法,用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中,在该空间中找到一个最优的超平面,将不同类别的数据点分开。这个最优的超平面可以最大化不同类别数据点之间的间隔,从而使得分类的边界更加鲁棒和稳定。在实际应用中,SVM的核函数可以使用不同的变换,包括线性核、多项式核和径向基函数(RBF)核等,以适应不同的数据类型和特征空间。SVM算法在分类和回归问题上都具有很好的表现,并且具有较强的泛化能力和鲁棒性。 

    SVM本身是一个二值分类器,最初是为二分类问题设计的,也就是回答Yes或者是No。而实际上我们要解决的问题,可能是多分类的情况,比如对文本进行分类,或者对图像进行识别。针对这种情况,我们可以将多个二分类器组合起来形成一个多分类器,常见的方法有“一对多法”和“一对一法”两种。

1.一对多法

假设我们要把物体分成A、B、C、D四种分类,那么我们可以先把其中的一类作为分类1,其他类统一归为分类2。这样我们可以构造4种SVM,分别为以下的情况:

(1)样本A作为正集,B,C,D作为负集;

(2)样本B作为正集,A,C,D作为负集;

(3)样本C作为正集,A,B,D作为负集;

(4)样本D作为正集,A,B,C作为负集。

这种方法,针对K个分类,需要训练K个分类器,分类速度较快,但训练速度较慢,因为每个分类器都需要对全部样本进行训练,而且负样本数量远大于正样本数量,会造成样本不对称的情况,而且当增加新的分类,比如第K+1类时,需要重新对分类器进行构造。

2.一对一法

一对一法的初衷是想在训练的时候更加灵活。我们可以在任意两类样本之间构造一个SVM,这样针对K类的样本,就会有C(k,2)类分类器。

比如我们想要划分A、B、C三个类,可以构造3个分类器:

(1)分类器1:A、B;

(2)分类器2:A、C;

(3)分类器3:B、C。

当对一个未知样本进行分类时,每一个分类器都会有一个分类结果,即为1票,最终得票最多的类别就是整个未知样本的类别。这样做的好处是,如果新增一类,不需要重新训练所有的SVM,只需要训练和新增这一类样本的分类器。而且这种方式在训练单个SVM模型的时候,训练速度快。上面介绍了SVM的相关概念,在实际应用中,如果要使用SVM完成分类问题,实际包含5步骤

  1. 收集数据:收集用于分类的数据集,并将每个数据点标记为其相应的类别。

  2. 特征选择和数据预处理:选择用于分类的特征,对数据进行预处理,如归一化、缩放或标准化等,以便在训练模型之前使数据更具有可比性和可解释性。

  3. 分割训练集和测试集:将数据集分为训练集和测试集,以便训练模型并评估其性能。

  4. 训练模型:使用训练集训练SVM模型,并选择适当的核函数和参数。

  5. 模型评估:使用测试集评估模型的性能,并根据需要调整模型参数和核函数。

  6. 应用模型:使用训练好的SVM模型对新数据进行分类,预测其类别,并根据预测结果进行相应的决策或操作。

下面是使用Skitlearn提供的函数,采用SVM模型完成分类任务的demo代码。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline# Load the iris dataset
iris = datasets.load_iris()# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data,iris.target,test_size=0.3,random_state=42)# Create a pipeline that standardizes the data and applies an RBF kernel SVM
pipeline = make_pipeline(StandardScaler(), SVC(kernel='rbf'))# Train the pipeline on the training data
pipeline.fit(X_train, y_train)# Use the trained pipeline to make predictions on the testing data
y_pred = pipeline.predict(X_test)# Calculate the accuracy of the pipeline
accuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy}")

在上面的demo代码中,make_pipeline(StandardScaler, SVC(kernel='rbf'))中传入的核函数,SVC是Support Vector Classification的缩写,SVC的构造函数:model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=‘auto’),这里有三个重要的参数kernel、C和gamma。kernel代表核函数的选择,它有四种选择,只不过默认是rbf,即高斯核函数。

  1. linear:线性核函数

  2. poly:多项式核函数

  3. rbf:高斯核函数(默认)

  4. sigmoid:sigmoid核函数

这四种函数代表不同的映射方式,线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。sigmoid经常用在神经网络的映射中。因此当选用sigmoid核函数时,SVM实现的是多层神经网络。

上面的Demo是比较简单的一个例子,下面再来看一个稍微复杂的Demo例子。下面这个例子多了数据处理和特征选择的过程,相比较上面的例子,最终还是生成一份特性矩阵和lable的数据。

# -*- coding: utf-8 -*-
# 乳腺癌诊断分类
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler# 加载数据集,你需要把数据放到目录中
data = pd.read_csv("./breast_cancer_data/data.csv")# 数据探索
# 因为数据集中列比较多,我们需要把dataframe中的列全部显示出来
pd.set_option('display.max_columns', None)
print(data.columns)
print(data.head(5))
print(data.describe())# 将特征字段分成3组
features_mean = list(data.columns[2:12])
features_se = list(data.columns[12:22])
features_worst = list(data.columns[22:32])# 数据清洗
# ID列没有用,删除该列
data.drop("id", axis=1, inplace=True)
# 将B良性替换为0,M恶性替换为1
data['diagnosis'] = data['diagnosis'].map({'M': 1, 'B': 0})# 将肿瘤诊断结果可视化
sns.countplot(data['diagnosis'], label="Count")
plt.show()
# 用热力图呈现features_mean字段之间的相关性
corr = data[features_mean].corr()
plt.figure(figsize=(14, 14))
# annot=True显示每个方格的数据
sns.heatmap(corr, annot=True)
plt.show()# 特征选择
features_remain = ['radius_mean', 'texture_mean', 'smoothness_mean', 'compactness_mean','symmetry_mean', 'fractal_dimension_mean'
]# 抽取30%的数据作为测试集,其余作为训练集
train, test = train_test_split(data,test_size=0.3)  # in this our main data is splitted into train and test
# 抽取特征选择的数值作为训练和测试数据
train_X = train[features_remain]
train_y = train['diagnosis']
test_X = test[features_remain]
test_y = test['diagnosis']# 采用Z-Score规范化数据,保证每个特征维度的数据均值为0,方差为1
ss = StandardScaler()
train_X = ss.fit_transform(train_X)
test_X = ss.transform(test_X)# 创建SVM分类器
model = svm.SVC()
# 用训练集做训练
model.fit(train_X, train_y)
# 用测试集做预测
prediction = model.predict(test_X)
print('准确率: ', metrics.accuracy_score(prediction, test_y))

原始数据Data.csv是一份检测乳腺癌特征值的数据,其中Diagnosis为M表示阳性,为B表示阴性。 后面的字段都是特征值,每种特征值包含mean,se,worst三种情况,上面的demo代码中选取了mean作为特性字段,对数据进行降维处理。

相关文章:

使用SVM模型完成分类任务

SVM,即支持向量机(Support Vector Machine),是一种常见的机器学习算法,用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中,在该空间中找到一个最优的超平面,将不同类别的数据点分开…...

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉…...

开发经验分享之:import引入包和@Autowired注入类有什么区别

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 import 和 Autowired 想必大家在 Java 开发中使用频率最多的关键字之一了把,这篇博客将解释这两个概念的区别和作用,帮助你更好地理解它们在Ja…...

MySQL和Oracle区别

由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…...

QT--day6(人脸识别、图像处理)

人脸识别&#xff1a; /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...

深度学习:常用优化器Optimizer简介

深度学习&#xff1a;常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降&#xff0c;但往往深度学习的训练集规模很大&#xff0c;计算整个训练集的梯度需要很大…...

【算法心得】二维dp的状态转移狂练

LCS&#xff1a; LCS变式&#xff1a;使两个字符串变成一样的&#xff0c;删除的和最小 https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/ 建表 m ∗ n m*n m∗n or ( m 1 ) ∗ ( n 1 ) (m1)*(n1) (m1)∗(n1)&#xff1f; 感觉 ( m 1 ) ∗ ( n …...

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1. vars 如 API 文档 所言&#xff0c;这是定义变量的类&a…...

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…...

正则表达式、常用的正则

文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字&#xff08;包括正数、负数、零&#xff09;只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...

ST官方基于米尔STM32MP135开发板培训课程(一)

本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例&#xff0c;讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载&#xff1a; ‍https://www.st.com/en/embedded-software/stm32mp1dev.ht…...

组件(lvs,keeplive,orm,mysql,分布式事务)

lvs LVS 已经集成到Linux内核系统中&#xff0c;ipvsadm 是 LVS 的命令行管理工具。 目前有三种 IP 负载均衡技术&#xff08; VS/NAT 网络地址转换 、VS/TUN IP 隧道技术实现虚拟服务器 和 VS/DR 直接路由&#xff09;&#xff1b; 八种调度算法&#xff1a;轮询 …...

《视觉SLAM十四讲》报错信息和解决方案

文章目录 ch4-Sophus编译报错ch5/imageBasics安装opencv4.x报错ch5/joinMap/CMakeLists.txt编译报错ch5/joinMap-pcl_viewer map.pcd报错 ch4-Sophus编译报错 报错信息&#xff1a; error: lvalue required as left operand of assignmentunit_complex_.real() 1.;^~ error:…...

golang 设置http请求代理

tinypoxy 搭建http代理服务可参考&#xff1a;tinyproxy搭建http代理_wangxiaoangg的博客-CSDN博客 需求背景&#xff1a; 项目需要访问一国外服务接口&#xff0c;地址被墙。购买香港ecs服务器&#xff0c;并在上面搭建http代理服务。 一 使用http和https代理 func main() {pr…...

我的会议(会议通知)

前言: 我们在实现了发布会议功能&#xff0c;我的会议功能的基础上&#xff0c;继续来实现会议通知的功能。 4.1实现的特色功能&#xff1a; 当有会议要参加时&#xff0c;通过查询会议通知可以知道会议的内容&#xff0c;以及当前会议状态&#xff08;未读&#xff09; 4.2思路…...

css实现水平居中

代码示例 <div class"box"><div class"box1"></div> </div>1.弹性布局&#xff1a;&#xff08;推荐&#xff09; display:flex&#xff1b; 这些要添加在父级的&#xff0c;是父级的属性 //父级添加display:flex; //父级添加jus…...

c刷题(一)

目录 1.输出100以内3的倍数 2.将3个数从大到小输出 3.打印100~200素数 方法一 方法二 4.显示printf的返回值 最大公约数 试除法 辗转相除法 九九乘法表 求十个数的最大值 1.输出100以内3的倍数 法一&#xff1a; int n 0; while (n*3 < 100){printf("%d &q…...

webpack

文章目录 webpack概念打包的场景为什么要打包在打包之外 - 翻译在打包之外 - 小动作 课程重点模块化利用立即执行函数来改变 作用域模块化的优点模块化方案的进化史AMD&#xff08;成型比较早&#xff0c;应用不是很广泛&#xff09;COMMONJSES6 MODULE webpack 的打包机制webp…...

反复 Failed to connect to github.com port 443 after xxx ms

前提&#xff1a;使用了代理&#xff0c;浏览器能稳定访问github&#xff0c;但git clone一直超时 解决方案&#xff1a; 1. git config --global http.proxy http://127.0.0.1:1080 2. 代理设置端口1080 3. 1080可自定义 感谢来自这篇博客和评论区的提醒&#xff1a;解决…...

ARM裸机-11

1、安装交叉编译工具工具 1.1、windows中装软件的特点 windows中装软件使用安装包&#xff0c;安装包解压后有两种情况:一种是一个安装文件 (.exe/.msi)&#xff0c;双击进行安装&#xff0c;下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式&#xff0c;我们平时使用快…...

centos7升级glibc

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 安装bison&#xff1a; yum install bison -y安装wget、bzip2、gcc、gcc-c和glibc-headers&#xff1a; yum -y install wget bzip2 gcc gcc-c glibc-headers安装make-4.2.1&#xff1a; wget http://ftp.…...

【OnnxRuntime】在linux下编译并安装C++版本的onnx-runtime

目录 安装C接口的onnx-runtime安装依赖项&#xff1a;下载源文件构建ONNX Runtime安装ONNX Runtime 安装C接口的onnx-runtime 安装依赖项&#xff1a; 安装CMake&#xff1a;可以通过包管理器&#xff08;如apt、yum等&#xff09;安装CMake。 安装C编译器&#xff1a;确保系…...

C#基于OpenCv(OpenCvSharp) 的 fftshift, ifftshift 函数的实现

本文实现基于OpenCv(OpenCvSharp) 的 fftshift, ifftshift 函数。 fftshift 函数将信号频谱的零频分量移动到数组中心, 本质是分别对调一三象限数据。 ifftshift完成相反的操作,本质是二四象限的数据块。 OpenCV中没有这两个函数如果使用需要自己实现。 实现代码如下: …...

【SpringBoot】笔记2

文章目录 45、web实验-抽取公共页面46、web实验-遍历数据与页面bug修改47、视图解析-【源码分析】-视图解析器与视图[暂时没看]48、拦截器-登录检查与静态资源放行49、拦截器-【源码分析】-拦截器的执行时机和原理50、文件上传-单文件与多文件上传的使用51、文件上传-【源码流程…...

Spring事务传播机制详细讲解

文章目录 一、事务传播机制1. REQUIRED&#xff1a;2. SUPPORTS&#xff1a;3. MANDATORY&#xff1a;4. REQUIRES_NEW&#xff1a;5. NOT_SUPPORTED&#xff1a;6. NEVER&#xff1a;7. NESTED&#xff1a; 二、事务传播机制分类1. 支持当前事务的传播机制&#xff1a;REQUIRE…...

kubernetes 集群搭建(kubeadm 方式)

目前生产部署 Kubernetes 集群主要有两种方式&#xff1a; &#xff08;1&#xff09; kubeadm Kubeadm 是一个 Kubernetes 官方提供的命令行工具&#xff0c;可以用来部署和管理 Kubernetes 集群。它主要用于在新的 Kubernetes 环境中初始化集群、添加或删除节点等操作。 K…...

基于ARM+FPGA的驱控一体机器人控制器设计

目前市场上工业机器人&#xff0c;数控机床等多轴运动控制系统普遍采用运动控制器加 伺服驱动器的分布式控制方式。在这种控制方式中&#xff0c;控制器一方面完成人机交互&#xff0c;另 一方面进行 NC 代码的解释执行&#xff0c;插补运算&#xff0c;继而将计算出来的位…...

docker 安装 字体文件

先说一下我当前的 场景 及 环境&#xff0c;这样同学们可以先评估本篇文章是否有帮助。 环境&#xff1a; dockerphp8.1-fpmwindows 场景&#xff1a; 来了个需求&#xff0c;有一个默认背景图&#xff0c;可以理解为背景图是一个 "相框"&#xff0c;相框里面就会放…...

Vue.js与ASP.NET的结合,实现企业级应用的开发和部署

在当今快速发展的互联网技术领域&#xff0c;企业级应用的开发和部署变得越来越重要。Vue.js和ASP.NET是两个在前端和后端开发中广泛使用的技术&#xff0c;将它们结合起来可以为企业级应用的开发和部署带来诸多优势。本文将通过代码示例介绍如何使用Vue.js和ASP.NET进行企业级…...

Uncaught SyntaxError: ‘‘ string literal contains an unescaped line break

今天在修改前端页面的时候&#xff0c;页面报错了&#xff0c;提示了这个信息 Uncaught SyntaxError: string literal contains an unescaped line break 问题指向这行代码&#xff0c;这就是通过JS渲染一个easyui的搜索框&#xff0c;仔细确认之后&#xff0c;发现没有任何问…...