您的位置:首页 > 其它

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

2015-08-13 22:54 435 查看
本文是在学习机器学习系统设计第二章的时候的笔记(不敢保证百分之一百的准确与完整)。

所用到的环境是:

Python3

Matplotlib,sklearn,numpy还暂时没用到

Anaconda的Spyder,其他的也可以只是注意下可能会遇到注释部分编码的问题

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

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

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

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

from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data=load_iris()
features=data['data']
feature_names=data['feature_names']
target=data['target']
target_names=data['target_names']

for t,marker,c in zip(range(3),">ox","rgb"):
plt.scatter(features[target==t,0],
features[target==t,1],
marker=marker,
c=c)


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

from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

#data是sklearn自带的一个数据结构,是一个字典结构,有5个keys,分别是:
#'DESCR','data','feature_names','target','target_names'
data=load_iris()

#features就是字典data中键值'data'对应的value,它是一个150×4的二维数组
#注意数组与列表的区别。
features=data['data']

#feature_names是一个有四个元素的列表,
#“花萼长度、花萼宽度、花瓣长度、花瓣宽度”
feature_names=data['feature_names']

#target是一个数组,有50个0,50个1,50个2,主要是用来标记花的类型。
target=data['target']

#target_names就是data字典的最后一个items,
#是一个数组,主要是三种鸢尾花的花名,原来的程序中没有,也暂时用不到。
target_names=data['target_names']

"""
以下就是为了把features=data['data']中的“前两列”数据成对的画出来,做成
离散图。
最开始的时候我总是理解不了这是怎么实现的,后来慢慢调试的时候,尝试着。
print target==0
print features[target==0,0]
才发现自己对数组的索引还是不很熟悉,补充了一下这方面的知识后,才逐渐清晰
"""
for t,marker,c in zip(xrange(3),">ox","rgb"):
plt.scatter(features[target==t,0],
features[target==t,1],
marker=marker,
c=c)


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

import numpy as np
from sklearn.datasets import load_iris
from matplotlib import pyplot as plt

data = load_iris()
features = data['data']
feature_names = data['feature_names']
target = data['target']

"""
由上文我们知道,Iris数据集中的核心data是一个(150行,4列)的二维数组。
其中每一列代表的一个特征,现在我们要将这4列数据两两组合,组合成6个组合
(也可以理解为组合成6个(150,2)的数组)将其做成6个离散图。
因此先创建一个组合方式,pairs列表,如下

"""
pairs = [(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]
for i,(p0,p1) in enumerate(pairs):
plt.subplot(2,3,i+1) #subplot是将多个图画到一个平面上的工具
for t,marker,c in zip(range(3),">ox","rgb"):
plt.scatter(features[target == t,p0],
features[target == t,p1],
marker=marker,
c=c)
plt.xlabel(feature_names[p0])
plt.ylabel(feature_names[p1])
plt.xticks([])
plt.yticks([])


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

plt.savefig("1.png")




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

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

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

#提取所有的花瓣长度数据,150个
plength=features[:,2]

#提取 setosa 和 非setosa 的花瓣长度,我把原文稍微修改了一下,比较好理解
#需要了解target与features的对应关系。
is_setosa=(target==0)
setosa_plength=plength[is_setosa]
other_plength=plength[~is_setosa]

#找出 setosa 花瓣的最大长度,和 非setosa花瓣的最小长度
max_setosa=setosa_plength.max()
min_non_setosa=other_plength.min()

#根据下面输出的数据可知 setosa 花瓣的最大长度,和 非setosa花瓣的最小长度没有重合
#因此如果一朵花的花瓣长度小于2的话,那么是setosa的可能性就非常大。
print('Maximun of setosa: {0}.'.format(max_setosa)) #输出值是1.9
print('Minimum of others: {0}.'.format(min_non_setosa)) #输出值是3.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: