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


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

    所用到的环境是:

    • 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
  • 相关阅读:
    工作笔记之20170223:①关于Html5的placeholder属性,②以及input的outline:none的样式问题
    工作笔记之:如何在eclipse安装CVS插件?找了很久的,自己总结一下
    ajax后台请求两种方法(js和jQuery)
    22
    21
    20
    19
    18
    17
    16
  • 原文地址:https://www.cnblogs.com/wffett/p/4728076.html
Copyright © 2020-2023  润新知