惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
S
Secure Thoughts
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
SecWiki News
SecWiki News
B
Blog
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
Webroot Blog
Webroot Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
LINUX DO - 热门话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
酷 壳 – CoolShell
酷 壳 – CoolShell
IT之家
IT之家
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
F
Fortinet All Blogs
W
WeLiveSecurity
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
The Last Watchdog
The Last Watchdog
S
Schneier on Security
爱范儿
爱范儿
V
V2EX - 技术
L
LINUX DO - 最新话题
月光博客
月光博客
博客园 - 【当耐特】
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
U
Unit 42
Schneier on Security
Schneier on Security
E
Exploit-DB.com RSS Feed
J
Java Code Geeks
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss
TaoSecurity Blog
TaoSecurity Blog
博客园 - 叶小钗
T
Troy Hunt's Blog
大猫的无限游戏
大猫的无限游戏
AI
AI
Security Latest
Security Latest

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误
Sklearn 支持向量机库介绍
Yiwei Zhang · 2022-10-10 · via 又见苍岚

之前我们进行过 SVM 原理的推导,本文记录 Sklearn 支持向量机库相关内容。

Sklearn 支持向量机库概述

  • 我们知道SVM相对感知器而言,它可以解决线性不可分的问题,那么它是如何解决的呢?其思想很简单就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。

  • sklearn中SVM的算法库分为两类

    • 分类的算法库,主要包含 LinearSVC,NuSVC 和 SVC 三个类
    • 回归算法库,包含SVR,NuSVR 和 LinearSVR 三个类,相关模块都包裹在 sklearn.svm 模块中。
  • 对于SVC,NuSVC 和 LinearSVC 三个分类的库,SVC 和 NuSVC 差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。

  • 同样的对于SVR,NuSVR 和 LinearSVR 三个回归的类,SVR 和 NuSVR 差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR 是线性回归,只能使用线性核函数。

  • 我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用 LinearSVC 去分类或者 LinearSVR 去回归,他们不需要我们去慢慢的调参选择各种核函数以及对应的参数,速度也快。如果我们对数据分布没有什么经验,一般使用 SVC 去分类或者 SVR 去回归,这就需要我们选择核函数以及对核函数调参了。

回顾SVM分类算法和回归算法

  • 对SVM算法进行回顾,首先对于SVM分类算法,其原始形式如下:

$$ \begin{array}{c} \min \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i} \\ s.t., y_{i}\left(w^{T} x_{i}+b\right) \geq 1-\xi_{i}, i=1, \ldots, n \\ \xi_{i} \geq 0, i=1, \ldots, n \end{array} $$

  • 其中 $n$ 为样本个数,我们的样本为$[(x_1, y_1),(x_2,y_2),…,(x_n, y_n)]$, $w,b$是我们的分离超平面的 $w^T \bf {x} + b = 0$ 的系数,$ξ_i$ 为第 $i$ 个样本的松弛系数,$C$ 为惩罚系数,$x_i$ (也有时候写为 $Φ(x_i) $ 为低维到高维的映射函数) 为样本数。
  • 通过拉格朗日以及对偶化后的形式为:

$$ \begin{aligned} \max _{\alpha} & \sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j}\left\langle x_{i}, x_{j}\right\rangle \\ \text { s.t. }, & 0 \leq \alpha_{i} \leq C, i=1, \ldots, n \\ & \sum_{i=1}^{n} \alpha_{i} y_{i}=0 \end{aligned} $$

  • 其中和原始形式不同的 $α$ 为拉格朗日系数向量,$<x_i, x_j>$ 为我们要使用的核函数。
  • 对于SVM回归算法,(借用刘建平老师的博客),其原始形式如下:

