微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

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

2015-04-19 21:12 数说工作室



本集目录为:


一、简化版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条件了。

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

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



  • 解释(3)


这个eta是什么鬼?

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


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

a1a2换成aiaj,那么eta就是2Kij-Kii-Kjj,就是上面的代码了。不信,你看:




  • 解释(4)


对于第一次优化的两个参数a1a2(在这里是aiaj),第六话中我们给出了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下面的评论)




数说工作室

是由几位数据分析行业的爱好者也是从业者做的交流平台,主要依托微博和微信两个媒介,网站也正在筹备中。


  • 微博“数说工作室网站”:

主要分享一些零碎化的知识,关于数据挖掘理论、方法、电子书、有趣的结果,以及一些相关的行业应用等信息。

没时间刷微博也没关系,数说君每周会把一些精华内容整理一下,在微信上再发一次:


  • 微信公众号“数说工作室”:

主要发布一些原创连载,或者行业精选文章。往期目录:

前面【】内的字母是编号,回复可查看相应文章,也可以直接回复相关术语查看,比如回复“多因子”,则会推送相应的多因子选股模型的文章。



话题汇总:

【T1】统计学毕业之后可以坐什么



《概率论-上帝的赌术》系列

【GLL】第一话:古典概率论,一场赌局引发的血案

【GLL】第二话:大数定律,看不见的神的秩序

【GLL】第三话:正态分布,众生的百态

【GLL】第四话:暴走的假设检验

【GLL】第五话:回归模型,命运的方程

【GLL】番外话:常用分布表

【GLL】局部完结篇



金融模型·量化投资系列

【F1】多因子选股模型

【F2】动量反转

【F3】资本资产定价模型(CAPM)

【F4】盈余管理的测量



算法理论&代码

【A1】金融数据挖掘之朴素贝叶斯

【A2】金融数据挖掘之决策树(ID3)


【MB1】面板数据与Eviews操作指南(上)

【MB2】面板数据与Eviews操作指南(下)


【logistic】logistic回归:从生产到使用(使用篇)

【logistic】logistic回归:从生产到使用(生产篇)

【logistic】logistic回归建模指南


【SVM】分类战车SVM:开题话

【SVM】分类战车SVM:线性分类

【SVM】分类战车SVM:最大间隔分类器

【SVM】分类战车SVM:拉格朗日对偶问题

【SVM】分类战车SVM:核函数

【SVM】分类战车SVM:SMO算法

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



《统计师的Python日记》系列

【Python】第1天:谁来给我讲讲Python?

【Python】第2天:再接着介绍一下Python呗


《大数据与金融业》资讯系列

【dsj1】P quant与Q quant(转)

【dsj2】P quant的装备之战

【dsj3】银行如何装备Hadoop平台(转)

【dsj4】全面了解大数据在银行业的应用(转)

【dsj5】全面了解大数据在证券业的应用(转)


其他科普文/趣文/资讯:

(注意下面的编号是字母 O,不是数字0,看我的嘴型 → 欧~~)

【O1】P值之死

【O2】争鸣!西方经济学流派图

【O3】数说君的自白:人口数据分析

【O4】独立第三方的困局

【O5】余额宝为什么不该被取缔?

【O6】一位数据分析师的年终总结(行业精选)

【O7】如果有12亿支付宝用户同时向你账户转账一块钱,会发生什么?(行业精选)





 
数说工作室 更多文章 余额宝为什么不该被取缔? 盈余管理的测量 量化投资之多因子选股模型 金融数据挖掘之决策树(ID3) 量化投资之动量反转
猜您喜欢 技术大会值得参加吗? iOS网络请求优化之DNS映射 把VSO作为GitHub上JavaScript项目的免费CI服务器 IT行业加班,到底有没有价值?(愿今天的你不用加班) 海豚创始人杨永智 斗鱼直播-比特币区块链技术(房间号855179) 本周三 晚八点