支持向量机(Support Vector Machine)笔记整理

本文介绍了支持向量机(SVM)的基本原理,包括寻找最优超平面、处理异常值、核函数的应用以及多分类策略。SVM通过最大化边界距离进行优化,软间隔允许部分样本出错。核函数用于解决线性不可分问题,如线性核和高斯核。多分类可采用one-vs-rest或one-vs-one方法。此外,PCA用于降低高维特征的复杂性。代码示例展示了使用scikit-learn实现SVM的过程。
摘要由CSDN通过智能技术生成

《Python Machine Learning By Example》 Third Edition 第三章笔记

1 本章内容介绍

通过本章我们可以学习到:

  • 支持向量机的原理
  • 带核函数的SVM
  • scikit-learn库代码实现

2 简单支持向量机

2.1 介绍

  • Support Vector Machine,即SVM,适用于一些高维空间,或者特征维度比样本维度高出许多的场景。
  • SVM的目标是找出n维空间内的一个n-1维的超平面(hyperplane),并通过使得那些离超平面最近的一些样本的距离最大化来进行优化(max min),也就是找到最优超平面。
    SVM 图源:《Python Machine Learning By Example》

2.2 步骤

  1. 定义超平面(定义模型)

    我们要找的是能将输入空间中多个类别的样本区分开来的超平面。

  2. 确定最优超平面(定义策略)

    空间内的超平面有无数多种,我们如何确定最优的呢?需要指定一种优化策略:边界距离最大化(maximum-margin,边界:正超平面或负超平面)。位于边界上的能对距离变化起作用的样本,叫做支持向量。通过点到直线的距离公式,可以推出边界距离就等于 2 / || w ||,要使得这个式子最大化,可以等价为 || w || 的最小化,因此我们就找到了优化策略。

    书中没有介绍如何求解SVM,具体内容可以翻看西瓜书或统计学习方法。

3 其他机制

3.1 处理异常值

  • 但是通常输入空间中存在有少数的一些异常值,导致无法找到一个超平面能将所有的样本都正确分类(线性不可分),所以这时候就引入了软间隔SVM。
  • 软间隔,也就是分类要求宽松了,改为不要求超平面能将所有的样本都成功分类,允许部分分类错误(即落在超平面的另一边),并且上述硬间隔SVM中,位于边界上的样本为支持向量,边界内不允许有其他样本,而软间隔SVM中则允许这种情况发生,并且将其考虑进loss的计算当中。
  • 由此,软间隔SVM的loss计算方法也要更改。在原来的 || w || 距离损失基础上,加入一个分类损失,因为要使得不受硬间隔约束的样本越少越好,也是一个优化目标。分类损失可以使用0-1损失来计算,但是0-1损失非凸,非连续,不好进行优化,所以可以改为使用hinge loss(在知识补充中介绍),指数损失,对数损失等来进行计算。
  • 距离损失和分类损失的权重通过一个超参数C来控制,并且可以通过交叉验证来选择一个较优的值。

3.2 核函数

  • 如果并不是少数样本出错,而是多个类别的样本混杂在一起,那么这种线性不可分的情况就需要通过将原始空间映射到一个更高维的空间来解决了,比如加入一个新的特征,使得样本在高维空间中可以区分开来,但是如果特征数量很大就会加大计算量,所以为了解决高维空间计算复杂的问题,我们引入了核函数。
  • 核函数思想就是:如果先把特征转到高维,然后计算点积,这样计算效率不高,那么可以通过先在低维计算一个式子,再通过核函数等效于在高维计算点积,就可以了。
  • 核函数有分线性核和高斯核,选择策略为:如果出现这四个情况,则选择线性核:1)特征维度和样本维度都很高;2)特征维度显著比样本维度高:RBF容易过拟合;3)样本维度非常高,如10^7,RBF会加大计算量;4)特征维度为1-3,并且线性可分。其他情况则首选高斯核(KBF)。

3.3 处理多分类

  • SVM处理多分类有两种方法:
    1)one-vs-rest:对于K个分类,训练K个SVM,分别用来判断样本是否属于某个分类,然后取最大可能性作为分类结果。
    2)one-vs-one:对于K个分类,两两间训练一个SVM,共有K*(K-1)/2个SVM,然后进行投票选举。虽然SVM个数增多了,但是每个SVM只需要考虑对应类别的样本数据即可,训练数据减少了,所以通常这种方法效果较好。

3.4 主成分分析

  • 当特征维度较高时,我们可以通过PCA(principal component analysis)来减少不重要的特征,可以提高计算效率,并且还能防止模型过拟合。

4 代码实现

通过scikit-learn库来实现

from sklearn.svm import SVC

clf = SVC(kernel='linear', C=1.0, random_state=42) # 设置random_state,让训练数据在每次执行时保持一致
clf.fit(X_train, Y_train)
accuracy = clf.score(X_test, Y_test)
print(f'The accuracy is: {accuracy*100:.1f}%')

知识补充

hinge loss:即合页损失,因为它的函数图像就像一本未合页的书而得名。是在软间隔SVM中,用来代替0-1损失的,函数中y大于1的部分是分类错误的样本,y大于0并小于等于1的部分是间隔内正确的样本,y等于0的分布是严格分类正确的样本。为什么叫允许出错就是间隔内的正确样本也参与loss计算,即允许有样本落在间隔内或超平面另一边。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值