$$ \begin{array}{c} \min \frac{1}{2}\|w\|_{2}^{2}+C \sum_{i=1}^{m}\left(\xi_{i}^{\vee}+\xi_{i}^{\wedge}\right)\\ s.t. \quad-\epsilon-\xi_{i}^{\vee} \leq y_{i}-w \bullet \phi\left(x_{i}\right)-b \leq \epsilon+\xi_{i}^{\wedge} \\ \xi_{i}^{\vee} \geq 0, \quad \xi_{i}^{\wedge} \geq 0(i=1,2, \ldots, m) \end{array} $$

  • 其中 $m$ 为样本个数,我们的样本为 $[(x_1, y_1),(x_2,y_2),…,(x_m, y_m)]$, $w,b$ 是我们回归超平面 $w^Tx_i + b = 0$ 的系数,$ξ_v$, $ξ^\vee$ 为第 $i$ 个样本的松弛系数, $C$ 为惩罚系数,$ε$ 为损失边界,到超平面距离小于 $ε$ 的训练集的点没有损失,$Φ(x_i)$ 为低维到高维的映射函数
  • 通过拉格朗日函数以及对偶后的形式为:

$$ \begin{array}{c} \underbrace{\min }_{\alpha^{\vee}, \alpha^{\wedge}} \frac{1}{2} \sum_{i=1, j=1}^{m}\left(\alpha_{i}^{\wedge}-\alpha_{i}^{\vee}\right)\left(\alpha_{j}^{\wedge}-\alpha_{j}^{\vee}\right) K\left(x_{i}, x_{j}\right)-\sum_{i=1}^{m}\left(\epsilon-y_{i}\right) \alpha_{i}^{\wedge}+\left(\epsilon+y_{i}\right) \alpha_{i}^{\vee}\\ s.t. \sum_{i=1} ^ {m} (\alpha_{i}^{\wedge}-\alpha_{i} ^ { \vee})=0 \\ 0< \alpha_{i} ^ {\vee} < C(i=1,2, \ldots, m), 0< \alpha_{i} ^ {\wedge} < C(i=1,2, \ldots, m) \end{array} $$

  • 其中和原始形式不同的 $α^{\vee}$, $α^{\vee}$ 为拉格朗日系数向量,$K(x_i, x_j)$ 为我们要使用的核函数。

SVM核函数概述

  • 我在第二篇SVM中学习了核函数,有好几种,最常用的就是线性核函数,多项式核函数,高斯核函数和Sigmoid核函数,在scikit-learn中,内置的核函数也刚好有这四种。

线性核函数(Linear Kernel)

  • 线性核函数表达式为:

$$
\kappa\left(x_{1}, x_{2}\right)=\left\langle x_{1}, x_{2}\right\rangle
$$

  • 就是普通的内积,LinearSVC 和 LinearSVR 只能使用它。

多项式核函数(Polynomial Kernel)

  • 多项式核函数是线性不可分SVM常用的核函数之一,表达式为:

$$
k\left(x_{i}, x_{j}\right)=\left(x_{i}^{t} x_{j}\right)^{d}, d \geqslant 1
$$

  • 参数都需要自己调参定义,比较麻烦。

高斯核函数(Gaussian Kernel)

  • 高斯核函数,在 SVM 中也称为 径向基核函数(Radial Basisi Function,RBF),它是 libsvm 默认的核函数,当然也是 sklearn 默认的核函数,表达式为:

$$
k(x, y)=\exp \left(-\gamma|x-y|^{2}\right)
$$

  • 其中 $\gamma$ 大于 0,需要自己调参定义,不过一般情况,我们都使用高斯核函数。

Sigmoid核函数(Sigmoid Kernel)

  • Sigmoid核函数也是线性不可分SVM常用的核函数之一,表示为:

$$
k\left(x_{i}, x_{j}\right)=\tanh \left(\beta x_{i}^{t} x_{j}+\theta\right), \beta>0
$$

  • 其中 $\beta, \theta$ 都需要自己调参定义。

  • 一般情况下,对于非线性数据使用默认的高斯核函数会有比较好的效果,如果你不是 SVM 调参高手的话,建议使用高斯核来做数据分析。

SVM分类算法库

  • 下面我们将具体介绍这三种分类方法都有那些参数值以及不同参数值的含义。

LinearSVC

  • 其函数原型如下:
