支持向量机 - 探索核函数在不同数据集上的表现
关于核函数在不同数据集上的研究甚少,谷歌学术上的论文中也没有几篇是研究核函数在 SVM 中的运用的,更多的是关于核函数在深度学习,神经网络中如何使用。在 sklearn 中,也没有提供任何关于如何选取核函数的信息。接下来我们就通过一个例子,来探索一下不同数据集上核函数的表现。我们现在有一系列线性或非线性可分的数据,我们希望通过绘制 SVC 在不同核函数下的决策边界并计算 SVC 在不同核函数下分类准确率来观察核函数的效用。
我们总共有四个数据集,四种核函数,我们希望观察每种数据集下每个核函数的表现。以核函数为列,以图像分布为行,我们总共需要 16 个子图来展示分类结果。而同时,我们还希望观察图像本身的状况,所以我们总共需要 20 个子图,其中第一列是原始图像分布,后面四列分别是这种分布下不同核函数的表现。
可以观察到,线性核函数和多项式核函数在非线性数据上表现会浮动,如果数据相对线性可分,则表现不错,如果是像环形数据那样彻底不可分的,则表现糟糕。在线性数据集上,线性核函数和多项式核函数即便有扰动项也可以表现不错,可见多项式核函数是虽然也可以处理非线性情况,但更偏向于线性的功能。另外,多项式核函数多被用于图像处理之中。Sigmoid 核函数就比较尴尬了,它在非线性数据上强于两个线性核函数,但效果明显不如 rbf,它在线性数据上完全比不上线性的核函数们,对扰动项的抵抗也比较弱,所以它功能比较弱小,很少被用到。rbf,高斯径向基核函数基本在任何数据集上都表现不错,属于比较万能的核函数。我个人的经验是,无论如何先试试看高斯径向基核函数,它适用于核转换到很高的空间的情况,在各种情况下往往效果都很不错,如果 rbf 效果不好,那我们再试试看其他的核函数。
几个函数单独拎出来大概展示一下是干啥的 np.mgrid
a, b = np.mgrid[1:3:3j, 2:4:3j] print(a) print(b) --- [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] [[2. 3. 4.] [2. 3. 4.] [2. 3. 4.]]
np.c_[]和 np.vstack
np.c_[[1,2,3],[2,3,4]] # 逐行连接,矩阵增长,并且转置 --- array([[1, 2], [2, 3], [3, 4]]) np.vstack([[1,2,3],[2,3,4]]) # 逐行连接,矩阵增长 --- array([[1, 2, 3], [2, 3, 4]]) (np.c_[[1,2,3],[2,3,4]] == np.vstack([[1,2,3],[2,3,4]]).T).all() # np.c_[]等价于np.vstack([]).T --- True
格式化字符串
a = 0.01 ('%.2f' %a).lstrip('0') # 去掉0.前面的0 --- '.01' type('%.2f' %a) --- str
视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili
版权声明: 本文为 InfoQ 作者【烧灯续昼2002】的原创文章。
原文链接:【http://xie.infoq.cn/article/7be66090b0c4cb5b8289e7cb4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论