首页 > 代码库 > 机器学习实践初步总结

机器学习实践初步总结

由本人能力所限,本文不注重原理,主要内容是如何运用这种技术。

 数据挖掘和机器学习是做什么用的?
       主要是识别预测。手写输入、人脸识别、指纹识别都是基于识别的。预测的就更多了,股票、天气等等。

 

机器学习的一般作用原理

       一般来讲,给出条件和推导过程,就能推出结果。

数据作为条件,对数据处理的方法就是推导过程,经推导得到的目标数据即为我们需要的结果。

 

x1=1,x2=2作为条件,x1+x2是推导方法,结果是3。当然只要懂加法,无论条件怎么变化,上面那个算式都能准确的预测结果。

真实的情况往往是我们有一批数据作为条件推导方法并不明确。

正是通过机器学习技术来得出推导的方法。

 

 

机器学习的一般流程

(1)收集数据

(2)准备数据

(3)分析数据

(4)训练算法
(5)测试算法

(6)使用算法

参见《机器学习实战》一书。

 

机器学习实践

(1)工具及环境

        市面上的书籍以python和R语言为例的居多。本文以python为例,操作系统为windows

python语言环境一般以2.7和3.5居多,又分为32版本和64位版本。

        环境搭建这里给初学者造成的困扰最多。本人也是得同事朱波的指点才走出困境。

一看网上的介绍多是选择下载.exe,点击安装即可。安装完成后会出现各种版本不兼容的问题。如下错误:

 

   from ._sparsetools import csr_tocsc, csr_tobsr, csr_count_blocks, \

ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

 

还有一些是缺少vc编译环境等莫名其妙的错误。

 

python环境搭建:

官网上下载https://www.python.org/downloads/

python3.5 64位版本。现在使用32位系统的开发人员比较少了。当然,你的系统是32位的就要选择32的python环境。

很多同学装的python2.7的环境,建议您升级。python2.7的环境可能(只是可能)在安装sklearn库的时候会造成版本不兼容的问题。

2.7和3.5的版本在语法上有些不同,如python2.5打印使用print “helloworld”而python3.5写法是print(“hello world”)。

 

依赖库的安装:

numpy:处理数值数组和矩阵运算得基础库。

scipy:使用NumPy做科学计算的库。

matplotlib:数学绘图的语言扩展。

pandas:数据格式化处理工具,也是基于NumPy的。

python-sklearn:机器学习与数据挖掘的算法库。

 

库的安装方法:

不建议下载exe文件点击下一步安装,一是容易漏掉一些依赖的库导致安装不成功,二是容易安装上一些不兼容的库。

建议采用pip工具安装。

切换目录到python的环境目录下,找到script文件夹,当然也可以将此文件夹配置到环境变量中。执行pip install 命令,如下图:

 

 

本人本地使用的是zwpython,里面已经集成了很多库。其它库的安装方法以此类推。当然,要在您的计算机已连接互联网的状态下这样安装。

 

开发使用的IDE

用eclipse的python插件是可以的。

JetBrains PyCharm也是不错的选择。

zwpython貌似网上的下载资源没有了。

IDE的安装和选择就不在赘述,比较简单,搜索下载安装即可。

笔者本地装的是PyCharm和zwpython。

 

一个例子:

        足球比赛的预测。如果真的准确,呵呵,你懂的。一般足球联赛有积分、排名、两队曾经的比赛结果、还有近6场比赛的胜负平等等数据。

(1)收集数据

        以某彩票网站数据为例:

 

