【ML笔记】5、支持向量机(SVM)

news2024/10/3 10:43:28

支持向量机(SVM)是一个强大的和通用的ML模型,能够执行分类,回归,甚至异常值检测,特别适合于复杂的中小型数据集。

1、线性SVM分类

我们可以看到,这两个类可以很容易地用一条直线(线性可分)分开。左图显示了三种可能的线性分类器的决策边界。虚线模型很糟糕,没有将两组实例线性分开。另外两个模型在训练集上工作得很好,但它们的边界太接近训练数据点,可能在未见数据上表现不佳(泛化能力不够好)。

相比之下,右边的模型不仅线性分离了训练数据,而且尽可能远离这两类数据点。因此,它很可能在未见的数据上表现良好(泛化能力较好)。

我们可以认为SVM是在类之间拟合尽可能宽的街道(由虚线表示),这就是所谓的大间隔分类。且添加更多的样本点在“街道”外并不会影响到判定边界,因为判定边界是由位于“街道”边缘的样本点确定的,这些样本点被称为“支持向量”(右图中粉色圈圈出的训练数据点)。

SVM同样也是对特征提取敏感的。

软间隔分类

如果我们将所有的训练实例限制在SVM街道之外,这被称为硬间隔分类,硬间隔分类在很大程度上受到异常值的影响。可以想象到离群值(异常值)会搞乱硬边距分类器:

左图因为离群值的存在,甚至不能拟合出合适的SVM分类(线性不可分),右图虽然线性可分但是间隔很小。

为了避免上述问题,我们更倾向于使用软性模型。目的在保持“街道”尽可能大和避免间隔违规(例如:数据点出现在“街道”中央或者甚至在错误的一边)之间找到一个良好的平衡,这就是软间隔分类。
在Scikit-Learn库的SVM类,你可以用C超参数(惩罚系数)来控制这种平衡:较小的 C 会拟合更宽的“街道”,但会带来更多的间隔违规:

要注意,C值更小的模型虽然间隔违规点更多,但分类器似乎泛化性更好:在这个训练数据集上减少了预测错误,因为实际上大部分的间隔违规点出现在了判定边界正确的一侧。因此如果你的模型过拟合,你可以尝试通过适当减小超参数 C 去调整。

以下的Scikit-Learn 代码加载了内置的鸢尾花(Iris)数据集,缩放特征,并训练一个线性SVM模型(使用 LinearSVC 类,超参数 C=1 ,hinge 损失函数)来检测 Virginica鸢尾花。

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.float64) # Iris-Virginica
svm_clf = Pipeline((
                ("scaler", StandardScaler()),
                ("linear_svc", LinearSVC(C=1, loss="hinge")),
        ))
svm_clf.fit(X, y)

svm_clf.predict([[5.5, 1.7]])

与逻辑回归模型(使用sigmoid函数)不同,支持向量机不输出每个类的概率,只给出推理结果。

可以选择使用 SGDClassifier类代替LinerSVC,即SGDClassifier(loss="hinge", alpha=1/(m*C)) 。它应用了随机梯度下降来训练一个线性 SVM 分类器。尽管它不会和 LinearSVC 一样快速收敛,但是对于处理那些不适合放在内存的大数据集是非常有用的,或者处理在线分类任务同样有用。

2、非线性SVM分类

如果数据集不是线性可分的,如果你增加了第二个特征x2=(x1)^2,产生的 2D 数据集就能很好的线性可分。

通过Scikit-Learn,你可以创建一个流水线(Pipeline)去包含多项式特征(PolynomialFeatures) 变换:

from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
polynomial_svm_clf = Pipeline((
                                                ("poly_features", PolynomialFeatures(degree=3)),
                                                ("scaler", StandardScaler()),
                                                ("svm_clf", LinearSVC(C=10, loss="hinge"))
                                    ))
polynomial_svm_clf.fit(X, y)

polynomial_svm_clf.score(X, y)

下图表示模型的决策边界,因为我们添加了多项式degree,投影边界现在是非线性的 

多项式核

添加多项式特征很容易实现,但是低阶多项式不能处理非常复杂的数据集,而高阶多项式却产生了大量的特征,会使模型变得慢。