1
2
3
4
5
class sklearn.svm.LinearSVC(self, 
penalty='l2', loss='squared_hinge', dual=True, tol=1e-4,
C=1.0, multi_class='ovr', fit_intercept=True,
intercept_scaling=1, class_weight=None, verbose=0,
random_state=None, max_iter=1000)
参数说明
参数 含义
penalty 正则化参数,L1 和 L2 两种参数可选,仅 LinearSVC 有。默认是 L2 正则化,如果我们需要产生稀疏的话,可以选择 L1 正则化,这和线性回归里面的 Lasso 回归类似
loss 损失函数,有 hingesquared_hinge 两种可选,前者又称为 L1 损失,后者称为 L2 损失,默认是 squared_hinge,其中 hinge 是SVM的标准损失,squared_hingehinge的平方
dual 是否转化为对偶问题求解,默认是 True。这是一个布尔变量,控制是否使用对偶形式来优化算法
tol 残差收敛条件,默认是0.0001,与 LR 中的一致
C 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些
multi_class 负责多分类问题中分类策略制定,有 ovrcrammer_singer 两种参数值可选,默认值是ovrovr的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;crammer_singer 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小
fit_intercept 是否计算截距,与LR模型中的意思一致
class_weight 与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。如果使用 balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高,当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个系数,选择默认的None
verbose 是否冗余,默认为False
random_state 随机种子的大小
max_iter 最大迭代次数,默认为1000

惩罚系数

  • 错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减少C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪音的情况,一般采用后者,把训练样本集中错误分类的样本作为噪音。

NuSVC

  • 其函数原型如下:
1
2
3
4
class sklearn.svm.NuSVC(self, nu=0.5, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, shrinking=True, probability=False, tol=1e-3,
cache_size=200, class_weight=None, verbose=False, max_iter=-1,
decision_function_shape='ovr', random_state=None)
参数说明
参数 含义
nu 训练误差部分的上限和支持向量部分的下限,取值在 $(0,1)$ 之间,默认是 0.5,它和惩罚系数 $C$ 类似,都可以控制惩罚的力度
degree 当核函数是多项式核函数(poly)的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间),这个参数只对多项式核函数有用,是指多项式核函数的阶数 $n$。如果给的核函数参数是其他核函数,则会自动忽略该参数
gamma 核函数系数,默认是 auto,即特征维度的倒数。核函数系数,只对rbf poly sigmoid 有效
coef0 核函数常数值 ($y = kx + b$ 的 b 值),只有 polysigmoid 函数有,默认值是0
max_iter 最大迭代次数,默认值是 -1 ,即没有限制
probability 是否使用概率估计,默认是 False
decision_function_shape multi_class 参数含义类似,可以选择 ovo 或者 ovr(0.18版本默认是 ovo,0.19版本为 ovr) OvR(one vs rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类,具体的做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除第K类样本以外的所有样本作为负类,然后在上面做二元分类,得到第K类的分类模型。
OvO(one vs one)则是每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为 T1 和 T2 的样本放在一起,把 T1作为正例,T2 作为负例,进行二元分类,得到模型参数,我们一共需要 T(T-1)/2 次分类。从上面描述可以看出,OvR 相对简单,但是分类效果略差(这里是指大多数样本分布情况,某些样本分布下OvR 可能更好),而 OvO 分类相对精确,但是分类速度没有 OvR 快,一般建议使用 OvO 以达到较好的分类效果
chache_size 缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB
kernel 核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是 rbf 核函数
  • 常用的核函数有以下几种:

    函数 含义
    linear 线性核函数
    poly 多项式核涵数
    rbf 高斯核函数
    sigmod sigmod 核函数
    precomputed 自定义核函数

SVC

  • 其函数原型如下:
1
2
3
4
5
class sklearn.svm.SVC(self, C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, shrinking=True, probability=False,
tol=1e-3, cache_size=200, class_weight=None,
verbose=False, max_iter=-1, decision_function_shape='ovr',
random_state=None)
参数说明
  • C:惩罚系数

  • SVC 和 NuSVC 方法基本一致,唯一区别就是损失函数的度量方式不同(NuSVC中的nu参数和SVC中的C参数)即SVC使用惩罚系数C来控制惩罚力度,而NuSVC使用nu来控制惩罚力度。

SVM回归算法库

  • 下面我们将具体介绍这三种分类方法都有那些参数值以及不同参数值的含义。

LinearSVR

  • 其函数原型如下:
1
2
3
4
class sklearn.svm.LinearSVR(self, epsilon=0.0, tol=1e-4, C=1.0,
loss='epsilon_insensitive', fit_intercept=True,
intercept_scaling=1., dual=True, verbose=0,
random_state=None, max_iter=1000)
参数说明
参数 含义
epsilon 距离误差epsilon,即回归模型中的 epsilon,训练集中的样本需要满足:
$-\epsilon-\xi_{i}^{\vee} \leq y_{i}-w \bullet \phi\left(x_{i}\right)-b \leq \epsilon+\xi_{i}^{\wedge}$
loss 损失函数,有 hingesquared_hinge 两种可选,前者又称为 L1 损失,后者称为 L2 损失,默认是 squared_hinge,其中 hinge 是 SVM 的标准损失,squared_hingehinge 的平方
dual 是否转化为对偶问题求解,默认是True。这是一个布尔变量,控制是否使用对偶形式来优化算法
tol 残差收敛条件,默认是0.0001,与LR中的一致
C 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些
fit_intercept 是否计算截距,与LR模型中的意思一致
verbose 是否冗余,默认为False
random_state 随机种子的大小
max_iter 最大迭代次数,默认为1000

NuSVR

  • 其函数原型如下:
1
2
3
class sklearn.svm.NuSVR(self, nu=0.5, C=1.0, kernel='rbf', degree=3,
gamma='auto_deprecated', coef0=0.0, shrinking=True,
tol=1e-3, cache_size=200, verbose=False, max_iter=-1)
参数说明
参数 含义
nu 训练误差部分的上限和支持向量部分的下限,取值在 (0,1) 之间,默认是 0.5,它和惩罚系数 $C$ 类似,都可以控制惩罚的力度
degree 当核函数是多项式核函数(poly)的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间),这个参数只对多项式核函数有用,是指多项式核函数的阶数 n。如果给的核函数参数是其他核函数,则会自动忽略该参数
gamma 核函数系数,默认是 auto,即特征维度的倒数。核函数系数,只对 rbf poly sigmoid 有效
coef0 核函数常数值( $y = kx + b$ 的b值),只有 polysigmoid 函数有,默认值是0
chache_size 缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB
kernel 核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是“rbf”核函数
  • 常用的核函数有以下几种:

    函数 含义
    linear 线性核函数
    poly 多项式核涵数
    rbf 高斯核函数
    sigmod sigmod 核函数
    precomputed 自定义核函数

