《机器学习算法》SVM进行多分类及代码实现

article/2025/9/8 1:19:19

最近做了一个工作就是对属性进行分类,然后用了不同的分类器,其中就用到了SVM,再次做一个总结。

1、什么是SVM?

对于这个点已经介绍的非常多了,不管是西瓜书还是各种博客,就是我们需要找到一个超平面,用这个超平面把数据划分成两个类别,最开始的SVM就是在二分类的问题上应用,在之后被扩展到多类别的分类。对于SVM的推导公式不是很复杂,在此就不进行推导,大概清楚最基本的原理然后就进行应用就可以了。

如下图所示,我们就是要找到中间这条线,使得||w||的值尽可能小,是正负样本离超平面的距离越大越好,分类的效果就越好。所有的优化都是围绕||w||开展的。

2、SVM的分类

对于线性的数据集而且是二分类的,我们可以直接使用SVM进行分类,就可以到得到一个超平面将这两个样本分离开,如图所示。我们大概是可以找到一个超平面将这个两个类别分离开。

如果我们遇到的数据集是线性不可分的,那就不太容易了,因此我们需要用到一个核函数,这个函数的作用就是将平面的数据都映射到高维空间去,比如把二维的数据映射到三维的立体空间中去,我们可以想象这样一个按类,如果桌子上有两个颜色的豆子,分布是非线性的,有可能红色的豆子包围着黑色的豆子,这样导致线性不可分,那么我们可以用手敲桌子然后让豆子都弹起来,这样把它映射到了三维的空间,我们就可以找到一个超平面然后进行分类了。

在这个过程中我们需要用到核函数,核函数主要就是把数据映射到高维,常用的核函数有如下:

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

3、SVM进行属性分类

目前SVM进行多分类主要是两种类型:OVR&OVO

假如现在又A B C这三个类别,然后我们需要进行多分类,然后针对不同的类别我们需要详细阐述

OVR

  • 将A分类正样本,BC那个类分为负样本
  • 将B分类正样本,AC那个类分为负样本
  • 将C分类正样本,AB那个分类为负样本
  • 先右测试数据D,分别丢到3个分类器中,然后看那个分类器的得分高,那么就把数据判别为哪个类别

OVO

  • 将AB分为一组正负样本
  • 将AC分为一组正负样本
  • 将BC分为一组正负样本
  • 现有测试数据D,分别丢到3个分类器中,统计哪个类别出现的次数最多,那就把数据判别为哪个类别

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

SVM都已经有写好的库函数,我们只需要进行调用就行了,这个SVM库集中在sklearn中,我们可以从sklearn导入.

如果我们进行二分类那就使用svm.LinearSVC(),当然SVM中还有SVR(支持向量回归)

svm = svm.SVC()
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma=‘auto’, kernel=‘rbf’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

大概说一下几个比较重要的参数,或者是在训练中我们需要注意是超参数。

  • 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、代码

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

from sklearn.datasets import make_blobs
from sklearn import svm
import numpy as np
import torch
import numpy
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utilsclass attDataset(Dataset):def __init__(self,path):super(attDataset,self).__init__()atts=[]with open(path,'r',encoding='utf-8') as f:f = f.readlines()for row in f:row = row.split()att = row[:-1]att = [int(i) for i in att]label = int(row[-1])atts.append([att,label])self.atts = attsdef __getitem__(self, index):attribute,label = self.atts[index]return attribute,label#return torch.Tensor(attribute),torch.Tensor([label])def __len__(self):return len(self.atts)path_train = r'./apascal/attribute_data/attribute_dataset.txt'
path_test = r'./apascal/attribute_data/attribute_dataset_test.txt'train_features = []
train_label = []
test_features = []
test_label = []train_set =  attDataset(path=path_train)
test_set  =  attDataset(path=path_test)for att,label in train_set:train_features.append(att)train_label.append(label)for att,label in test_set:test_features.append(att)test_label.append(label)train_features = numpy.array(train_features)
train_label = numpy.array(train_label)
test_features = numpy.array(test_features)
test_label = numpy.array(test_label)clf = svm.SVC(C=5, gamma=0.05,max_iter=200)
clf.fit(train_features, train_label)#Test on Training data
train_result = clf.predict(train_features)
precision = sum(train_result == train_label)/train_label.shape[0]
print('Training precision: ', precision)#Test on test data
test_result = clf.predict(test_features)
precision = sum(test_result == test_label)/test_label.shape[0]
print('Test precision: ', precision)

结果:

我没有进行调参,得到的结果还算不错,如果对超参进行调整可能准确率会更高一些吧。


http://chatgpt.dhexx.cn/article/lIlit6mG.shtml

相关文章

android uevent机制,安卓linux uevent内核上报机制实例

uevent可以实现内核通知上层的一种机制,最常见的电池状态的变化就是kernel uevent通知的,每次百分比或者其他的变化通过power_supply_changed通知上层update; 每个device下面都有kobj,找到device就可以通过kobject_uevent_env 通知android了; 以拔出T卡为例,内核通知上层。…

Linux设备模型剖析系列之二(uevent、sysfs)

CSDN链接: Linux设备模型剖析系列一(基本概念、kobject、kset、kobj_type) Linux设备模型剖析系列之二(uevent、sysfs) Linux设备模型剖析系列之三(device和device driver) Linux设备模型剖析系…