幸运的是,当你使用 SVM 时,你可以运用一个被称为“核技巧”(kernel trick) 的神奇数学技巧。它可以取得就算你添加了许多多项式,甚至有高次数的多项式,也有一样好的结果。

from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline((
                                                ("scaler", StandardScaler()),
                                                ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
                                        ))
poly_kernel_svm_clf.fit(X, y)

这段代码用3阶的多项式核训练了一个 SVM 分类器,如左图所示。作为对比,右图是使用了10阶的多项式核 SVM 分类器。很明显,如果你的模型过拟合,你可以减小多项式核的阶数。相反的,如果是欠拟合,你可以尝试增大它。超参数 coef0 控制了高阶多项式与低阶多项式对模型的影响:

通用的方法是用网格搜索去找到最优超参数。首先进行非常粗略的网格搜索,一般会很快,然后在找到的最佳值进行更细的网格搜索。对每个超参数的作用有一个很好的理解可以帮助你在正确的超参数空间找到合适的值。

增加相似特征

高斯rbf核

计算复杂性

3、SVM回归

SVM不仅仅支持线性和非线性的分类任务,还支持线性和非线性的回归任务。目标:限制间隔违规的情况下,不是试图在两个类别之间找到尽可能大的“街道”(即间隔) 。SVM 回归任务是限制间隔违规情况下,尽量放置更多的样本在“街道”上。“街道”的宽度由超参数 ϵ 控制。下面两个SVM回归模型,一个有较大的间隔(ϵ=1.5 ) ,另一个间隔较小(ϵ=0.5 )。

添加更多的数据样本在间隔之内并不会影响模型的预测,所以,这个模型被认为是不敏感的(𝜖-insensitive)。

你可以使用 Scikit-Learn 的 LinearSVR 类去实现线性 SVM 回归:

from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)

为了处理线性回归任务,我们可以使用核化SVM模型,用多项式核函数来做:

from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

其使用了 Scikit-Learn 的 SVR 类(支持核技巧) 。在回归任务上, SVR 类和 SVC 类是一样的,LinearSVR等价于LinearSVC 。 

4、底层原理

略(后续补)

练习

 

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

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

相关文章

GAN入门知识

GAN入门知识 结构 正式说 GAN 之前我们先说一下判别式模型和生成式模型。 判别器 判别式模型 判别式模型,即 Discriminative Model,又被称为条件概率模型,它估计的是条件概率分布(conditional distribution), p(class|context) 。…

图书网上商店

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 1

docker-compose安装部署kafka

文章目录前言一、环境信息二、准备部署1.准备路径2.安装docker-compse,下载镜像3.生成yml文件2.执行部署三、登陆页面前言 记录一下使用docker-compose部署kafka平台的过程 参考:https://blog.csdn.net/QQ83512272/article/details/126368978 一、环境信…

Socket Websocket 客户端和服务端实现

最近在写一个上位机,用到了Websocket,这里就整理一下,顺便把Socket的东西也整理的了,方便以后查阅。 Socket Websocket 客户端和服务端实现Socket客户端和服务端实现Socket客户端Socket服务端实现效果Websocket 客户端和服务端实现…

QT Linux环境搭建——VM虚拟机和Ubuntu的安装

