支持向量机简介以及一个小实例(《机器学习实战》笔记)

⽀持向量机简介以及⼀个⼩实例(《机器学习实战》笔记)
⽀持向量机简介以及⼀个⼩实例
⽀持向量机(support vector machine,简称SVM)是⼀个功能强⼤且全⾯的机器学习模型,它能够执⾏线性或者⾮线性分类、回归以及异常值检测任务。
说明: 为了说明⽅便,本篇博客插⼊了许多图⽚,部分图⽚由《机器学习实战》的作者通过jupyter notebook绘制,上传于GitHub供⼤家学习。
SVM简介
线性SVM分类
⾸先是它的线性分类,它的基本思想可以通过下⾯这张图来说明,图中蓝⾊和⼟黄⾊代表其在特征空间中的位置,左边是三种线性分类器的分类结果,其中虚线表⽰的线性分类器表现⾮常糟糕,不能完成分类任务,⽽另外两个线性分类器则在训练集上表现的⾮常出⾊,然⽽现在也出现了⼀个问题:它们的决策边界过于接近,这可能导致在⾯对新的⽰例时,表现⽐较差。
基于这个问题,就引出了⽀持向量机分类器,上⾯的右图所⽰,可以看出,SVM分类器的决策边界不仅仅分离了两个类别,并且尽可能的远离了最近的训练实例。因此,我们可以将其理解为在类别之间拟合出⼀条最宽的街道,这个街道在图中⽤虚线标出。另外根据对它的介绍我们可以知道,在街道以外的地⽅增加实例不会对训练结果或者说决策边界产⽣影响,也就是说它的结果只会受到位于街道边缘的实例影响,这些实例就叫做⽀持向量,⽀持向量机的名字就是从这⾥得到的。
另外值得⼀说的是,SVM对特征的缩放⾮常敏感,可以通过下图直观的展⽰出来。下⾯左图中,垂直刻度就⽐⽔平刻度⼤得多,因此可能的最宽的街道接近于⽔平。右边则是经过特征缩放后的决策边界,决策边界看上去好很多。
间隔分类与硬间隔分类
之前提到了⽀持向量机是在类别之间拟合出⼀条最宽的间隔,如果严格按照这条规则执⾏的话,就称为硬间隔分类。然⽽这种分类⽅法对异常值⾮常敏感,⽐如下⾯的左图中的情况,硬间隔是⽆法完成分类的,⽽对于右图中的情况,它的决策边界与没有异常值的情况下的决策边界⼤不相同,这可能会导致模型在实际⼯作时⽆法很好的完成泛化。
演播室系统解决上述问题的⼀个办法就是允许⼀定的间隔违例(即允许⼀些实例位于街道之上或者位于错误的⼀侧),这样就称为软间隔分类。软间隔分类相⽐于硬间隔分类,其实就是尽可能在保持街道宽阔或限制间隔违例之间到⼀个平衡,如下⾯这两张图所⽰。间隔或限制间隔违例之间的关系由超参数C控制,C越⼤,间隔越窄,但是违例也更少,反之则间隔越宽,但是违例也越多。这个C具体是什么,我们之后还会提到。
⼀般来说,可以通过降低C来进⾏正则化以解决过拟合问题。
下⾯是使⽤鸢尾花数据集,通过训练SVM来检测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)]# 特征:花瓣的长和宽
y =(iris["target"]==2).astype(np.float64)#标签
svm_clf = Pipeline((
("scaler",StandardScaler()),
("linear_svc",LinearSVC(C=1,loss="hinge"))
))
svm_clf.fit(X,y)
svm_clf.predict([[5.5,1.7]])
# array([1.])
汤芳艳图这⾥要说⼀下,对于线性SVM分类,可以使⽤的⽅法为LinearSVC(线性分类专⽤,速度快)和SVC(除了线性分类外还⽀持⾮线性分类,速度慢)。
大学生村官调研报告上海银河宾馆另外,SVM分类器不会输出每个类别的概率。
卡巴斯基安全部队2011
⾮线性SVM分类
有了软间隔分类器,在许多情况下,线性SVM是⾮常有效的,并且通常结果出⼈意料的好,但是还有的许多数据集不是线性可分离的。⽐如下⾯左边这张图⽚中的种类就⽆法使⽤线性SVM进⾏分离,处理这样的数据集的⽅式之⼀就是添加更多的特征,⽐如多项式特征,这可能会使得数据集变为线性可分的。⽐如对左图中的数据集添加⼀个特征x2,x2等于x1的平⽅,此时⽣成的⼆维数据集就变得线性可分了。
左边这张图是我使⽤软件⽣成的⼀个⼆维的线性不可分的数据集。
之后我们通过添加3阶多项式特征来完成,数据集从⼆维的变化成了⼀个9维的。之后右边是在新⽣成的数据集上训练的结果。
完整的代码:
from sklearn.datasets import make_moons
from sklearn.svm import SVC
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
# 创建线性不可分的数据集
ploy_kernel_svm_clf = Pipeline((
("scaler",StandardScaler()),
("svm_clf",SVC(kernel="poly",degree=3,coef0=1,C=5))
#coef0控制的是受⾼阶多项式还是低阶多项式影响的程度
))
ploy_kernel_svm_clf.fit(X,y)
运载火箭SVM回归
如之前提到的,⽀持向量机不仅仅可以完成分类任务,还可以完成回归任务,诀窍就是将⽬标反转⼀下:将尽可能多的实例位于间隔上,同时限制间隔违例,当然,这⾥的间隔违例他指的是不在间隔之内的实例。下⾯这张图就是⼀个线性回归的例⼦,街道宽度由超参数epsilon 控制。
当然我们可以使⽤之前⾮线性分类任务中相同的⼿法来完成⾮线性回归任务。下⾯就是对⼀个⼀维数据集添加2阶多项式特征之后的回归结果。
SVM的数学原理
如果不需要了解的话可以跳过~
决策函数和预测
线性⽀持向量机判断类别的⽅法其实⾮常简单,就是将实例的特征向量与权值向量相乘,之后加上偏置项,若结果⼤于零则输出为1判断为正类,若结果⼩于0则输出为0判定为负类,见下⾯的式⼦:
下图是包含两个特征的数据集,两个特征分别在x轴和y轴上体现,实线则是他的决策边界,从左边这
个公式可以看出就是决策函数等于0的点的集合。虚线是epsilon等于1时候的间隔,就是决策函数等于等于±1时的点的集合。训练SVM就是到合适的权重w和b的值。另外我
们知道如果我们想避免任何违例,那么就要是的所有正类训练集的值⼤于1⽽所有负类训练集的决策函数⼩于-1。
训练⽬标
对于决策函数的斜率,它是等于权重向量的范数。在ϵ给定的条件下,权重向量越⼩,间隔越⼤。下⾯这张图就是以epsilon等于1的情况,
数据集变为了1维,若果我们将w1除以2,那么间隔将会增长⼀倍。即权重越⼩,间隔越⼤。
根据之前的分析,SVM分类器的训练⽬标其实就是⼀个约束优化问题,对于硬间隔SVM分类器,⽬标就是下⾯公式所展⽰的,第⼀⾏就是让其间隔最⼩,第⼆⾏则是它必须满⾜的前提,那就是让所有点都位于间隔之外。其中权重的点积就等于权重范数的平⽅,将其最⼩化与将权重的范数最⼩化等价。
=y ^{0  if  w ⋅x +b <0,
T 1  if  w ⋅x +b ≤0
T 最⼩化w ⋅w
21
T 使得t (w ⋅w +b )≥1 (i =1,2,⋯,m )
(i )T 其中t =(i ){−1  if  y =0
(i )1      if  y =1(i )

本文发布于:2024-09-22 06:56:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/569875.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:间隔   线性   分类   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议