人之所以伤心,是因为看得不够远。--林语堂
全文字数:2325字
阅读时间:12分钟
前言
本系列是《玩转机器学习教程》一个整理的视频笔记。本小节将通过实践应用sklearn为我们封装的高斯核的SVM算法来进行具体的分类并解释分类决策边界的几何意义,着重实验不同的gamma取值对最终分类决策边界的影响。
a
高斯核中的gamma
高斯核函数和概率论中的高斯函数(正太分布)形式是一致的。
概率论中的高斯函数表达式有两个参数:
- μ为均值,它决定了整个高斯函数中心轴的位置;
- σ为标准差,它是用来描述样本数据分布的情况:
- σ越大,整个高斯函数的分布曲线(钟型图案)就会越宽越分散,即分布曲线又矮又胖;
- σ越小,整个高斯函数的分布曲线(钟型图案)就会越窄越集中,即分布曲线又高又瘦;
如上图左半部分所示,图示中包含三不同参数的高斯函数:
- 实线:μ = 0,σ = 0.5,此时的分布曲线是最高最瘦的;
- 虚线:μ = 0,σ = 1.0,此时的分布曲线相对矮一些胖一些;
- 点线:μ = 0,σ = 2.0,此时的分布曲线是最矮最胖的;
上一个小节提到过,高斯函数中的(-1/2 * 1/σ^2)这一项在高斯核函数中变成gamma(gamma与γ一个意思,本小节统一使用gamma),所以σ对整个函数的影响和gamma在高斯核函数中的影响是一致的,具体来说gamma和σ的趋势正好相反(gamma与σ平方为倒数关系)。
- 高斯核函数中的gamma越大,相对高斯函数中的σ越小,此时的分布曲线也就会越高越瘦;
- 高斯核函数中的gamma越小,相对高斯函数中的σ越大,此时的分布曲线也就越矮越胖;
接下来使用sklearn中核函数为高斯核函数的SVM算法来实现分类。与此同时,取高斯核函不同的gamma值来观察分类决策边界的变化。
b
gamma对决策边界的影响
使用sklearn自带的make_moons函数生成噪声为0.5(noise = 0.5)两个类别的半月形型数据集,为了保证实验结果的一致性,设置随机种子random_state为666。
在使用sklearn封装的高斯核(或RBF核)的SVM算法之前,不要忘记对数据进行标准化,标准化和实例化SVC(sklearn中的分类SVM算法使用SVC类实现)这两个过程可以通过管道Pipeline的方式进行连接。
定义一个名为RBFKernelSVC的函数,函数只需要传入一个gamma参数,与此同时为gamma参数设置一个默认值1.0。函数的返回值为实例化的Pipeline对象,实例化的过程中传入一个列表,列表中的每一个元素都是一个元组,每一个元组表示一个过程,此时只有两个过程:
- 标准化过程,实例化标准化的Standardscaler类;
- 训练模型过程,实例化SVM的分类算法的SVC类。本小节SVC分类算法使用的核函数都是高斯核函数,因此只需要在实例化SVC类的时候指定kernel = "rbf"以及gamma为用户调用函数时传入的gamma值;
接下来就可以利用这个函数来实例化一个核函数为高斯核的SVC类。调用函数时指定gamma = 1.0。
此时的gamma = 1.0,本小节不进行真正的分类,所以不使用train_test_split方法对数据集划分训练集和测试集。接下来使用前面一直使用的绘制决策边界的函数绘制使用高斯核且gamma = 1.0的SVM分类算法的决策边界。
plot_decision_boundary函数中传入两个参数:
- svc,训练好的使用高斯核且gamma = 1.0的SVC类的实例化对象;
- axis,指定绘制的数据范围;
在绘制决策边界的同时将原始的样本点也绘制出来。上图所示的就是使用高斯核且当gamma = 1.0时候得到的决策边界。此时得到的决策边界和多项式核函数得到的决策边界并没有什么区别,这是因为取gamma = 1.0还看不出来核函数为高斯核的特点。
接下来调节gamma的值,设置较大的gamma值,重新调用RBFKernelSVC函数,并指定gamma = 100,并将函数返回的实例化对象命名为svc_gamma100。绘制svc_gamma100模型针对X和y数据集进行训练以后的决策边界。
前面提到过,gamma参数值取值越大表示的就是高斯函数(正太分布)的那个分布曲线越高瘦,分布曲线变的尖尖的。使用高斯核函数进行分类的决策边界其实就是针对其中的某一类的每一个样本点都有一个分布曲线,我们所观察的决策边界可以想象成俯视每个样本点的分布曲线,而这些样本点就是俯视时候看到的分布曲线的尖。就本例而言,当gamma = 100时,每一个蓝色类别的样本点就是分布曲线对应的一个尖。由于现在的gamma值比较大,所以可以看见每个蓝色类别的样本点的分布曲线都比较窄,此时的决策边界就是这些蓝色类别样本点周围围绕的区域(分布曲线的区域),只有样本点在这些区域内才判定样本点为蓝色类别,否则,将样本点判定为红色类别。这也是高斯核直观的几何意义。
通过决策边界可以看出,当gamma = 100时,模型对数据集过拟合,所以稍微减小一些gamma的值,指定gamma = 10。将重新调用函数返回的模型命名为svc_gamma10。
上图为gamma = 10的决策边界,相对于gamma = 100,钟形图案更宽了,所以这些蓝色点与点之间离得比较近的分布曲线就融合在了一起。我们回过头来看,当gamma = 1的时候,相当于此时每个样本点的分布曲线变的更宽了,所以整体蓝色类别的样本点周围的范围变的更大了。
如果将gamma设置的小一些,gamma = 0.5。将重新调用函数返回的模型命名为svc_gamma05。
gamma = 0.5时候的决策边界中红色区域的范围变的更大了。
更极端的gamma = 0.1,将重新调用函数返回的模型命名svc_gamma01。
gamma = 0.1时候的决策边界已经和线性的决策边界差不多了。
c
小结
使用SVM算法解决分类问题,如果核函数选用高斯核(或RBF核),gamma参数值相当于在调整模型的复杂度。
- 当gamma非常大的时候,模型复杂度越高,模型过拟合(overfitting),模型对训练的数据集过于敏感,可以预见此时模型的返回能力肯定非常弱;
- 当gamma非常小的时候,模型复杂度越低,模型欠拟合(underfitting),模型不能够非常好的反映数据集;
不过在实际应用中需要针对已有的数据集以及要解决的问题,找出最合适的gamma超参数。这个最合适的gamma值是让模型处在过拟合和欠拟合的中间位置。SVM算法不仅能够解决分类问题还能够解决回归问题,下一小节将会介绍如何使用SVM算法的思路来解决回归问题。
【技术干货】详解 Linux 中的硬链接与软链接
【数据分析】详解 matplotlib 中的两种标注方法
【机器学习】机器学习入门 11-6 到底什么是核函数
【机器学习】机器学习入门 11-7 RBF核函数
【中文分词】详解 SIGHAN05 的目录结构