SVM 中的线性内核性能比 RBF 或 Poly 差得多

数据挖掘 支持向量机 scikit-学习 交叉验证
2021-09-26 19:40:33

在尝试在一些 Kaggle 数据上训练 SVM 时,我遇到了线性内核无法给出任何结果的情况。

这对我来说没有意义,因为 RBF 内核工作得很好,我的理解是线性内核是一个严格简单的版本,它不会将数据映射到更高的维度。事实上,所有的 研究都表明,不仅线性内核是可能的,而且在大多数情况下,收敛速度应该更快(权衡结果可能不那么准确)。

然而,事实证明并非如此。虽然 RBF 内核能够在大约 6 分钟后的交叉验证期间产生结果,但线性内核在大约 6 小时后就坐在那里没有输出。在此之后,我只是强制退出训练并开始测试其他 SVM 参数。

一些事实的细分:

  • 大约 60,000 个示例,大约 120 个特征(有时减少到 30 个特征会有所帮助,线性内核会在数小时后产生结果)
  • 我正在使用 SKLearn GridSearchCV 进行培训
  • 我已经测试了这个使用SVC(kernel='linear')以及LinearSVC(),两者都具有相同的结果
  • 这个问题已经提出了跨不同比赛的多个数据集

我目前的假设是训练停止可能是因为数据不是线性可分的。不过,我可能会遗漏其他明显的东西。任何指导表示赞赏,谢谢!

3个回答

这在很大程度上取决于您的数据集:存在无法使用线性内核分离的数据。这是不可能的,你不会得到任何合理的结果。以简单的 XOR 函数为例。XOR 的图如下所示:

在此处输入图像描述

无论你多么努力,你永远无法使用线性 SVM 或任何线性方法来分离它。

这是一些说明问题的简短 MATLAB 代码:

x = [0 0; 0 1; 1 0; 1 1];    % training points
y = [0; 1; 1; 0];            % target: XOR
linearSvm = fitcsvm(x,y);    % train with linear kernel
linearSvm.predict(x)

>> ans = 
        0
        0
        0
        0

SVM 没有机会找到解决方案。现在,如果我们使用内核,我们会创建到更高维空间的映射。内核技巧允许我们通过计算一个内核函数来隐式地进行这种映射,该函数返回这个高维空间中的标量积的结果,而不需要将输入值映射到这个空间。RBF 核是特殊的,因为它对应于无限维空间。现在,如果我们指定一个 RBF 内核并再次运行相同的示例,那么:

gaussSvm = fitcsvm(x,y,'KernelFunction','rbf');  % RBF kernel
gaussSvm.predict(x)

>> ans = 
        0
        1
        1
        0

SVM 很容易找到正确的结果。使用多项式内核时也可以找到相同的结果(在这种 XOR 情况下)。还有更多示例,其中数据根本无法线性分离,例如:

界

当然,如果您的数据几乎是线性可分的,那么您可以(并且可能会)使用线性内核获得良好的结果。使用允许一些错误分类的软边距 SVM 通常会产生良好的结果,因为它们可以忽略异常值。

如果线性内核没有给出结果,您将不得不接受您的数据不是(很好)线性可分的。您要么必须切换到内核,要么在软边距 SVM 中允许更多错误分类。

在不可分离的情况下,您仍然可以使用线性 SVM 分类器。但是,您应该容忍错误分类。然后你应该调整超参数C.

在某些情况下,不可分离情况下的线性 SVM 比 RBF 内核提供更好的结果。例如,具有相等协方差矩阵的两个类别的最佳决策边界是线性的。

一个快速说明:随着超参数空间的增长,gridsearch 变得非常慢。随机搜索通常会产生同样好的超参数,并且速度更快:

http://scikit-learn.org/stable/auto_examples/model_selection/randomized_search.html