可以使用PQuery或者httplib2和lxml去解析网页信息并抓取数据。
抓取信息代码示例如下:
from lxml import etree
import httplib2
response, content = http.request(‘http://www.xxxxxx.com’, ‘GET‘)
tree = etree.HTML(content)
jiaozhan = tree.xpath(u‘//span[@class="gameinfo"]/em‘)
ta_score = tree.xpath(u‘//div[@class="teama"]//span[@class="ying"]‘)
tb_score = tree.xpath(u‘//div[@class="teamb"]//span[@class="ying"]‘)

 

lxml解析html网上示例很多。

抓取完成后可将数据保存为csv文件或者保存到mysql数据库中备用均可。

这里就不贴完整的代码了。

 

(2)准备数据

经过第一步抓取来的数据整理成了一个csv文件,如下表:

 

win

draw

lost

win_rq

draw_rq

lost_rq

jiaozhanscore

dorder

d_score

resulenum

1.29

4.7

7.1

2.02

3.55

2.84

6

7

7

1

2.26

3.1

2.75

5.15

4

1.46

6

-2

-3

1

2.4

3.15

2.55

5.5

4.2

1.41

6

-7

-7

1

1.81

3.5

3.45

3.47

3.75

1.74

10

4

4

-1

3.13

3.15

2.03

1.58

3.7

4.45

4

-12

-13

0

1.62

3.8

4.02

2.9

3.65

1.96

2

10

11

2

1.57

3.65

4.6

2.95

3.35

2.04

6

1

1

3

1.24

4.9

8.5

1.88

3.6

3.13

12

7

6

-1

1.83

3.42

3.45

3.52

3.8

1.72

6

1

3

-1

6

4.3

1.37

2.53

3.55

2.22

-2

-2

-2

-1

5.4

4.35

1.4

2.42

3.45

2.35

2

-16

-17

-2

3.35

3.15

1.95

1.63

3.6

4.2

6

-2

-1

1

4.3

3.85

1.57

2.04

3.65

2.75

0

-10

-8

-1

3.1

3.4

1.95

1.63

3.8

3.95

4

-12

-10

-2

3.15

3.05

2.08

1.55

3.95

4.32

-2

-4

-5

1

2.6

3.2

2.32

6.4

4.3

1.35

6

-3

-3

2

2.44

3.25

2.44

5.75

4.25

1.39

0

3

1

3

1.59

3.6

4.5

3.05

3.32

2

8

7

6

0

1.34

4.5

6.25

2.15

3.5

2.64

14

1

0

-1

最后一列(resulenum)为比赛的结果,主队赢球的数量。前面几列为双方球队几个维度的实力数据。

准备数据相关代码:

import pandas as pd
df = pd.read_csv(‘d:\\sklearn\\csv\\20160801j1.csv‘)#读取文件数据
df = df.dropna(how=‘any‘)#去掉包含数据的行
df.head()

exc_cols = [u‘resulenum‘]
cols = [c for c in df.columns if c not in exc_cols]
x = df.ix[:,cols]#数据集合
y = df[‘resulenum‘].values#结果集合

from sklearn.feature_extraction import DictVectorizer
v = DictVectorizer()
x = v.fit_transform(x.to_dict(orient=‘records‘)).toarray()#将数据集合转换为矩阵


from sklearn.cross_validation import train_test_split
data_train, data_test, target_train, target_test = train_test_split(x, y)

 

 

 

(3)分析数据

(4)训练算法

from sklearn import cross_validation
from sklearn.ensemble import RandomForestClassifier
import datetime
clf = RandomForestClassifier(n_estimators = 100)#随机森林
clf = clf.fit(data_train, target_train)#训练算法

简单吧,就一个fit()函数。

(5)测试算法

pred = clf.predict(data_test)#将测试数据集传入,用于计算准确度,下面打印的是算法的得分情况
print("%s Score: %0.2f" % (‘forest’,clf.score(data_test, target_test)))
scores = cross_validation.cross_val_score(clf, data_test, target_test, cv=5)
print("%s Cross Avg. Score: %0.2f (+/- %0.2f)" % (‘forest’, scores.mean(), scores.std() * 2))

输出:

forest Score: 0.19

forest Cross Avg. Score: 0.25 (+/- 0.23)

可以看到得分很低,0.19,命中率19%。嘻嘻,不如蒙的准。。。

 

(6)使用算法

再预测8场比赛,数据如下:

 

win

draw

lost

win_rq

draw_rq

lost_rq

jiaozhanscore

dorder

d_score

3.7

3.45

1.76

1.79

3.5

3.52

6

-6

-10

2.89

2.93

2.26

1.46

3.8

5.5

10

-3

-2

3.24

3.4

1.9

1.66

3.75

3.84

-4

-13

-14

1.58

3.9

4.16

2.78

3.65

2.02

0

6

6

1.92

3.2

3.38

4.15

3.55

1.65

-2

11

9

3.52

3.65

1.75

1.8

3.7

3.3

-2

-3

-1

3.76

3.5

1.73

1.82

3.75

3.2

2

-4

-6

2.98

3.15

2.1

1.54

3.95

4.4

-6

4

3

 

代码:

df = pd.read_csv(‘ d:\\sklearn\\csv\\20160827_prej1.csv‘)
cols = [c for c in df.columns]
x = df.ix[:,cols]
clf = RandomForestClassifier(n_estimators = 100)
clf=clf.fit(data_train, target_train)
rs = clf.predict(x)
print(rs)

输出:

[ 1  1  2  0 -1  0  0  1]

 

有些同学可能会问,你这些数据都是什么含义啊,其实具体含义对于学习机器学习本身并不重要。大可把它们理解为长方体的长宽高,或者预测天气的温度、湿度、气压等数据。

 

关于机器学习的算法和原理推荐大家读《机器学习实战》一书。另外,拿这么简单数据预测比赛并不靠谱,请不要误入歧途。

 

其它资料:

pandas入门:http://www.cnblogs.com/chaosimple/p/4153083.html

sklearn学习两篇:

http://blog.csdn.net/yuanyu5237/article/details/44278759

http://blog.csdn.net/a6225301/article/details/50484604

 

机器学习实践初步总结