分享

支持向量机(SVM)和径向基函数(RBF)内部工作原理详解

 taotao_2016 2023-07-01 发布于辽宁

本文,将探讨支持向量机(SVM)的工作原理,结合Python代码示例和直观的可视化。

本文涵盖了以下主题:
  - SVM分类算法所属的算法类别
  - 算法的工作原理解释
  - 什么是核函数(kernels),以及它们在SVM中的使用方式?
  - 通过Python示例和图表更详细地了解RBF核函数

文章选自https:///svm-classifier-and-rbf-kernel-how-to-make-better-models-in-python-73bb4914af5b 

为适合中文阅读习惯,阅读更有代入感,原文翻译后有删改。

图片

 Saul Dobilas | 作者

罗伯特 | 编辑

图片

1. 支持向量机分类属于哪个算法类别?

支持向量机(SVM)最常用于解决分类问题,这些问题属于监督机器学习的范畴。

此外,通过小的调整,SVM也可以通过使用支持向量回归(SVR)用于回归问题。

图片
图片

可以移步原文链接,查看交互式图表。

2. SVM分类算法-简要解释

假设我们有一组属于两个不同类别的点。我们希望以一种方式将这两个类别分开,使我们能够正确地将任何未来的新点分配到其中一个类别。

SVM算法试图找到一个超平面(hyperplane),以最大可能的间隔(margin)分开这两个类别。如果类别是完全线性可分的,则可以使用硬间隔(Hard-margin)。否则,需要使用软间隔(Soft-margin)

注意,最终位于间隔边缘上的点被称为支持向量(support vectors)

为了帮助理解,让我们来看看下面的示例图。

2.1 硬间隔

图片

使用SVM算法分离两类点。硬间隔场景。

被称为'H1'的超平面无法准确地分离这两个类别,因此它对我们的问题来说不是一个可行的解决方案。

'H2'超平面可以正确地分离类别。然而,超平面与最近的蓝色和绿色点之间的间隔很小。因此,存在将任何未来新点错误分类的高风险。例如,当明显应该属于蓝色类别时,算法会将新的灰色点(x1=3,x2=3.6)分配到绿色类别。

最后,'H3'超平面正确地分隔了这两个类别,并且具有最大可能的间隔(黄色阴影区域)。找到了解决方案!

请注意,找到最大可能的间隔可以更准确地分类新点,使模型更加健壮。当使用'H3'超平面时,您可以看到新的灰色点会被正确地分配到蓝色类别。

2.2 软间隔

有时,无法完美地分离这两个类别。在这种情况下,使用软间隔,其中一些点被允许被错误分类或落在间隔内(黄色阴影区域)。这就是“松弛变量”(用希腊字母ξ(xi)表示)的作用。

图片

使用SVM算法分离两类点。软间隔场景。

通过这个例子,我们可以看到'H4'超平面将间隔内的绿色点视为异常值(outlier)。因此,支持向量是距离主要绿色点组更近的两个绿色点。这允许存在更大的间隔,增加了模型的健壮性。

请注意,通过调整超参数C,算法允许您控制对错误分类(和间隔内的点)的关注程度。实质上,C作为分配给ξ的权重。较低的C使决策边界平滑(更健壮),而较高的C旨在将所有训练样本正确分类,产生与训练数据更接近的拟合,但使模型的健壮性降低。

请注意,尽管将C设置为较高值可能会导致模型在训练数据上性能更好,但存在过拟合模型的高风险,从而在测试数据上产生较差的结果。

3. 核技巧

上述SVM的解释涵盖了蓝色和绿色类别线性可分的示例。然而,如果我们想将SVM应用于非线性问题,该怎么办呢?

这就是核技巧(kernel trick)的作用。

核函数是一个将原始的非线性问题转化为高维空间中的线性问题的函数。为了解释这个技巧,让我们来看下面的例子。

假设您有两个类别-红色和黑色,如下所示:

图片

原始的二维数据。

正如您所看到的,红色和黑色点不是线性可分的,因为我们无法画一条线将这两个类别放在这条线的不同侧。然而,我们可以通过画一个将所有红色点放在内部、黑色点放在外部的圆来将它们分开。

如何将这个问题转化为线性问题呢?

让我们添加一个第三个维度,将其定义为x和y值的平方和:

使用这个带有  和  坐标的三维空间,我们现在可以绘制一个超平面(平坦的二维表面)来分隔红色和黑色点。因此,SVM分类算法现在可以被使用。

图片

通过核技巧转化的数据。红色和黑色类别现在是线性可分的。可以移步原文链接,查看交互式图表。

4 径向基函数(RBF)核函数和Python示例

