1. 原理
着重探讨研究支持向量机分类器,比如有一组二分类的数据,支持向量机的分类方法是在这组分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量小,尤其是在未知数据集上的分类误差(泛化误差)尽量小。
1.1 决策边界
在几何中,超平面是一个空间的子空间,它是维度比所在空间小一维的空间。 如果数据空间本身是三维的, 则其超平面是二维平面,而如果数据空间本身是二维的,则其超平面是一维的直线。 在二分类问题中,如果一个超平面能够将数据划分为两个集合,其中每个集合中包含单独的一个类别,我们就说这个超平面是数据的“决策边界”。
1.2 边际
我们可以把决策边界向两边平移,直到碰到离这条决策边界最近的第一类数据和第二类数据后停下,形成两个新的超平面,并且将原始的决策边界移动到新的两条超平面的中间,确保决策边界到两者的距离相等。在两条新超平面中间的距离,叫做这条决策边界的边际(margin),通常记作d。
在边际很小的情况下,模型在训练集上表现很好,却在测试集上表现糟糕,产生“过拟合”。支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器。也因此,支持向量分类器又叫做最大边际分类器。这个过程在二维平面中看起来十分简单,但将上述过程使用数学表达出来,就不是一件简单的事情了。
1.3 损失函数
在任一个机器学习模型的训练过程中,被最大化或者最小化的那个函数,叫作“目标函数”(objective function)。目标函数可以有很多种,比如数据的((负)对数)似然值,比如margin的大小,比如均方误差。如果目标函数是要最小化的,它就也常常被称为“损失函数”(loss function)或“费用函数”(cost function)。支持向量机分类算法求解最决策边界,即最大距离d,而d=2/||w||,损失函数f(w)为||w||^2/2,求最大的d,即求最小的w,即求最小的f(w)。
1.4 如何画出决策边界
利用matplotlib的contour等高线函数。
1 | def plot_svc_decision_function(model,ax=None): |
1.5 核函数
为了让支持向量机分类器处理非线性问题,需更改kernal参数。
| 输入 | 含义 | 解决问题 | 核函数表达式 | 参数gamma | 参数degree | 参数coef0 |
|---|---|---|---|---|---|---|
| linear | 线性核 | 线性 | K(x,y)=x^T·y=x·y | No | No | No |
| poly | 多项式核 | 偏线性 | K(x,y)=(伽马(x·y)+r)^d | Yes | Yes | Yes |
| sigmoid | 双曲正切核 | 非线性 | K(x,y)=tanh(伽马(x·y)+r) | Yes | No | Yes |
| Ref | 高斯径向基 | 偏非线性 | K(x,y)=e(-伽马||x-y||2) ,伽马>0 | Yes | No | No |
可以看出,除了选项"linear"之外,其他核函数都可以处理非线性问题。多项式核函数有次数d,当d为1的时候它 就是再处理线性问题,当d为更高次项的时候它就是在处理非线性问题。我们之前画图时使用的是选项“linear",自 然不能处理环形数据这样非线性的状况。而刚才我们使用的计算r的方法,其实是高斯径向基核函数所对应的功 能,在参数”kernel“中输入”rbf“就可以使用这种核函数。
1.6 核函数相关的参数
对于线性核函数,"kernel"是唯一能够影响它的参数。但是对于其他三种非线性核函数,核函数还受到参数gamma,degree以及coef0的影响。 参数gamma就是表达式中的伽马,degree就是多项式核函数的次数 ,参数coef0就是常数项 。其中,高斯径向基核 函数受到gamma的影响,而多项式核函数受到全部三个参数的影响。
| 参数 | 含义 |
|---|---|
| degree | 整数,可不填,默认3 多项式核函数的次数(‘poly’),如果核函数没有选择"poly",这个参数会被忽略 |
| gamma | 浮点数,可不填,默认“auto" 核函数的系数,仅在参数Kernel的选项为”rbf",“poly"和"sigmoid”的时候有效 输入“auto”,自动使用1/(n_features)作为gamma的取值 输入"scale",则使用1/(n_features * X.std())作为gamma的取值 输入"auto_deprecated",则表示没有传递明确的gamma值(不推荐使用) |
| coef0 | 浮点数,可不填,默认=0.0 核函数中的常数项,它只在参数kernel为’poly’和’sigmoid’的时候有效。 |
1.6 硬间隔与软间隔:重要参数C
当两组数据是完全线性可分,我们可以找出一个决策边界使得训练集上的分类误差为0,这两种数据就被称为是存在”硬间隔“的。当两组数据几乎是完全线性可分的,但决策边界在训练集上存在较小的训练误差,这两种数据就被称为是存在”软间隔“。
我们可以通过调整我们对决策边界的定义,将硬间隔时得出的数学结论推广到软间隔的情况上,让决策边界能够忍 受一小部分训练误差。这个时候,我们的决策边界就不是单纯地寻求最大边际了,因为对于软间隔地数据来说,边 际越大被分错的样本也就会越多,因此我们需要找出一个”最大边际“与”被分错的样本数量“之间的平衡。
参数C用于权衡”训练样本的正确分类“与”决策函数的边际最大化“两个不可同时完成的目标,希望找出一个平衡点来 让模型的效果最佳。
| 参 数 | 含义 |
|---|---|
| C | 浮点数,默认1,必须大于等于0,可不填 松弛系数的惩罚项系数。如果C值设定比较大,那SVC可能会选择边际较小的,能够更好地分类所有训 练点的决策边界,不过模型的训练时间也会更长。如果C的设定值较小,那SVC会尽量最大化边界,决 策功能会更简单,但代价是训练的准确度。换句话说,C在SVM中的影响就像正则化参数对逻辑回归的。 |
在实际建模中,C和核函数的相关参数(gamma,degree等等)们搭配,往往是SVM调参的重点。与gamma不 同,C没有在对偶函数中出现,并且是明确了调参目标的,所以我们可以明确我们究竟是否需要训练集上的高精确 度来调整C的方向。默认情况下C为1,通常来说这都是一个合理的参数。 如果我们的数据很嘈杂,那我们往往减小 C。当然,我们也可以使用网格搜索或者学习曲线来调整C的值。
2. 评估指标
2.1 混淆矩阵
基于混淆矩阵,有六个不同的模型评估指标,准确率,精确度,召回率,F1 measure,特异度,假正率
| 预测值 | 预测值 | ||
|---|---|---|---|
| 1 | 0 | ||
| 真实值 | 1 | 11 | 10 |
| 真实值 | 0 | 01 | 00 |
对角线上11和00是全部预测正确的
2.1.1 准确率
所有预测正确的样本除以总样本,(11+00)/(10+11+01+00)
2.1.2 捕捉少数类的艺术:精确度
又称查准率,真正少数类占被模型预测为少数类的比例,11/(01+11),换个例子,即真阳/(假阳+真阳)。这个患病例子好理解,之所以让模型做预测,为了找出真正患者占所有被预测为患病的比例。
2.1.3 捕捉少数类的艺术:召回率
顾名思义,召回即模型预测出患病样本占真正所有患病的比例,患病即少数类,即11/(11+10)。即真阳/(真阳+假阴)。
2.1.4 捕捉少数类的艺术:F1 score
因为Precision和Recall是此消彼长的,两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求的平衡。为了同时兼顾精确度和召回率,创造两者调和平均数作为考量两者平衡的综合性指标,称之为F1 measure。
F1=2/(1/P + 1/R)
2.1.5 假负率
从Recall延伸出的,False Negative Rate假负率,等于1-Recall。假负二字比较直观,但还不至于记得很清楚。可以看Recall计算式子,Recall=11/(11+10),则FNR=10/(11+10)。即假阴/(真阳+假阴)。假负率在患病例子里可以理解为假负率。
2.1.6 特异度与假正率
特异度表示所有真实为0的样本,即真实为阴的样本,被正确预测为0(阴)的样本所占的比例。
Specificity = 00/(00+01) 即真阴/(真阴+假阳)
假正率=1-S,即01/(00+01),假阳/(真阴+假阳),FPR False Postive Rate
2.2 ROC曲线
全称Receiver Operating Characteristic Curve 受试者操作特性曲线。纵坐标为Recall,横坐标为FPR假正率,以此来衡量模型在尽量多的捕捉少数类时,多数类被误伤的情况变化,或许多判断对一个少数类,多数类并没少判断错一个。
2.2.1 阈值
个使用阈值0.5,大于0.5的样本被预测为1,小于0.5的样本被预测为0。在不同的阈值下,模型的评估指标会发生变化,利用这一点观察Recall和FPR如何互相影响。
2.2.2 概率
SVM实现概率预测,重要参数probability,接口predict_proba以及decision_function。用SVC的接口decision_function,它返回我们输入的特征矩阵中每个样本到划分数据集的超平面的距离。我们在SVM中利用超平面来判断我们的样本,本质上来说,当两个点的距离是相同的符号的时候,越远离超平面的样本点归属于某个标签类的概率就很大。比如说,一个距离超平面0.1的 点,和一个距离超平面100的点,明显是距离为0.1的点更有可能是负类别的点混入了边界。同理一个距离超平面 距离为-0.1的点,和一个离超平面距离为-100的点,明显是-100的点的标签更有可能是负类。所以,到超平面的距离一定程度上反应了样本归属于某个标签类的可能性。接口decision_function返回的值也因此被我们认为是SVM 中的置信度(confidence)。
不过,置信度始终不是概率,它没有边界,可以无限大,大部分时候也不是以百分比或者小数的形式呈现,而SVC 的判断过程又不像决策树一样可以求解出一个比例。为了解决这个矛盾,SVC有重要参数probability, 默认为False,表示是否启用概率估计。必须在调用fit之前启用它,启用此功能会减慢SVM的运算速度。 设置为True则会启动,启用之后,SVC的接口predict_proba和predict_log_proba将生效。 在二分类情况下,SVC将使用Platt缩放来生成概率,即在decision_function生成的距离上进行Sigmoid压缩,并附 加训练数据的交叉验证拟合,来生成类逻辑回归的SVM分数。
2.2.3 绘制ROC曲线
ROC是一条以不同阈值下的假正率FPR为横坐 标,不同阈值下的召回率Recall为纵坐标的曲线。简单地来说,只要我们有数据和模型,我们就可以在python中绘 制出我们的ROC曲线。思考一下,我们要绘制ROC曲线,就必须在我们的数据中去不断调节阈值,不断求解混淆矩阵,然后不断获得我们的横坐标和纵坐标,最后才能够将曲线绘制出来。
1 | probrange = np.linspace(clf_proba.predict_proba(X)[:,1].min(),clf_proba.predict_proba(X)[:,1].max(),num=50,endpoint=False) |
2.3 AUC面积
在sklearn中,我们有帮助我们计算ROC曲线的横坐标假正率FPR,纵坐标Recall和对应的阈值的类 sklearn.metrics.roc_curve。同时,我们还有帮助我们计算AUC面积的类sklearn.metrics.roc_auc_score。
1 | from sklearn.metrics import roc_auc_score as AUC |
2.4 利用ROC曲线找出最佳阈值
现在,有了ROC曲线,了解了模型的分类效力,以及面对样本不均衡问题时的效力,那如何求解最佳的阈值呢?想要了解什么样的状况下模型的效果才是最好的。回到对ROC曲线的理解来:ROC曲线反映的是recall增加的时候FPR如何变化,也就是当模型捕获少数类的能力变强的时候,会误伤多数类的情况是否严 重。希望模型在捕获少数类的能力变强的时候,尽量不误伤多数类,也就是说,随着recall的变大,FPR 的值越小越好。所以我们希望找到的最优点,其实是Recall和FPR差距最大的点。这个点又叫做约登指数。
1 | maxindex = (recall - FPR).tolist().index(max(recall - FPR)) |
3. 总结
我学了SVM原理,包括决策边界,损失函数,拉格朗日函数,拉格朗日对偶函数,软间隔硬间隔,核函数以及核函数的各种应用。了解了SVC类的各种重要参数、属性、接口,其中参数包括软间隔的惩罚系数C,核函数kernel,核函数的相关参数gamma,coef0和 degree,解决样本不均衡的参数class_weight,解决多分类问题的参数decision_function_shape,控制概率的参数probability,控制计算内存的参数cache_size,属性主要包括调用支持向量的属性support_vectors_ 和查看特征重要性的属性 coef_。接口中,我们学习了最核心的decision_function。除此之外,学习了分类模型的模型评估指标:混淆矩阵和ROC曲线,还介绍了部分特征工程和数据预处理的思路。
4.
上面都是乱写的,或者可以说是写给别人看的,你知道核函数为poly是什么情况使用不?