自从Statsbot团队发表了一篇关于(时间序列异常检测)的文章后,很多读者要求我们介绍一下支持向量机的方法。因此,Statsbot团队将在不使用高等数学的情况下向读者介绍SVM,并分享有用的库和资源。如果您曾经使用机器学习来执行分类任务,那么您应该听说过支持向量机(SVM)。该算法具有五十年代初的历史,随着时间的推移它们不断进化并适应了其他各种问题,例如回归、异常值分析、排名等。在许多深度学习开发人员的模型库中,SVM是他们的最爱。在[24]7(https://www.247-inc.com/)中,我们也将使用它们来解决多个问题。我将更多地关注发展直觉理解而不是严格的数学推导,这意味着我们将尝试尽可能地跳过数学细节以建立对其工作原理的理论直觉。1.分类问题假设你的大学开设一门机器学习课程,课程的讲师发现擅长数学或统计学的学生倾向于表现***。课程结束后,老师记录了注册学生的分数在课程中,他们根据每个学生在机器学习课程中的表现给每个学生贴上标签:“好”或“差”。现在,老师我们想确定数学和统计学的分数与机器学习课程的表现之间的关系。也许,根据他们的统计结果,他们会在学生报读课程时增加一个先决条件限制。他们将如何做?先把他们的数据展示出来,我们可以画一个二维图,一个坐标轴代表数学成绩,一个代表统计成绩。每个学生的具体成绩在图中表示为一个点。点的颜色(绿色或红色)代表学生在机器学习课程中的表现:“好”或“差”。图片看起来像这样:当学生要求注册课程时,教师会询问她数学和统计学的成绩。根据他们掌握的数据,他们将对她在机器学习课程中的表现做出合理的猜测。我们真正想要的是一种以(math_score,stats_score)形式提供“分数元组”的算法。一个算法,告诉你一个学生在图片中用红点或绿点表示(red/green可以理解为类别或标签)。当然,这个算法已经以某种方式包含了训练数据的特征。在这种情况下,一个好的算法将能够寻找红色和绿色簇之间的分界线(即决策边界),然后确定分数元组将依赖于哪一侧。我们选择绿色方块或红色方块作为他在本课程中最有可能的表现水平的标签。这条线称为决策边界(因为它分隔不同标记的集群)或分类器(我们用它来分类点集)。该图显示了针对此问题的两个可能的分类器。2.Goodclassifiersandbadclassifiers有一个很有趣的问题:上面两条线都把红色和绿色的点簇分开了。选择一个而不是另一个有任何合理的依据吗?请注意,分类器的价值不是它分离训练数据的程度。我们最终希望它能够分离尚未看到的数据(即测试数据)。所以我们需要选择在训练数据中捕获一般模式的线,这更有可能在测试数据中表现更好。上面显示的第一条线看起来有点偏离,它的下半部分看起来太靠近红点簇,而它的上半部分看起来太靠近绿点簇。当然,它确实很好地分离了训练数据,但是如果它遇到测试数据中的一个点离聚类有点远,它很可能会给它添加一个错误的标记。第二点不存在这样的问题。例如,下图显示了两个分类器分离立方体点簇的结果。第二行在正确分离训练数据的同时,尽可能远离两个簇,即取最大区间的策略。位于两个集群的中间降低了出错的风险,可以说,它为每个类的数据分布提供了更多的回旋余地,因此它可以更好地泛化到测试数据。SVM是一种试图找到第二类决策边界的算法。上面我们只是通过目视选择了一个更好的分类器,但实际上,为了在一般情况下应用它,我们需要更精确地定义它的隐含原理。这里简单解释一下SVM的工作原理:找到准确分离训练数据的决策边界;在所有这些决策边界中,选择一个与最近邻居的距离最大化的边界。那些定义决策边界的最近邻居称为支持向量。而决策边界周围的区域被定义为区间。下图显示了支持向量和对应的第二个决策边界:黑色边框的点(有两个)和区间(阴影区域)。支持向量机提供了一种在多个分类器中找到更准确地分离测试数据的分类器的方法。尽管上图中的决策边界和数据是二维的,但需要注意的是,SVM实际上可以处理任何维度的数据,它们会在其中寻找类似于二维决策边界的结构。比如在三维空间中寻找分离面(后面会简单提到),在高维空间中寻找分离超平面,即扩展二维决策边界和三维分离面到任意维结构。决策边界(或一般意义上的分离超平面)被称为线性可分数据。分离超平面称为线性分类器。3.ErrorToleranceandSoftMarginClassifiers我们在上一节中看到的是一个线性可分数据的简单示例,但真实数据往往非常混乱。您还可能经常遇到未正确线性分类的示例。此处显示了一个示例:显然,使用线性分类器通常无法完美地分离标签,但我们不想完全抛弃它,因为除了一些错误外,它工作得很好。解决这个问题。那么SVM是如何处理这个问题的呢?SVM允许您指定允许出现多少错误点。您可以在SVM中设置一个参数“C”;因此,您可以在两个结果之间进行权衡:间隔较宽;精确分离训练数据;C的值越大,训练数据中允许的误差越少。必须强调的是,这是一个取舍的过程。如果你想更好地对你的训练数据进行分类,权衡是更宽的间隔。下图显示了分类器和区间在不同C值下的变化(支持向量未显示)。请注意决策边界如何随着C值的增加而倾斜。在较大的C值时,它会尝试尽可能多地分离右下角的红点。但也许我们不想在测试数据中做同样的事情。第一张图中的C=0.01似乎更好地捕捉了总体趋势,尽管与较大的C值相比它牺牲了准确性。考虑到这是一种权衡,重要的是要注意区间如何随着C值的增加而缩小。在前面的示例中,间隔内不允许出现任何错误。这里我们看到基本不可能既有良好的分离边界又没有错误点的区间。由于现实世界的数据几乎不可能精确分离,因此确定一个合适的C值非常重要和实用。我们经常使用交叉验证来选择一个合适的C值。4.线性不可分数据我们已经介绍了如何支持向量机处理***或几乎最大线性可分的数据。SVM如何处理那些明显非线性可分的数据呢?毕竟现实中有很多世界上所有的数据都是这种类型的。当然,找到一个分离超平面不再有效,这反而凸显了SVM在此类任务中的出色表现。这里有一个关于线性不可分数据的例子(这是著名的XOR问题的变体),展示了一个线性分类器SVM的结果:这个结果不是很好,只能得到75%的训练数据的准确率,这是使用决策边界可以获得的最佳结果。还有,决策边界离一些数据点太近,甚至分裂了一些点。现在是关于支持向量机我最喜欢的部分。我们目前拥有的:擅长寻找分离超平面的技术,以及不可线性分离的数据。那么该怎么办?当然是将数据映射到另一个空间使其线性可分,然后求分离超平面!我将逐步详细介绍这个想法。仍然以上图中的数据集为例,然后将其映射到三维空间中,其中新的坐标为:映射数据的表示如下图所示。你找到一个可以插飞机的地方了吗?让我们开始在上面运行SVMs:标签分离很完美,然后将平面映射回原来的2D空间,看看决策边界长什么样子:在训练数据上得到100%的准确率,而分离边界并没有太靠近数据点,很棒!初始空间中决策边界的形状取决于映射函数的形式。在映射空间中,分隔边界通常是一个超平面。请记住,映射数据的主要目的是使用SVM找到分离超平面。将分离超平面映射回原空间时,分离边界不再是一条线,边距和支持向量也不同。基于视觉直觉可以很好地理解它们在映射空间中的形状。看看它们在映射空间中的样子,再看看原来的空间。3D边距(没有阴影以避免视觉混乱)是分隔超平面的区域。映射空间中有4个支持向量,比较合理,分布在两个平面上来确定间距。在原来的空间里,他们还在决策边界上,但似乎没有足够的数字来确定最佳区间。我们退一步分析一下:1.你如何确定将数据映射到什么空间?我已经提到根号2出现在某处!在这个例子中,我想展示如何将数据映射到高维空间映射的过程,所以我选择了一个非常具体的映射。一般来说,这很难确定。然而,多亏了奥弗定理,我们可以确认的是,通过将数据映射到更高维空间,确实更有可能使数据线性可分。2.所以我所要做的就是映射数据并运行SVM?没有。为了使上面的示例易于理解,我将其解释为好像我们需要先映射数据。如果你自己映射数据,你如何表示一个无限维度的空间?看来SVM很擅长这个,是时候看看算法的核函数了。第五,核函数最终是让SVM具备标注能力的独家秘方。这里我们需要讨论一些数学问题。让我们回顾一下目前为止我们所看到的:对于线性可分的数据,SVM工作得非常好。对于近似线性可分的数据,只要使用正确的C值,SVM仍然可以很好地工作。对于线性不可分的数据,可以将数据映射到另一个空间,使数据绝对或几乎绝对线性可分,将问题返回到1或2。首先SVMs一个非常令人惊讶的方面是没有使用任何数学机制,例如精确映射,甚至空间的维度都被明确表示。您可以根据数据点(表示为向量)的点积写出所有数学运算。例如对于P维向量i和j,第一个下标区分数据点,第二个下标表示维度:点积的定义如下:如果数据集中有n个点,SVM只需要将所有的点成对配对才能找到分类器。就这样。当我们需要将数据映射到高维空间时也是如此,我们不是提供到SVM的精确映射,而是提供映射空间中所有成对点对的点积。让我们重新访问我们之前所做的映射,看看我们是否可以找到相关的核函数。我们还将跟踪映射的计算,然后查找点积以比较内核的工作方式。对于任意一个点i:对应映射点的坐标为:我们需要进行如下操作来完成映射:得到新坐标的第一维:1次乘法第二维:1次乘法第三维:2次乘法加起来总共1+1+2=4次乘法,新坐标下的点积为:要计算两点i和j的点积,我们需要先计算它们的映射。所以一共是4+4=8次乘法,然后点积的计算涉及到3次乘法和2次加法。乘法:8(映射)+3(点积)=11乘法加法:2(点积之间)一共计算11+2=13次,下面的核函数会给出相同的结果:首先在Computesthedot初始空间中向量的乘积,然后对结果进行平方。展开公式,看是否正确:正确。这个公式需要计算多少次?看上面公式的第二步。在二维空间中计算点积只需要2次乘法和1次加法,而平方是另一种乘法。所以总数是:乘法:2(初始空间的点积)+1(平方运算)=3次乘法加法:1(初始空间的点积)总共3+1=4次计算。只有之前计算的31%。看起来使用内核函数计算所需的点积会更快。这在目前看来并不是一个重要的选择:它只是4和13的比较,但是在输入点是高维度且映射空间具有更高维度的情况下,大型数据集的计算节省量计算可以大大加快训练速度。因此,使用核函数具有相当大的优势。大多数SVM库都是预先打包的,包括一些常用的内核函数,例如多项式、径向基函数(RBF)和S型函数。当不使用映射时(如文中第一个例子),我们计算初始空间的点积。正如我们之前提到的,这被称为线性核函数(linearkernel)。许多核函数可以提供额外的手段来进一步调整数据。例如,一个多项式核函数:这个多项式允许选择c和d(多项式的自由度)的值。在上面的3D映射示例中,我使用了值c=0,d=2。但内核函数的优势远不止于此!还记得我之前提到过映射到无限维空间的情况吗?它只需要知道正确的核函数。因此,我们不需要对输入数据进行映射,或者无限维空间的难题。核函数是在数据确实映射的情况下计算内积的形式。RBF核函数通常应用于一些特定的无限维映射问题。我们在这里不讨论数学细节,但会在文末提及一些参考资料。空间维度无限时如何计算点积?如果你感到困惑,回想一下无限序列的加法是如何计算的,道理类似。内积虽然有无穷项,但是可以用一些公式来计算它们的和。这回答了我们在上一节中提出的问题。总结一下:我们通常不会为数据定义一个特定的映射,而是从几个可用的核函数中选择,在某些情况下需要做一些参数调整,最后为数据选择最合适的核函数。我们不需要自己定义内核函数或映射数据。如果核函数可用,使用它会导致更快的计算。RBF核函数将数据映射到无限维空间。6.SVM库你可以从很多SVM库中选择并开始你的实验:libSVMSVM—LightSVMTorch许多通用机器学习库如scikit-learn也提供SVM模块,通常打包在一个专门的SVM库中。我建议使用已经过测试并证明有效的libSVM。libSVM通常是一个命令行工具,但下载通常捆绑了Python、Java和MATLAB。只需使用libSVM格式化您的数据文件(下载文件中的README将解释这一点以及其他选项),然后开始试验。事实上,如果你想快速了解不同的核函数和c值等是如何影响决策边界的,可以尝试访问“图形界面”的主页。在上面标记几种类型的数据点,选择SVM参数,然后运行。赶紧去试了一下:给SVM出了一道hardproblem,然后试了几个不同的kernel:网站界面没有显示分离边界,但是显示了SVM判断分类标签的结果。可以看到,线性核完全忽略了红色的点,认为整个空间只有黄色的点。RBF核函数完全为红点画了两个圆圈!原文:http://www.kdnuggets.com/2017/08/support-vector-machines-learning-svms-examples.html【本文为专栏组织“机器之心”微信原创翻译公众号《机器之心(id:almosthuman2014)》】点此查看作者更多好文
