实战|Python和R中SVM和参数调优的简明教程
社群用户来源包含:麻省理工学院 斯坦福大学 牛津大学 卡内基梅隆大学 剑桥大学 加州大学伯克利分校 新加坡国立大学 多伦多大学 帝国理工学院 墨尔本大学 香港科技大学 清华大学 香港大学 爱丁堡大学 东京大学 香港中文大学 北京大学 复旦大学 南开大学 中科院等数百所名牌大学的研究生、博士以及教授;NVidia Facebook Line 微软 IBM 谷歌 Bosch Amazon Tesla Motors 百度 华为 英特尔 腾讯 阿里巴巴 科大讯飞等上千家全球一流AI相关企业的工程师以及技术专家。
数据分类是机器学习中非常重要的任务。支持向量机(SVM)广泛应用于模式分类和非线性回归领域。SVM算法的原始形式在1963年由VladimirN.Vapnik和Alexey Ya提出。自此以后,SVM被大幅修改并成功地应用于许多现实世界问题中,例如文本(和超文本)分类,图像分类,生物信息学(蛋白质分类,癌症分类),手写字符识别等。
本文目录:
1. 什么是支持向量机?
2. 它是如何工作的?
3. SVM方程推导
4. SVM的优缺点
5. Python和R实现
什么是支持向量机(SVM)?
支持向量机是一种有监督的机器学习算法,可用于分类和回归问题。它遵循一种称为核心技巧来转换数据的技术,并且基于这些转换,它可以在潜在输出集中找到最佳边界。
简单来说,它做一些极其复杂的数据转换,来找出如何根据标签或定义的输出来分离数据。我们在本文中只讨论SVM分类算法。
它是如何工作的?
其主要思想是最大化训练数据的边际来获得最佳分离超平面。让我们来一个个理解这些客观术语。
什么是分离超平面?
我们可以看到,上图中给出的数据是可分的。例如,我们可以绘制一条线,其中线上方的所有点都是绿色的,而线下方的点是红色的。类似这样的线被称为分离超平面。
现在有一个很明显的混乱,为什么它被称为超平面,如果它是一条线?
在上图中,我们考虑的是最简单的例子,即数据集在二维平面。但是支持向量机也可以用于一般的n维数据集。在更高维度的情况下,超平面是平面的泛化情况。
更正式地说,它是n维欧几里德空间的n-1维子空间。所以对于一个
1)1D数据集,单点表示超平面。
2)2D数据集,线是超平面。
3)3D数据集,平面是超平面。
4)在更高的维度上,它被称为超平面。
我们已经说SVM的目标是找到最佳分离超平面。什么时候分离超平面是最优的?
事实是即使存在一个分离数据集的超平面,也并不意味着这个超平面就是最好的。
让我们通过一组图来理解最佳超平面。
1. 多个超平面
存在多个超平面,但其中哪一个是分离超平面?可以很容易地看出,线B是最好地分离这两个类的线。
2. 多个分离超平面
也可以会有多个分离超平面。我们如何才能找到最佳的分离超平面?直观地,如果我们选择一个接近一个类的数据点的超平面,那么它可能不能很好地分离数据。因此,目的是选择尽可能远离每个类别的数据点的超平面。
在上图中,满足最佳超平面的指定标准的超平面是B.
因此,最大化每个类的最近点和超平面之间的距离可以获得最优分离超平面。这个距离称为边距。
SVM的目标是找到最佳超平面,因为它不仅分类现有数据集,而且有助于预测未知类别数据的类别。并且,最优超平面是最大边际的超平面。
数学设置
现在我们已经知道了这个算法的基础知识,那让我们直接深入SVM的数学技术。
我将假设你熟悉基本的数学概念,比如矢量,矢量运算(加法,减法,点积)和正交投影。这些概念中的一些也可以在文章“机器学习的线性代数的先决条件”中找到。(地址:http://blog.hackerearth.com/prerequisites-linear-algebra-machine-learning)
超平面方程
你遇到了一条直线的方程,比如
其中
考虑线性方程
它只是两种不同的方式来表示相同的东西。那么为什么要使用
了解约束
在我们的分类问题中训练数据是类似这样的形式
在分类问题中,我们尝试找出一个函数,
函数的数量是无限的,且
它也可以表示为
这将输入空间分成两部分,一部分包含类-1的矢量,另一部分包含类+1的矢量。
对于本文的其余部分,我们将考虑2维向量。让表示一个超平面分离数据集并满足以下条件:
这使得
变量
接下来,我们要确保这两类之间没有点。因此,我们将仅选择满足以下约束的那些超平面:
对于每个向量
组合约束
上述两个约束可以组合成单个约束。
约束1:
对于类别为-1的
约束2:
这导致唯一的约束,这两个约束在数学上是等价得。组合的新约束也具有相同的效果,即,两个超平面之间没有点。
最大化边际
为了简单起见,我们将跳过计算边际的公式的推导,m即:
这个公式中唯一的变量是w,它与m是成反比例的。因此最大化边际时我们必须最小化,这导致了一下优化问题:
最小化
上面是我们的数据是线性可分的情况。在许多情况下,数据不能通过线性分离完全分类。在这种情况下,支持向量机将查找使边际最大化并最大限度减少错误分类的超平面。
为此,我们引入了松弛变量
在这种情况下,算法尝试保持松弛变量为零,同时最大化边际。然而,它最小化了从边界超平面的误分类的距离的总和,而不是误分类的数量。
约束现在更改为:
最优化问题也改为:
这里,参数c是控制在松弛变量惩罚(误分类)和边际宽度之间权衡的正则化参数,
1)小的c会使得约束很容易忽略,从而产生一个大的边际;
2)大的c会使得约束条件很难忽略,从而导致一个小的边际;
3)对于
分离两类数据的最简单的方法在2D数据的情况下是线,在3D数据的情况下是平面。但是并不总可能使用线或平面,有时需要一个非线性区域来分离这些类。支持向量机通过使用内核函数来处理这种情况,该函数将数据映射到不同的空间,其中线性超平面可以用于分离类。这被称为核技巧,其中内核函数将数据变换到更高维的特征空间,使得线性分离是可能的。
最优化问题为:
我们不会深入这些优化问题的解决方案。用于解决这些优化问题的最常用的方法是凸优化。
支持向量机的优缺点
每个分类算法都有自己的优点和缺点,它们根据正在分析的数据集的特点起着不同的作用。SVM的一些优点如下:
1)凸优化方法的特性确保了最优性。该解决方案保证是全局最小值,而不是局部最小值;2)SVM是一种适用于线性和非线性可分离数据(使用内核技巧)的算法。唯一要做的就是找出恰当的正则化项C;
3)SVM在小和高维数据空间上效果很好。它对于高维数据集很有效,因为SVM中的训练数据集的复杂度通常由支持向量的数量而不是维度来表征。即使删除所有其他训练示例并重复训练,我们将获得相同的最佳分离超平面;
4)SVM可以在较小的训练数据集上有效工作,因为它们不依赖于整个数据;
SVM的缺点如下:
1)它们不适合较大的数据集,因为使用SVM的训练时间可能很高,并且计算量更大;
2)它们在具有重叠类的噪声数据集上效果很差;
Python和R中的SVM
让我们来看看用于在Python和R中实现SVM的库和函数。
Python实现
在Python中最广泛使用的,实现机器学习算法的库是scikit-learn。scikit-learn中用于SVM分类的类是
参数如下:
1)C:它是误差项的正则化参数c;
2)kernel:它指定要在算法中使用的内核类型。它可以是'linear','poly','rbf','sigmoid','precomputed'或一个可调用类型。默认值为“rbf”。
3)degree:它是多项式核函数('poly')的程度,并被所有其他内核忽略。默认值为3。
4)gamma:它是'rbf','poly'和'sigmoid的核系数。如果gamma是'auto',则将使用1 /n_features。
还有很多高级参数,我在这里没有讨论。你可以在这里看到。
可以通过更改参数和内核函数来调整SVM 。调整scikit-learn中可用参数的函数称为gridSearchCV()。
此函数的参数定义如下:
1)estimator:它是estimator对象,在我们的例子中是svm.SVC()。
2)param_grid:它是具有参数名称(字符串)作为键的字典或列表,以及作为值的参数设置列表。
要了解更多关于GridSearch.CV()的其他参数,请访问这里:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#
在上面的代码中,我们考虑调整的参数是内核,C和gamma。从中得到最佳值的值是写在括号中的值。这里,我们只给出了几个值,但可以给出整个范围的值,但是它需要更长的执行时间。
R 实现
R中实现SVM算法的包是
总结
在本文中,我已经讲解了SVM分类算法的一个非常基础的解释。我已经跳过了一些数学困难,如计算距离和解决优化问题。但我希望这给了你足够的知识来了解一个机器学习算法,即SVM,是如何根据提供的数据集类型来进行修改的。
AIjob社
AIjob社:是《全球人工智能》推出的一项免费求职服务。目前与约100家ai企业合作提供近300个工作岗位。有实习,求职和跳槽意向的ai相关开发工程师可发送简历到邮箱:274724446@qq.com