RBF(Radial Basis Function )是sklearn的SVM分类算法中使用的默认核函数,可以用以下公式描述: 

其中gamma(  )可以手动设置,并且必须大于0。sklearn的SVM分类算法中gamma的默认值为: 

简而言之:

  是两个特征向量(2个点)之间的欧氏距离的平方。

Gamma(  )是一个标量,定义了单个训练样本(点)的影响程度。

因此,根据上述设置,我们可以控制个别点对整个算法的影响。Gamma越大,其他点对模型的影响越近。我们将在下面的Python示例中看到改变gamma的影响。

4.1 设置

我们将使用以下数据和库:

  • 来自Kaggle的国际象棋比赛数据
  • Scikit-learn库用于将数据分割为训练集和测试集样本、构建SVM分类模型和模型评估
  • Plotly用于数据可视化
  • Pandas和Numpy用于数据操作

让我们导入所有的库:

图片

然后,我们从 Kaggle 获取国际象棋比赛的数据,您可以通过以下链接下载:https://www./datasnaek/chess。

在您的机器上保存数据后,使用下面的代码将其导入。请注意,我们还派生了一些新的变量供我们在建模过程中使用。

图片

现在,让我们创建几个函数,以便在构建不同模型和绘制结果时进行复用。

第一个函数将把数据分为训练集和测试集,拟合模型,在测试集上预测结果,并生成模型性能评估指标。

图片

下面的函数将使用测试数据和模型预测表面绘制一个 Plotly 的三维散点图。

图片

4.2 使用默认的 C 和 Gamma 值构建模型

让我们使用 rating_differenceturns 字段作为自变量(属性/预测因子),以及 white_win 标记作为目标,构建我们的第一个 SVM 模型。

请注意,这里有一点作弊,因为总步数只有在比赛结束后才会知道。因此,如果我们想在比赛开始前生成模型预测,turns 字段将不可用。尽管如此,这仅用于说明目的;因此,在下面的示例中我们将使用它。

由于我们使用了先前定义的 fitting 函数,代码很简短。

该函数打印出以下模型评估指标:

图片

我们可以看到,测试数据上的模型性能与训练数据上的模型性能相似,这表明模型可以很好地使用默认超参数进行泛化。

现在,我们通过简单调用 Plot_3D 函数来可视化预测:

图片

请注意,顶部的黑色点表示实际类别为1(白方获胜),底部的点表示实际类别为0(白方没有获胜)。同时,曲面表示模型产生的白方获胜的概率。

虽然概率存在局部变化,但决策边界位于 x=0(即评分差=0)附近,因为这是概率穿过 p=0.5 边界的位置。

4.3 SVM模型2:Gamma=0.1

现在让我们看看当我们设置相对较高的 gamma 值时会发生什么。

图片

我们可以看到,增加 gamma 导致了训练数据上的模型性能提高,但测试数据上的性能下降。下图帮助我们明确了解其原因。

图片

与之前的平滑预测曲面不同,现在我们有一个非常 '尖锐' 的曲面。要理解为什么会这样,我们需要更仔细地研究核函数。

当我们选择较高的 gamma 时,我们告诉函数近距离的点比远离的点更重要。因此,我们得到这些 '尖峰',因为预测在很大程度上依赖于训练示例中的个别点,而不是周围的点。

相反,降低 gamma 值告诉函数在进行预测时不仅考虑个别点,还考虑周围的点的重要性。为了验证这一点,让我们看一个 gamma 值相对较低的另一个示例。

4.4 SVM模型3-Gamma=0.000001

让我们重新运行这些函数,带有 Gamma=0.000001 的 SVM 模型性能指标。

图片

正如预期的那样,降低 gamma 值使模型更加稳健,并提高了测试数据上的模型性能(准确度 = 0.66)。下图说明了在赋予更远点更大影响力后预测曲面变得更加平滑。

图片

带有 gamma=0.000001 的 SVM 分类模型的预测平面。图片由作者提供。

4.5 调整超参数 C

我决定不在本文中包含使用不同 C 值的示例,因为它会以类似的方式影响预测平面的平滑度,尽管原因不同。您可以通过将值(如 C=100)传递给 fitting 函数来自行尝试。

5. 结论

SVM 算法非常强大和灵活。虽然我只介绍了使用其中一种可用核函数的基本用法,但我希望这让您了解了 SVM 和 RBF 的内部工作原理。这应该使您能够自己探索所有其他选项。

本文介绍结束。

代码下载,移步: https://pan.baidu.com/s/1VFUQwiNy3P-wdQ9b7RxxhA?pwd=dgg7

祝学习愉快。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多