SVR

  • 其函数原型如下:
1
2
3
class sklearn.svm.SVC(self, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, tol=1e-3, C=1.0, epsilon=0.1, shrinking=True,
cache_size=200, verbose=False, max_iter=-1)
参数说明
  • SVR 和 NuSVR 方法基本一致,唯一区别就是损失函数的度量方式不同(NuSVR 中的 nu 参数和 SVR 中的 C 参数)即 SVR 使用惩罚系数 C 来控制惩罚力度,而 NuSVR 使用 nu 来控制惩罚力度。

SVM的方法与对象

方法

  • 三种分类的方法基本一致:
函数 含义
decision_function(x) 获取数据集X到分离超平面的距离
fit(X , y) 在数据集 $(X,y)$上使用 SVM 模型
get_params([deep]) 获取模型的参数
predict(X) 预测数值型X的标签
score(X,y) 返回给定测试集合对应标签的平均准确率

对象

函数 含义
support_ 以数组的形式返回支持向量的索引
support_vectors_ 返回支持向量
n_support_ 每个类别支持向量的个数
dual_coef 支持向量系数
coef_ 每个特征系数(重要性),只有核函数是 LinearSVC 的是可用,叫权重参数,即 $w$
intercept_ 截距值 (常数值),称为偏置参数,即 $b$

示例代码

  • 示例简单的 svm 训练、测试 demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# import svm
from sklearn import svm

# train data: Feature List
train_data = ...
# test data: Feature List
test_data = ...
# label data: Label List
train_label = ...

# build classifier
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)

# train
predictor.fit(train_data, train_label)

# test
test_results = predictor.predict(test_data)

参考资料

文章链接:
https://www.zywvvd.com/notes/study/machine-learning/about-svm/sklearn-svm/python-svm/