- Python机器学习与量化投资
- 何海群
- 1546字
- 2020-08-27 22:20:54
2.2 经典爱丽丝
Iris(爱丽丝)数据集是机器学习最经典的数据集,全称是安德森鸢尾花卉数据集,是统计学习的必备数据集,图2.1是爱丽丝数据集的特征分类图。

图2.1 爱丽丝数据集的特征分类图
维基百科有专门的词条。
安德森鸢尾花卉数据集(Anderson's Iris data set),也称鸢尾花卉数据集(Iris flower data set)或费雪鸢尾花卉数据集(Fisher's Iris data set),是一类多重变量分析的数据集。它最初是埃德加·安德森从加拿大加斯帕半岛上的鸢尾属花朵中提取的地理变异数据,后由罗纳德·费雪作为判别分析的一个例子,并运用到统计学中。其数据集包含了50个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。其4个特征被用作样本的定量分析,即花萼和花瓣的长度和宽度。基于这4个特征的集合,费雪发展了线性判别分析以确定其属种。
我们的目的就是通过编程,对这3种不同种类的爱丽丝植物的数据,采用专业的数据分析手段和人工智能算法,让程序自动判断植物的种类。
由于sklearn发布很早,当时还没有pandas等新一代数据分析软件,所以sklearn为了保证运行速度,直接使用NumPy模块库的ndarray多维数组作为数据源和内部的数据格式。
近几年发布的TensorFlow、MXNet等神经网络、深度学习平台,为了提高效率,在数据接口部分也直接使用NumPy模块库的ndarray多维数组格式。
不过NumPy模块库的ndarray多维数组是侧重性能的数据格式,在应用方面非常烦琐。
目前,随着pandas等新一代数据分析软件的普及和推广,以及一线开发人员对效率的考虑,越来越多的项目开始使用pandas的DataFrame数据框架作为数据保存格式,从而方便调试程序,交换数据。
本书的各个案例都是基于pandas优先的模式,尽量直接使用DataFrame数据框架作为程序中间数据,只是在必须使用NumPy模块库的ndarray多维数组格式时,才转换为相应的格式。
有关数据转换的细节,我们会在案例当中具体说明。全程采用pandas学习sklearn人工智能,方便初学者把握数据内部的结构和细节。
传统的sklearn人工智能文档,大部分直接采用NumPy数组模块,而NumPy是为了追求极限性能设计的模块库,很多算法函数非常复杂,不亚于汇编。
从某种程度上讲,绝大部分初学者的人工智能学习之路,在起步阶段就被NumPy这个模块库给吓退了。
本书全部采用现有的pandas命令,从数据源对sklearn进行整合,无须学习额外的语法,更加方便初学者入门。
案例2-1:经典爱丽丝
案例2-1的文件名是kb201_iris01.py,程序很简单,秉持着pandas优先的原则,只读取爱丽丝数据集当中的数据,并查看其中数据字段的内容。
第1组代码如下:

第1组代码,运行结果如下:


案例2-1看起来简单,其实做了很多小优化和修改,比如取消了原始的数据列名称,用x1~x4代替。一方面更加通用,另一方面,更加符合人工智能、机器学习的本质。
此外,从输出信息来看,统计命令如下:

在对应的输出信息当中没有xname的数据,因为xname字段是字符串,无法统计分析,需要先对其进行数字化处理,也就是常说的文字信息的矢量化运算。
第2组代码如下:

第2组代码当中的函数如下:

这是调用pandas的value_counts统计函数,用来查看xname数据的具体数据分布情况。
对于植物种类进行了简单的分类统计,共有3种,对应的输出信息如下:

由输出信息可以看出,3种植物名称分别是:山鸢尾(Iris setosa)、变色鸢尾(Iris versicolor)和维吉尼亚鸢尾(Iris virginica)。
案例2-2:爱丽丝进化与文本矢量化
案例2-2的文件名是kb202_iris02.py,将根据xname的植物名称,设置一个新的数据字段xid,来完成这个文本信息的矢量化工作。
下面我们分组逐一讲解。
第1组代码,读取Iris数据文件,并保存到df变量:

第2组代码,根据xname字段,按1、2、3分别设置xid字段,完成读取爱丽丝数据名称的矢量化操作。xid格式设置为int整数格式,并保存到文件iris2.csv中。

我们已经将iris2.csv文件复制到dat目录下,在后面的案例中,大家可以直接使用这个文件作为数据源:data/iris2.csv。
第3组代码,输出修改后的df数据信息:

对应的输出信息是:


第4组代码,输出xname方面的分类统计信息:

对应的输出信息是:

第5组代码,输出xid方面的分类统计信息:

对应的输出信息是:
