【分类战车SVM】附录:用Python做SVM模型

分类战车SVM

(附录:用Python做SVM模型)

回复“SVM”查看本《分类战车SVM》系列的内容:

第一话:开题话

第二话:线性分类

第三话:最大间隔分类器

第四话:拉格朗日对偶问题(原来这么简单!)

第五话:核函数(哦,这太神奇了!)

第六话:SMO算法(像Smoke一样简单!)

附录:用Python做SVM模型

转载请注明来源


本集目录为:

一、简化版SMO算法

二、LIBSVM包

1.简介

2.数据格式

3.安装

4.简单的使用方法

三、题外话

上一集介绍了SMO的算法原理,本集是《分类战车SVM》系列的最后一个,介绍如何用代码实现,给出了简化版的SMO代码,以及LIBSVM的使用方法。

前面6集可以在微信公众号“数说工作室”(搜不到就搜微信号“shushuojun”)中回复“SVM1”(开题话)、“SVM2”(线性分类)、“SVM3”(最大间隔分类器)、“SVM4”(拉格朗日对偶问题)、“SVM5”(核函数)、“SVM6”(SMO算法)来查看。

一首诗,送给我生命中的“最优参”:

KKT条件,

像绵延起伏的万水千山

隔断了我的视线,

却隔不断我对远方的期盼,

少年傲然,曾经,要追寻生命的最优参;

我倚核函数之剑迭代循环,

穿过水榭,越过山峦,

到达SMO算法的彼端,

人生暮然,原来,你才是我人生的最优参。

——数说君


一、简化版SMO算法

此段代码来自于《Machine Learningin Action》这本书。这本书的作者不建议去读SVM的产品级C++代码,因为很难读懂,但把产品级代码和速度提升部分剥离出去,那么只剩下SVM核心思想,这样的代码就很容易读懂了。

首先写三个函数:导入数据的函数、随机数函数、门限函数:

接着,才是简化版的SMO代码(这些代码,为方便在微信中看,我用图的形式展现,如果想要文字版的源码,在微信号“shushuojun”中回复“简化版SVM”即可)

  • 解释(1)

我们还记得f(xi)的公式吧,

故有,

而,

因此,

  • 解释(2)

这个if语句是干嘛的?关于这个代码,一定会有同学有疑惑。其实,这个语句是判断a是否满足KKT条件的,如果不满足KKT条件,说明不是最优的,可以继续优化。如果满足了,则已经是最优的了.

那么什么是KKT条件?

这个我在第四话(微信号shushuojun中回复“SVM4”查看)就卖了一个关子,考虑到这个东东不是很重要(其实我们在一路的推导中也没有太用到这个定理),因此我就在这里直接给出来:

Ei=f(xi)-yi,我们把f(xi)=Ei+yi代入到KKT条件中去,那么KKT条件等价于:

因此,我们可以用如下的条件来筛选出不符合KKT条件的a:

把这个写成代码,就是:

(labelMat[i]*Ei < -toler) and (alphas[i] < C)

Or

(labelMat[i]*Ei > toler) and (alphas[i] > 0)

即,

If ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or((labelMat[i]*Ei > toler) and (alphas[i] > 0))

那么就不满足KKT条件了。

还有人会问,为毛代码中只筛选不满足条件的ai,aj怎么不筛选?

因为有一个叫Osuna的定理告诉我们,只要选择出来的两个a中,有一个违背了KKT条件,那么目标函数在进一步迭代的时候就会减小,迭代就有意义。

  • 解释(3)

这个eta是什么鬼?

第六话中我们说到(在微信号shushuojun中回复“SVM6”),

这个eta其实就是下面分母的2K12-K11-K22。

a1和a2换成ai和aj,那么eta就是2Kij-Kii-Kjj,就是上面的代码了。不信,你看:

  • 解释(4)

对于第一次优化的两个参数a1、a2(在这里是ai、aj),第六话中我们给出了a2的迭代求值公式:

那么a1的公式是什么?求出a2之后,就可以用a2来推导a1了,它的公式是:

这就是代码中的迭代公式了。

  • 解释(5)

这个其实是b的求值公式:

二、LIBSVM包

1. 简介

如果有一个功能强大、全面而且又免费的SVM包,为什么不用呢?

第二节隆重介绍这个LIBSVM包。

LIBSVM是台湾大学林智仁副教授开发设计的一个简单、易于使用和快速有效的SVM软件包,他不但提供了编译好的可在windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其他操作系统上应用。

2.数据格式

LIBSVM使用的训练数据和检验数据文件格式如下:

<label> <index1>:<value1> <index2>:<value2>…

这里label相当于y,即类别变量。Index是自变量的索引号,value就是自变量,举个例子就明白了:

写成LIBSVM格式就应该是:

这个过程同学们可以自己在excel中编写代码来完成,也可以使用FormatDataLibsvm.xls,网上可以下载到。

3. 安装

LIBSVM的官方主页是:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

点击末尾的“阅读原文”可以看到。

如何安装?以下摘自网络,数说君反正找了一台32位的系统,安装上了,64位的同学自己摸索摸索吧:


1)从python官网上下载windows下的安装包python-2.7.3.msi并安装 2)打开IDLE(pythonGUI),输入 >>>import sys >>>sys.version 如果你的python是32位,将出现如下字符: ‘2.7.3 (default, Apr 102012, 23:31:26) [MSC v.1500 32 bit (Intel)]’ 这个时候LIBSVM的python接口设置将非常简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其添加到系统目录,如`C:\WINDOWS\system32\’,即可在python中使用libsvm 3)如果你的python是64位的,也就是说打开IDLE(pythonGUI),输入 >>>import sys >>>sys.version 出现如下字符: '2.7.3 (default, Apr 10 2012, 23:24:47) [MSCv.1500 64 bit (AMD64)]' 这时你需要首先自己编译64位的动态链接库libsvm.dll。方法如下: 在程序列表中的Microsoft VisualStudio 2010/Visual Studio Tools下找到Visual Studiox64 Win64 Command Prompt(2010),注意一定要是64位的command prompt cd到LIBSVM所在文件夹libsvm-3.16 输入nmake -f Makefile.winclean all 这时libsvm-3.16的windows目录下将生成64位的动态链接库。将新生成的libsvm.dll复制到系统目录(例如`C:\WINDOWS\system32\')即可。


4. 简单的使用方法

数说君以一个例子,简单说一下如何训练和预测,其中的参数调整和更深的优化,自己去网上找资料,或者看作者的guide吧。

如果有同学自己成立了一个比较好的文档,欢迎给数说君投稿,跟2万名数据分析爱好者们分享哦~

现在有如下100条数据:

(1)定位

该数据名为testSet,在c:\python路径下,因此我们首先定位:

>>>import os

>>>os.chdir(‘c:\python’)

(2)读取

我们用svm_read_problem来读取这个数据。

>>>y,x=svm_read_problem(‘testSet.txt’)

(3)训练模型

我们用数据的前50条做训练样本,后50样本作为预测样本,来看预测准确性。首先训练模型:

>>>model=svm_train( y[:50], x[:50] )

(4)预测

用训练出来的模型mode来预测:

>>>svm_predict( y[50:], x[50:], model)

结果显示:

Accurary=96% (48 / 50) (classification)

预测的准确性达到了96%。

我们再重新做一遍,这次前80条数据作为训练数据、后面20条数据作为预测数据:

>>>model=svm_train( y[:80], x[:80] )

>>>svm_predict( y[80:], x[80:], model)

Accurary=100% (20 / 20) (classification)

这次正确率是100%了。

三、题外话

至此,“分类战车SVM”系列就完结了,各位同学有补充、修改的可以给数说君投稿,或者其他数据分析相关的干货都可以。另外感谢一下微博用户@当局者清(http://weibo.com/weishengkui)同学指出了第六话中的一些错误(详见http://weibo.com/1744228463/CaxTnfcMA?type=comment下面的评论)

本文分享自微信公众号 - 数说工作室(shushuojun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

【学习】SPSS探索分析实践操作

SPSS为我们提供了探索分析,所谓探索分析之所以是探索,是因为有时候我们对于变量的分布特点不是很清楚,探索的目的在于帮助我们完成以下的工作:识别...

40380
来自专栏量子位

AI跟Bob Ross学画画,杂乱色块秒变风景油画 | PyTorch教程+代码

王新民 编译整理 量子位 出品 | 公众号 QbitAI 正在研究机器学习的全栈码农Dendrick Tan在博客上发布了一份教程+代码:用PyTorch实现将...

40350
来自专栏数说工作室

【分类战车SVM】附录:用Python做SVM模型

本集目录为: 一、简化版SMO算法 二、LIBSVM包 1.简介 2.数据格式 3.安装 4.简单的使用方法 三、题外话 上一集介绍了SMO的算...

312100
来自专栏人工智能头条

利用GPU和Caffe训练神经网络

17750
来自专栏章鱼的慢慢技术路

解救小哈——DFS算法举例

30180
来自专栏AI科技大本营的专栏

学习笔记 | Fast.ai深度学习实战课程Lesson2——带你深入了解CNN

Fast.ai 深度学习是我们此前推出的系列课程,共9节课,并且已经进行了汉化。课程主讲人是资深深度学习研究者Jeremy Howard 教授,他本人连续两年在...

72680
来自专栏大数据文摘

手把手 | 如何用Python做自动化特征工程

机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理。而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练...

1.5K10
来自专栏机器学习AI算法工程

文本自动分类案例(源码)

使用机器学习方法 做文档的自动分类 套路: 1.根据每个文件 生成该文件的一个特征 2.根据特征 选择 分类器 进行文本分类 3.(可选)根据 2 步结果,调...

509120
来自专栏CSDN技术头条

利用GPU和Caffe训练神经网络

本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于...

229100
来自专栏磐创AI技术团队的专栏

谷歌最强NLP模型BERT如约开源,12小时GitHub标星破1500,即将支持中文

BERT终于来了!今天,谷歌研究团队终于在GitHub上发布了万众期待的BERT。

13720

扫码关注云+社区

领取腾讯云代金券