1. 线性SVM决策过程的可视化
我们可以使用sklearn中的式子来为可视化我们的决策边界,支持向量,以及决策边界平行的两个超平面。
画决策边界:理解函数contour
matplotlib.axes.Axes.contour([X, Y,] Z, [levels], **kwargs)
Contour是我们专门用来绘制等高线的函数。等高线,本质上是在二维图像上表现三维图像的一种形式,其中两维 X和Y是两条坐标轴上的取值,而Z表示高度。Contour就是将由X和Y构成平面上的所有点中,高度一致的点连接成 线段的函数,在同一条等高线上的点一定具有相同的Z值。我们可以利用这个性质来绘制我们的决策边界。
. 画决策边界:制作网格,理解函数meshgrid
建模,计算决策边界并找出网格上每个点到决策边界的距离
输出:
探索建好的模型
输出:
2 非线性SVM与核函数
为了能够找出非线性数据的线性决策边界,我们需要将数据从原始的空间 投射到新空间 中。 是一个映射 函数,它代表了某种非线性的变换,如同我们之前所做过的使用r来升维一样,这种非线性变换看起来是一种非常 有效的方式。使用这种变换,线性SVM的原理可以被很容易推广到非线性情况下,其推导过程和逻辑都与线性SVM 一模一样,只不过在定义决策边界之前,我们必须先对数据进行升维度 。
重要参数kernel
在参数”kernel“中输入”rbf“就可以使用这种核函数。我们来看看模型找出的决策边界是什么样
探索在特征值标准化后乳腺癌数据集上选取不同核函数的效果
数据可视化
不同核函数的分类效果
量纲统一之后,可以观察到,所有核函数的运算时间都大大地减少了,尤其是对于线性核来说,而多项式核函数居 然变成了计算最快的。其次,rbf表现出了非常优秀的结果。经过我们的探索,我们可以得到的结论是:
(1)线性核,尤其是多项式核函数在高次项时计算非常缓慢
(2) rbf和多项式核函数都不擅长处理量纲不统一的数据集 幸运的是,这两个缺点都可以由数据无量纲化来解决。因此,SVM执行之前,非常推荐先进行数据的无量纲化!到 了这一步,我们是否已经完成建模了呢?虽然线性核函数的效果是最好的,但它是没有核函数相关参数可以调整 的,rbf和多项式却还有着可以调整的相关参数,接下来我们就来看看这些参数。
选取与核函数相关的参数:degree & gamma & coef0
对于高斯径向基核函数,调整gamma的方式其实比较容易,那就是画学习曲线。我们来试试看高斯径向基核函数 rbf的参数gamma在乳腺癌数据集上的表现:
通过学习曲线,很容就找出了rbf的最佳gamma值。但我们观察到,这其实与线性核函数的准确率一模一样之前的 准确率。我们可以多次调整gamma_range来观察结果,可以发现97.6608应该是rbf核函数的极限了。
但对于多项式核函数来说,一切就没有那么容易了,因为三个参数共同作用在一个数学公式上影响它的效果,因此 我们往往使用网格搜索来共同调整三个对多项式核函数有影响的参数。依然使用乳腺癌数据集。
可以发现,网格搜索为我们返回了参数coef0=0,gamma=0.18329807108324375,但整体的分数是0.96959,虽 然比调参前略有提高,但依然没有超过线性核函数核rbf的结果。可见,如果最初选择核函数的时候,你就发现多 项式的结果不如rbf和线性核函数,那就不要挣扎了,试试看调整rbf或者直接使用线性。
重要参数C
参数C用于权衡”训练样本的正确分类“与”决策函数的边际最大化“两个不可同时完成的目标,希望找出一个平衡点来 让模型的效果最佳。
在实际使用中,C和核函数的相关参数(gamma,degree等等)们搭配,往往是SVM调参的重点。与gamma不 同,C没有在对偶函数中出现,并且是明确了调参目标的,所以我们可以明确我们究竟是否需要训练集上的高精确 度来调整C的方向。默认情况下C为1,通常来说这都是一个合理的参数。 如果我们的数据很嘈杂,那我们往往减小 C。当然,我们也可以使用网格搜索或者学习曲线来调整C的值。
在5-7范围内进一步细化
此时,我们找到了乳腺癌数据集上的最优解:rbf核函数下的98.24%的准确率。当然,我们还可以使用交叉验证来 改进我们的模型,获得不同测试集和训练集上的交叉验证结果。但上述过程,为大家展现了如何选择正确的核函 数,以及如何调整核函数的参数。