Linux下的uevent

查找linux的uevent节点(find /sys -name uevent),大概有1000多个,那这些节点是怎么实现的呢。 drivers/base/core.c 有如下代码,每创建一个device,都会创建一个event节点 static ssize_t uevent_show(struct device *dev, struc…

Android UEvent事件分析

1.背景概述 众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。 比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。 从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个…

嵌入式Linux——uevent机制:uevent原理分析

简介: 本文主要介绍uevent机制是什么,并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分,第一部分我们介绍一些预备知识和uevent的原理,而第二部分——通过代码介绍使用uevent机制创建设备节点。 Linux内核&am…

uevent机制:uevent原理分析

简介: 本文主要介绍uevent机制是什么,并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分,第一部分我们介绍一些预备知识和uevent的原理,而第二部分——通过代码介绍使用uevent机制创建设备节点。 声明&#…

900 多道 LeetCode 题解,这个 GitHub 项目值得 Star!

公众号关注 “GitHubPorn” 设为 “星标”,每天带你逛 GitHub! 大家好,我是小 G。 周末风和日丽,适合刷 LeetCode 今天给你们推荐个 GitHub 项目,里面收集了 900 多道 LeetCode 题解,并包含中英文两个版本&…

Leetcode中你的代码执行之后显示超出时间限制

Leetcode中但凡是你的代码执行之后显示超出时间限制 比如: 那么必定是你写的代码不够完善甚至是还存在错误!

升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!

对于还不了解LeetCode的同学,那比较厉害了,估计离大厂还有一步距离! LeetCode,让程序员进阶的在线平台,找工作备战名企技术面试!(文末阅读原文到达学习平台) 本公众号之前陪伴了几期LeetCode的打卡之旅&…

LeetCode 96~100

前言 本文隶属于专栏《LeetCode 刷题汇总》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 96. 不同的二叉搜索树 题解 官方…

【下载】快速通过Python笔试?学大家一样先把LeetCode答案私藏了

如今学习python的同学越来越多了,也正是同学们秋招时期,去年分享了LeetCode答案后,已经有上百位同学找到小编开始实践这个平台。 LeetCode,让程序员进阶的在线平台,找工作备战名企技术面试!(文末阅读原文到…

面试失败总结,这 577 道 LeetCode 题 Java 版答案你值得拥有

去字节、美团、BAT 等大厂面试,刷 LeetCode 上的数据结构算法题是必修课。许多读者说,刷题的时候经常会遇到困难,想要找一本答案题解做参考。 下面分享几个用 Java 语言实现的开源 LeetCode 题解,也要感谢这些优秀的开源作者们&a…

LeetCode答案大全题(java版)

思路:查找时, 建立索引(Hash查找) 或进行排序(二分查找)。本题缓存可在找的过程中建立索引,故一个循环可以求出解(总是使用未 使用元素查找使用元素,可以保证每一对都被检…

LeetCode数据库题目汇总一(附答案)

1、基础SQL 数据表: dept: deptno(primary key), dname, loc emp: empno(primary key), ename, job, mgr(references emp(empno)), sal, deptno(references dept(deptno)) 1 列出emp表中各部门的部门号,最高工资,最低工资 select max(sal) as 最高工资,min(sal) as 最…

Leetcode各种题型题目+思路+代码(共176道题及答案)

文章目录 第一章:Leetcode 每日很多题 1、Leetcode-1047 删除字符串中的所有相邻重复项 2、剑指 Offer 53 - I. 在排序数组中查找数字 I 3、Leetcode704:二分查找 4、 Leetcode 227:基本计算器II 5、leetcode 224:基本计算器(带括号的计…

Leetcode Top100题目和答案(Java完整版 面试必备)

二刷完剑指Offer后又刷了一遍Leetcode Top 100专栏的题目,听说基本上能涵盖面试的算法题,总体来说收获还是很大的,下面贴出答案,又不懂的可以给我留言,博主会及时解答。 我的github 准备把春招复习的知识都整理到githu…

数据可视化-柱状图-dict结构MACARONS主题

from pyecharts.charts import Bar from pyecharts.faker import Faker from pyecharts.globals import ThemeTypec (Bar({"theme": ThemeType.MACARONS}).add_xaxis(Faker.choose()).add_yaxis("商家A", Faker.values()).add_yaxis("商家B", F…

echarts图表主题--马卡龙macarons--自己配置主题颜色

用过echarts的人都几道,他的官网风格颜色对比强烈,这样儿式的: 大多时候和你的项目风格难免冲突,它有一些风格配置,我觉得马卡龙这个配色就很好: 当然,既然是配置项,肯定不止这一种…

若依vue --雷达图封装使用

大概效果: 如下 1:封装 <template><div :class"className" :style"{ height: height, width: width }" /> </template><script> import echarts from "echarts"; require("echarts/theme/macarons"); // e…

vuejs集成echarts的一些问题

最近在做Beetlex的数据分析平台&#xff0c;在开发这个产品过程中涉及到大量的数据图表展示功能&#xff1b;由于产品前端使用的是vuejs开发&#xff0c;所以在集成echarts或多或少会碰到一些问题&#xff0c;在这里主要讲解一下碰到的问题和解决方法。 在讲解之前先分享一下实…