机器学习算法(三):支持向量机(SVM)的sklearn调用

发布于:2024-07-01 ⋅ 阅读:(18) ⋅ 点赞:(0)


前言

本节只会介绍SVM的一些sklearn的高级API调用接口,具体的理论推导这个模型的推导还是很复杂的,这里就不给出具体的理论了。具体理论还请读者自己想办法查阅资料吧。本来是有打算将理论也在这里附上,但很显然这个模型并不像线性回归和逻辑回归那样简单的几个公式就能够说明的,如果需要在这里讲述明白,需要大量的文字叙述,那么读者还不如去找一本详细介绍该模型的书看。

一 理论

【注】:该模型理论不是一句两句话可以阐述明白的,需要时哪出iPad上面笔记看一看 ---- 本注是写给作者本人看的。
但是sklearn中定义的核函数是什么样的还是需要在这里打一下公式才好在接口中选择参数
【注】:以后有时间了尽量会将理论也搬上来,支持向量机这个模型的确理解了理论和只会调用还是有一些区别的。

1 sklearn中的核函数形式

在这里插入图片描述
其中,linear:线性核函数;polynomial:多项式核函数;rbf:高斯核函数;主要是这三个了,具体的请参考官方文档,上面也简单介绍了点理论,不过很粗糙不容易看懂svm sklearn官方文档

二、sklearn调用

1 svm.SVC() 接口说明

sklearn.svm.SVCscikit-learn 中用于分类任务的支持向量分类器类。它提供了丰富的参数来控制 SVM 模型的行为和性能。

以下是 SVC 中的几个重要参数及其详细解释(仅列出较为重要的参数):
(1). C (float, default=1.0)

惩罚参数 ( C ),也称为正则化参数。它控制误分类的惩罚力度。较小的 ( C ) 会允许更多的误分类点,从而获得更平滑的决策边界(防止过拟合)。较大的 ( C ) 会对误分类点施加更大的惩罚,尝试准确地划分所有训练数据(可能导致过拟合)。

svm.SVC(C=1.0)

(2). kernel (str, default=‘rbf’)

指定用于模型的核函数。支持的核函数有:

  • 'linear':线性核函数
  • 'poly':多项式核函数
  • 'rbf':径向基函数核(默认)
  • 'sigmoid':S 型核函数
  • 自定义核函数:通过一个 callable 函数传递
svm.SVC(kernel='rbf')

(3). degree (int, default=3)

当使用多项式核函数时,指定多项式的阶数。这个参数在 kernel='poly' 时才有意义。

svm.SVC(kernel='poly', degree=3)

(4). gamma (str or float, default=‘scale’)

核函数系数,仅在 kernel='rbf', kernel='poly', 和 kernel='sigmoid' 时有效。它决定了单个训练样本的影响范围。

  • 'scale':默认值。使用 ( 1 / (n_{\text{features}} \times X.var()) )
  • 'auto':使用 ( 1 / n_{\text{features}} )
  • 也可以直接指定一个浮点数
svm.SVC(kernel='rbf', gamma='scale')

(5). coef0 (float, default=0.0)

核函数的独立项。在多项式和 S 型核函数中有用。它是多项式核中常数项(bias term)以及 S 型核中线性部分的常数项。

svm.SVC(kernel='poly', coef0=0.0)

(6). tol (float, default=1e-3)

停止准则的容忍度。用于控制算法的收敛精度,较小的 tol 值会使得优化过程更精确,但计算时间可能更长。

svm.SVC(tol=1e-3)

(7). decision_function_shape (str, default=‘ovr’)

决策函数的形状。对于多分类任务,支持两种模式:
- `'ovr'` (one-vs-rest):一对多,默认值。适合大多数情况。
- `'ovo'` (one-vs-one):一对一,用于处理多类别分类问题。

```python
svm.SVC(decision_function_shape='ovr')
```

【注】:关于各类二分类器的一对一和一对多的策略实现多分类效果,后面会有一篇博客专门详细讲述究竟是什么个流程。

三 、具体示例

在本练习中,我们将使用支持向量机(SVM)来构建垃圾邮件分类器。 我们将从一些简单的2D数据集开始使用SVM来查看它们的工作原理。 然后,我们将对一组原始电子邮件进行一些预处理工作,并使用SVM在处理的电子邮件上构建分类器,以确定它们是否为垃圾邮件。
我们要做的第一件事是看一个简单的二维数据集,看看线性SVM如何对数据集进行不同的C值(类似于线性/逻辑回归中的正则化项)。
我们要做的第一件事是看一个简单的二维数据集,看看线性SVM如何对数据集进行不同的C值(类似于线性/逻辑回归中的正则化项)。

1、简单的线性SVM例子 — 不同C值的影响

C越大,对误分类的惩罚越大,决策边界越接近于正确分类的数据点,但是容易过拟合;C越小,对误分类的惩罚越小,决策边界越接近于所有数据的中心,容易欠拟合。

(1) 数据集

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat

raw_data = loadmat('data/ex6data1.mat')       #加载数据
raw_data                                      #查看数据,数据中X为特征,y为标签,可以看到数据放在一个字典中

输出:
在这里插入图片描述
在这里插入图片描述

【注】:数据读入进来是放在字典里面的。
我们将其用散点图表示,其中类标签由符号表示(+表示正类,o表示负类)。

data = pd.DataFrame(raw_data['X'], columns=['X1', 'X2'])
data['y'] = raw_data['y']

positive = data[data['y']==1]
negative = data[data['y']==0]

fig, ax = plt