机器学习系统设计——如何对真实样本分类?

本文是在学习机器学习系统设计第二章的时候的笔记(不敢保证百分之一百的准确与完整)。

所用到的环境是:

  • Python3
  • Matplotlib,sklearn,numpy还暂时没用到
  • Anaconda的Spyder,其他的也可以只是注意下可能会遇到注释部分编码的问题

  如果要学好这一章的话,就要对Iris(鸢尾花)数据集有一些研究。

  Iris数据集说简单一点就是对三种鸢尾花(山鸢尾花、变色鸢尾花、维吉尼亚鸢尾花)采样,每种找50朵,每个都要测量,测量什么呢?——花萼的长度、花萼的宽度、花瓣的长度、花瓣的宽度——这四个属性。

  然后将测量的50×3=150组数据做成一个(150,4)的数组,就成了Iris数据集,以后你随便找一个鸢尾花,我拿过来一量花萼/花瓣,在和我的数据集一对照,就知道它是哪一种了。


 不说了,直接撸码,先看看可不可以运行。

 1 from matplotlib import pyplot as plt
 2 from sklearn.datasets import load_iris
 3 import numpy as np
 4 
 5 data=load_iris()
 6 features=data['data']
 7 feature_names=data['feature_names']
 8 target=data['target']
 9 target_names=data['target_names']
10 
11 for t,marker,c in zip(range(3),">ox","rgb"):
12     plt.scatter(features[target==t,0],
13                 features[target==t,1],
14                 marker=marker,
15                 c=c)

然后再逐步解释,如果遇到编码的问题,就把中间的长字符串注释掉或删掉试试

 1 from matplotlib import pyplot as plt
 2 from sklearn.datasets import load_iris
 3 import numpy as np
 4 
 5 #data是sklearn自带的一个数据结构,是一个字典结构,有5个keys,分别是:
 6 #'DESCR','data','feature_names','target','target_names'
 7 data=load_iris()
 8 
 9 #features就是字典data中键值'data'对应的value,它是一个150×4的二维数组
10 #注意数组与列表的区别。
11 features=data['data']
12 
13 #feature_names是一个有四个元素的列表,
14 #“花萼长度、花萼宽度、花瓣长度、花瓣宽度”
15 feature_names=data['feature_names']
16 
17 #target是一个数组,有50个0,50个1,50个2,主要是用来标记花的类型。
18 target=data['target']
19 
20 #target_names就是data字典的最后一个items,
21 #是一个数组,主要是三种鸢尾花的花名,原来的程序中没有,也暂时用不到。
22 target_names=data['target_names']
23 
24 
25 """
26 以下就是为了把features=data['data']中的“前两列”数据成对的画出来,做成
27 离散图。
28 最开始的时候我总是理解不了这是怎么实现的,后来慢慢调试的时候,尝试着。
29 print target==0
30 print features[target==0,0]
31 才发现自己对数组的索引还是不很熟悉,补充了一下这方面的知识后,才逐渐清晰
32 """
33 for t,marker,c in zip(xrange(3),">ox","rgb"):
34     plt.scatter(features[target==t,0],
35                 features[target==t,1],
36                 marker=marker,
37                 c=c)

再然后就是把其余的属性都组合起来,画在一幅图中

 1 import numpy as np
 2 from sklearn.datasets import load_iris
 3 from matplotlib import pyplot as plt
 4 
 5 data = load_iris()
 6 features = data['data']
 7 feature_names = data['feature_names']
 8 target = data['target']
 9 
10 """
11 由上文我们知道,Iris数据集中的核心data是一个(150行,4列)的二维数组。
12 其中每一列代表的一个特征,现在我们要将这4列数据两两组合,组合成6个组合
13 (也可以理解为组合成6个(150,2)的数组)将其做成6个离散图。
14 因此先创建一个组合方式,pairs列表,如下
15 
16 """
17 pairs = [(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]
18 for i,(p0,p1) in enumerate(pairs):
19     plt.subplot(2,3,i+1) #subplot是将多个图画到一个平面上的工具
20     for t,marker,c in zip(range(3),">ox","rgb"):
21         plt.scatter(features[target == t,p0], 
22                     features[target == t,p1], 
23                     marker=marker,
24                     c=c)
25     plt.xlabel(feature_names[p0])
26     plt.ylabel(feature_names[p1])
27     plt.xticks([])
28     plt.yticks([])

可以用以下命令保存成图片

plt.savefig("1.png")

我们这么做的目的就是:把所有的数据按照一定的规则展现出来,方便我们观察

从上面六个图像中可以看到,红色三角形所代表的山鸢尾花比较“特立独行”。其中以最后一张图(花瓣的长度,花瓣的宽度)尤为明显,不仅与其他两个品种距离较远而且比较集中紧凑,另外在x轴(花瓣的长度)上明显没有重合,因此可以很容易的通过花瓣的长度来确定是不是山鸢尾花。

我们通过最大值和最小值的方法来验证一下。

 1 #提取所有的花瓣长度数据,150个
 2 plength=features[:,2]
 3 
 4 #提取 setosa 和 非setosa 的花瓣长度,我把原文稍微修改了一下,比较好理解
 5 #需要了解target与features的对应关系。
 6 is_setosa=(target==0)
 7 setosa_plength=plength[is_setosa]
 8 other_plength=plength[~is_setosa]
 9 
10 #找出 setosa 花瓣的最大长度,和 非setosa花瓣的最小长度
11 max_setosa=setosa_plength.max()
12 min_non_setosa=other_plength.min()
13 
14 #根据下面输出的数据可知 setosa 花瓣的最大长度,和 非setosa花瓣的最小长度没有重合
15 #因此如果一朵花的花瓣长度小于2的话,那么是setosa的可能性就非常大。
16 print('Maximun of setosa: {0}.'.format(max_setosa)) #输出值是1.9
17 print('Minimum of others: {0}.'.format(min_non_setosa)) #输出值是3.0

 

posted on 2015-08-13 22:54  那然那佛  阅读(1665)  评论(0编辑  收藏  举报

导航