1、从ubuntu官网上下载iso镜像文件,该镜像文件用于安装linux操作系统,以下微官网链接 Enterprise Open Source and Linux | Ubuntu 选择一个最新的稳定版本下载即可(好处是,不需要像一些别的网站,必须要注册&#xff…

基于java+springmvc+mybatis+vue+mysql的远程家庭健康监测管理系统小程序

项目介绍 本系统采用java语言开发,后端采用ssm框架,前端采用vue技术,数据库采用mysql进行数据存储。 前台: 登录注册、查看个人信息、留言反馈、查看健康信息、查看百科、社区交流 后台: 首页、个人中心、用户管理、…

陈天老师的Rust培训(2)学习笔记

所有权: Rust中的每一个值都有一个被称为其 所有者(owner)的变量值在任一时刻有且只有一个所有者。当所有者(变量)离开作用域的时候,这个值将被丢弃。 Copy的类型: 所有整数类型,比如u32。布尔类型所有浮…

本地springboot jar 部署到云服务器linux [安装jdk 安装msyql]

A). 安装jdk 参考博客CentOS 8 安装 JAVA 三种方式(yum / rpm / tar.gz) [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep java [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jdk [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jre [rootiZt4ned91xzjstx…

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters 1 复现 今天对接外链需要使用AES加密的时候,对方使用的是AES:AES/ECB/PKCS7Padding,但是在加密过程中,发现报错 报错信息:java.…

Spark Shell 的使用

Spark Shell 的使用 Spark shell 作为一个强大的交互式数据分析工具,提供了一个简单的方式学习 API。它可以使用 Scala(在Java 虚拟机上运行现有的Java库的一个很好方式)或 Python。 Spark Shell 命令 启动 Spark Shell 的时候我们可以指定…

JavaIO

CPU指令与内核态、用户态 在操作系统中,CPU负责执行指令,这些指令有些来自应用程序,有些是来自底层系统。 有些指令是非常危险的,如清除内存,网络连接等等,如果错误调用的话有可能导致系统崩溃。 因而CPU将指令分为特…

Excel表格的打开密码如何设置和取消?

给Excel表格设置“打开密码”是保护表格的其中一种方法,这样只有输入正确的密码才能打开表格。 那Excel表格的打开密码如何设置和取消呢? 首先,打开Excel表格,点击菜单栏的【文件】选项,然后依次选择【信息】-【保护…

java项目-第175期ssm高校校园点餐系统-java毕业设计

java项目-第175期ssm高校校园点餐系统-java毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm高校校园点餐系统》 该项目分为2个角色,管理员、用户和食堂。 用户可以浏览前台,查看菜品,并进行预约和选座; 同时可以跳转到后台查看自己…

基于jsp+mysql+ssm矿场仓储管理系统-计算机毕业设计

项目介绍 本系统采用了BS架构,利用web技术实现了矿场信息的后台管理,针对矿物质的相关信息,销售情况进行管理。是一款后台信息管理系统,具有管理员和员工两个用户权限,系统设计简单,主要是学习资源&#x…

[R语言]正态分布

目录 分布 连续型变量的分布 正态分布 正态分布的推导 正态分布密度曲线 dnorm 正态分布的概率计算 正态分布累积曲线 总体分位数和尾概率 正态分布案例之一 R语言正态分布函数 正态分布相应的概率计算 正态分布的检验 shapiro.test()函数 Kolmogorov-Smirnov连续…

5.3 10篇美食类小红书爆文拆解【玩赚小红书】

案例一:金牌保姆分享12个万能做饭小技巧 ​ 标题: 万能做饭小技巧这个词可以看的出这个方法都是偏向技巧类,对于人人都有做饭的需求来说,也忍不住让人想看看到底是什么内容。“金牌保姆”四个字可谓是将“万能”这2个字完美诠释&…

首次曝光,Alibaba大佬手撸堪称神级的SpringSecurity全彩手册

有人调侃我们说: 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……想跳槽,但是更高的平台难进&a…

2023年你应该了解的五大采购管理趋势

采购的未来看起来非常具有前景。随着新技术的出现,采购专业人员有许多新的机会来简化他们的工作并节省企业的资金。 以下是一些你应该了解的2023年采购领域趋势。 1、自动化 采购的最大趋势之一是各种任务的自动化。这可以是任何事情,从自动化询价&am…

STC15 - C51 - 操作寄存器时, 不要操作不相关的位

文章目录STC15 - C51 - 操作寄存器时, 不要操作不相关的位概述笔记生成.i文件的选项编译工程后, 查看.list文件和.i文件.c文件相关内容.list文件.i文件通过.i文件(预处理文件), 就可以看到最终实现代码有啥区别了不好使的代码好使的代码总结ENDSTC15 - C51 - 操作寄存器时, 不要…

分布式系统(故障、恢复)

文章目录故障模型可靠组播基于基本组播基于 IP 组播协定问题ConsensusByzantine generalsInteractive Consistency一些重要结论分布式恢复后向恢复Checkpointing AlgorithmCoordinated CheckpointingIndependent CheckpointingMessage Logging AlgorithmPessimistic message lo…