总结
本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与SVM算法部分。
本门课程的目标
完成一个特定行业的算法应用全过程:
懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合
+算法评估+持续调优+工程化接口实现
参考
看了这篇文章你还不懂SVM你就来打我https://tangshusen.me/2018/10/27/SVM/
斯坦福CS229 | 机器学习-吴恩达主讲(2018·完整版)
https://www.bilibili.com/video/BV1hT4y1r73X/
机器学习定义
关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用:
对于某类任务T和性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习。
SVM算法
SVM算法简介与分类
支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
目标:找到最好点到决策边界最大
SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但 SVM 在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。
x到面的距离就是画一个垂线,面上有两个点x’ 和 x" ,则点x’ 和 x" 是满足平面方程的,假设平面方程为
y = W x + b y=Wx+b y=Wx+b,把x’ 和 x"代入
则 W T x ′ + b = 0 和 W T x ′ ′ + b = 0 W^Tx'+b=0 和 W^Tx''+b=0 WTx′+b=0和WTx′′+b=0
我们计算x到点x’ 和 x" 的距离,因为点到点的距离相比点到面的距离好算些。
法向量W是垂直于平面的,在对这个x到点x’ 或者 x到点x"的距离按照法向量W进行投影,就得到了点x到平面的距离
法向量是没有方向的,用 W T W^T WT 处于自身的模 ∣ ∣ W ∣ ∣ ||W|| ∣∣W∣∣就得到了单位方向向量
∣ W T ∣ ∣ W ∣ ∣ ( X − X ′ ) ∣ |\frac{W^T} {||W||}(X-X')| ∣∣∣W∣∣WT(X−X′)∣其中 ( X − X ′ ) (X-X') (X−X′)是两点之间的距离, ∣ W T ∣ ∣ W ∣ ∣ ∣ |\frac{W^T} {||W||}| ∣∣∣W∣∣WT∣是单位方向向量
就是在单位方向的投影,对 W T W^T WT放在括号内得到
∣ 1 ∣ ∣ W ∣ ∣ ( W T X − W T X ′ ) ∣ |\frac{1} {||W||}(W^TX-W^TX')| ∣∣∣W∣∣1(WTX−WTX′)∣
把 W T X ′ = − b W^TX'= -b WTX′=−b代入
得
∣ 1 ∣ ∣ W ∣ ∣ ∣ ( W T X + b ) ∣ |\frac{1} {||W||}|(W^TX+b)| ∣∣∣W∣∣1∣(WTX+b)∣
这里的X1 X2 X3 为样本点的特征 Y1Y2…Yn为样本的标签,其中规定样本的标签有2种,正样本为+1,负样本为-1.
正样本表示所有点位于超平面的上面,此时 y ( x i ) y(x_i) y(xi)为正值, y ∗ y ( x i ) > 0 y*y(x_i)>0 y∗y(xi)>0
负样本表示所有点位于超平面的下面,此时 y ( x i ) y(x_i) y(xi)为负值, y ∗ y ( x i ) > 0 y*y(x_i)>0 y∗y(xi)>0
这里规定正样本为+1,负样本为-1都是为了后面的计算,保证为正可以去掉绝对值,同时任何书数字乘以1都不变
因为 ∣ ( W T X + b ) ∣ |(W^TX+b)| ∣(WTX+b)∣有绝对值,但 y i ∗ y ( x i ) > 0 y_i*y(x_i)>0 yi∗y(xi)>0就可以实现把绝对值符号去掉
因为 y i ∗ y ( x i ) > 0 y_i*y(x_i)>0 yi∗y(xi)>0,对函数进行放缩可以得到 y i ∗ y ( x i ) > = 1 y_i*y(x_i)>=1 yi∗y(xi)>=1
此时的优化目标函数就等价于 :与该分割线最近点距离最大
放缩变换从>0变为>1的目的是为了便于计算,因为1*任何数都为自身
最终就得到了目标函数 a r g m a x w , b 1 ∣ ∣ W ∣ ∣ argmax_{w,b}\frac{1}{||W||} argmaxw,b∣∣W∣∣1
把最大值转换为求最小值, W 2 W^2 W2表示一个向量,添加 1 2 \frac{1}{2} 21不影响求最小值
这里我们需要在约束条件下,求极值
深度解析拉格朗日乘子法,让你成为高手
在拉格朗日法中,包含不等式和等式的约束条件,在此约束条件下求方程的最小值。
由 y i ∗ y ( x i ) > = 1 y_i*y(x_i)>=1 yi∗y(xi)>=1可得
− y i ∗ y ( x i ) + 1 < = 0 -y_i*y(x_i)+1<=0 −yi∗y(xi)+1<=0
如本体中,我们求W和b,不好求,但可以求一个 α \alpha α, α \alpha α和W和b有关系
对偶
计算过程需要从内向外,而 m i n w , b m a x α L ( w , b , a ) min_{w,b}max_{\alpha}L(w,b,a) minw,bmaxαL(w,b,a)中最内为最大值可以通过对转换为
m a x α m i n w , b L ( w , b , a ) max_{\alpha}min_{w,b}L(w,b,a) maxαminw,bL(w,b,a)
KKT条件
这一步求出了最小距离的点
再求最小距离最大的点
依然把最大值转换为最小值,最大值的整数,加上负号 就是 求最小值了
要注意这里的条件
这里的约束条件就是如下的约束条件
代入的
代入X1 ,X2,X3的值为:
这里的 18 α 1 2 18\alpha_{1}^2 18α12是当i=1并且j=1时,把 x 1 x_1 x1为(3,3)点代入,把 y 1 y_1 y1为+1代入后的结果
如 ( + 1 ) ∗ ( + 1 ) ∗ ( 3 ∗ 3 + 3 ∗ 3 ) = 18 (+1)*(+1)*(3*3+3*3)=18 (+1)∗(+1)∗(3∗3+3∗3)=18
这里的 42 α 1 α 2 42\alpha_{1}\alpha_{2} 42α1α2是当i=1并且j=2时,把 x 1 x_1 x1为(3,3)点和 x 2 x_2 x2为(4,3)点代入,把 y 1 y_1 y1为+1和 y 2 y_2 y2为+1代入后的结果
如 ( + 1 ) ∗ ( + 1 )( 3 ∗ 4 + 3 ∗ 3 ) = 21 (+1)*(+1)(3*4+3*3)=21 (+1)∗(+1)(3∗4+3∗3)=21同时当i=2并且j=1也为21,加一起就为42
把(3,3)(4,3)(1,1)代入得到
>这里
α
2
=
0
\alpha_2=0
α2=0表明
x
2
x_2
x2这个点不为支持向量,所有不为支持向量的都是0
支持向量机学习方法,针对不同的情况,有由简至繁的不同模型:
线性可分支持向量机(linear support vector machine in linearly separable case):训练数据线性可分的情况下,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机(亦称作硬间隔支持向量机)。
线性支持向量机(linear support vector machine):训练数据近似线性可分的情况下,通过软间隔最大化(soft margin maximization),学习一个线性的分类器,称作线性支持向量机(又叫软间隔支持向量机)。
非线性支持向量机(non-linear support vector machine):训练数据线性不可分的情况下,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性分类器,称作非线性支持向量机。
支持向量机可以借助核技巧完成复杂场景下的非线性分类,当输入空间为欧式空间或离散集合、特征空间为希尔贝特空间时,核函数(kernel function)表示将输入从输入空间映射到特征空间得到的特征向量之间的内积。
通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。这样的方法称为核技巧。
SVM参数设置
一:如何判断调参范围是否合理
正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高;当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态;当模型训练集和测试集上准确率都比较低,模型处于欠拟合状态。正常来说测试集上的准确率都会比训练集要低。
二:如何确定参数的调节方向
当使用线性支持向量机时,我们只需调节正则化参数C的范围即可。
这里我们以RBF作为核的SVM为例,这时候我们需要调节的参数是正则化参数C和核函数参数gamma。为了保证调参的精确度,一般我们都使用网格搜索法来确定参数。
网格搜索法就是给出各个参数的调节范围和调节步长,计算出每个参数的可能取值,然后遍历所有的组合情况,返回最佳的参数值。
C和gamma的有效范围是: 1 0 − 8 − 1 0 8 10^{-8}-10^8 10−8−108;
C表示模型对误差的惩罚系数,gamma反映了数据映射到高维特征空间后的分布;C越大,模型越容易过拟合;C越小,模型越容易欠拟合。gamma越大,支持向量越多,gamma值越小,支持向量越少。gamma越小,模型的泛化性变好,但过小,模型实际上会退化为线性模型;gamma越大,理论上SVM可以拟合任何非线性数据。
为维持模型在过拟合和欠拟合之间的平衡,往往最佳的参数范围是C比较大,gamma比较小;或者C比较小,gamma比较大。也就是说当模型欠拟合时,我们需要增大C或者增大gamma,不能同时增加,调节后如果模型过拟合,我们又很难判断是C过大了,还是gamma过大了;同理,模型欠拟合的时候,我们需要减小C或者减小gamma。
三:设置合理的调参起始点
因为SVM本身是一个非线性模型,调参的时候根据项目的不同,每一次都是从头开始的。如果想把上一个项目调好的参数套用到下一个项目上,往往没什么效果。正常情况下,我们都会先设置C和gamma的值在0.1~10之间,然后在根据模型的表现,每次乘以0.1或者10作为一个步长,当确定大致范围后,再细化搜索区间。
最大间隔分类器
分类问题的数学理解是空间划分(或者寻找不同类别的决策边界),如图所示是一个简单的线性分类器(这部分更详细的讲解参考ShowMeAI文章 图解机器学习| 机器学习基础知识 和 图解机器学习 | 逻辑回归算法详解)。
不同的模型在解决分类问题时,会有不同的处理方式,直观上看,我们会使用不同的决策边界对样本进行划分,完成该分类任务的决策边界有无数个。SVM 模型,要求更高一些,它不仅仅希望把两类样本点区分开,还希望找到鲁棒性最高、稳定性最好的决策边界(对应图中的黑色直线)。
这个决策边界与两侧「最近」的数据点有着「最大」的距离,这意味着决策边界具有最强的容错性,不容易受到噪声数据的干扰。直观的理解就是,如果决策边界抖动,最不容易「撞上」样本点或者进而导致误判。
支持向量机详解
1)线性可分 SVM 与硬间隔最大化
SVM 总结
1)模型总结
支持向量机(Support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化,同时该方法可以形式化为一个求解图二次规划。
2)模型优缺点
(1)SVM模型优点
基于Python的 SVM 代码实践
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2] #只取前两维特征,方便可视化
y = iris.target
svc = svm.SVC(kernel='linear', C=1).fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()
输出为:
使用多项式核函数
初始化 SVM 对象的代码替换为下面这行
# svc = svm.SVC(kernel='linear', C=1).fit(X, y)
svc = svm.SVC(kernel='poly', degree=3).fit(X, y)
输出为:
使用rbf核函数(高斯核函数)
初始化 SVM 对象的代码替换为下面这行
# svc = svm.SVC(kernel='linear', C=1).fit(X, y)
# svc = svm.SVC(kernel='poly', degree=3).fit(X, y)
svc = svm.SVC(kernel='rbf', C=1).fit(X, y)**
输出为:
确定方向过程
针对完全没有基础的同学们
1.确定机器学习的应用领域有哪些
2.查找机器学习的算法应用有哪些
3.确定想要研究的领域极其对应的算法
4.通过招聘网站和论文等确定具体的技术
5.了解业务流程,查找数据
6.复现经典算法
7.持续优化,并尝试与对应企业人员沟通心得
8.企业给出反馈