本文是在学习机器学习系统设计第二章的时候的笔记(不敢保证百分之一百的准确与完整)。
所用到的环境是:
- 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