易学智能

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1959|回复: 3

入门机器学习必备数据集之鸢尾花数据集

[复制链接]

22

主题

107

帖子

266

积分

中级会员

Rank: 3Rank: 3

积分
266
发表于 2018-8-28 08:18:27 | 显示全部楼层 |阅读模式
本帖最后由 马猴烧酒 于 2018-8-28 10:27 编辑

1 简介
    鸢尾花数据集包括3种不同类型的鸢尾花,setoss类型,versicolor类型,virginica类型。存储在150x4的numpy.ndarray中(numpy中的数组),数据的四列分别对应着鸢尾花的四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。该数据集经常被应用于分类问题,分类问题一般是值我们是否能根据特征属性来识别物体的种类,以鸢尾花来说,能否根据鸢尾花的特征(如萼片长度)能识别不同种类的鸢尾花,一般物体的特征越多,越能描述物体不同类别之间的差异,即分类能力越强。我们可以通过使用sklearn的API下载该数据集。
2 数据探索
   如果鸢尾花只用两个特征来描述,是否能够完全识别出不同种类的鸢尾花,下图是两个不同特征下的鸢尾花分布图,红,蓝,绿分别代表鸢尾花不同的种类,从下图我们可以看出,只凭两个特征可以把红色(setosa)这一类给完全识别出来(因为红色的点可以用一条线给分开)而绿色和蓝色的点交叉在一起,只凭两个特征很难用线将蓝点和绿点分开。所以我们需要更多的特征来描述鸢尾花,最好能找到描述鸢尾花绿色和蓝色类别差异的特征。


1.png

图2-1

    如果使用三个特征来描述,从4个特征中取3个不同的特征来组合,根据排列组合知识我们知道有四个组合,即四幅图,下图即不同三个特征下的四幅图,看是否能凭借三个特征将蓝色类别和绿色类别的鸢尾花分开出来。

1.png 1.png


1.png 1.png

    从上图我们可以看出光靠三个特征是找不到一个把不同颜色的点完全分开的平面,。有人可能会说找一个凸凸凹凹的曲面来分割这些橙色和灰色的点。但是这样违反了机器学习的一个原则,奥卡姆剃刀原则,即简单原则,分类曲线或超平面应该是光滑的,而不是凹凸的,否则其泛化性不会太好。
    泛化性指模型在其他数据集上表现的性能,以鸢尾花为例,模型可能在用于训练模型的数据集表现良好,在其他收集的鸢尾花数据上表现较差,这就是泛化性不好的表现,机器学习中的过拟合概念与泛化性不好是相同的,指的是过于拟合训练数据本身的特征,即把小众数据特征中的类别差异当做了大众数据特征中的类别差异,以鸢尾花的特征为例,恰好鸢尾花花瓣长度少于多少厘米就能把该数据集上的类别分开出来,但是在其他的鸢尾花数据上会是这样吗?就像你看到一只天鹅是白色的,两只天鹅是白色的,三只天鹅是白色的,就能断言世界上所有天鹅都是白色的吗?所以应该寻找能代表大众数据的特征差异。
   超平面指三维空间以上的平面,当我们使用四个特征的时候就无法通过图示的方法来直观的看数据是否能够被一个平面(即超平面)分开。这时候一般使用分类正确率来看模型的识别能力。
3 附录代码
运行下面代码,需要安装matplotlib,pandas,numpy,scikit-learn包。若安装了python,这些包均可使用pip install 包名 命令安装。
  1. from sklearn import datasets
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from mpl_toolkits.mplot3d import Axes3D
  5. import numpy as np
  6. #生成空的DataFrame
  7. iris = pd.DataFrame()
  8. #下载鸢尾花数据集
  9. data = datasets.load_iris()
  10. #观看鸢尾花数据集的键值
  11. print(data.keys())
  12. #得到鸢尾花所有的特征名
  13. feature_names = data.feature_names
  14. #为DataFrame添加鸢尾花特征
  15. for i,feature in enumerate(data.feature_names):
  16.         iris[feature] = data.data[:,i]
  17. #为DataFrame添加鸢尾花类别标签
  18. iris['label'] = data.target
  19. #生成画布
  20. fig = plt.figure(1, figsize=(8, 6))
  21. #生成x,y,z三维空间坐标系
  22. ax = Axes3D(fig, elev=-150, azim=110)
  23. #显示四个特征中的其中三个特征组合之一
  24. ax.scatter(iris[feature_names[0]], iris[feature_names[1]], iris[feature_names[2]], c=iris['label'],cmap=plt.cm.Set1, edgecolor='k', s=40)
  25. #显示四个特征中的其中三个特征组合之二
  26. #ax.scatter(iris[feature_names[0]], iris[feature_names[1]], iris[feature_names[3]], c=iris['label'],cmap=plt.cm.Set1, edgecolor='k', s=40)
  27. #显示四个特征中的其中三个特征组合之三
  28. #ax.scatter(iris[feature_names[0]], iris[feature_names[2]], iris[feature_names[3]], c=iris['label'],cmap=plt.cm.Set1, edgecolor='k', s=40)
  29. #显示四个特征中的其中三个特征组合之四
  30. #ax.scatter(iris[feature_names[1]], iris[feature_names[2]], iris[feature_names[2]], c=iris['label'],cmap=plt.cm.Set1, edgecolor='k', s=40)
  31. #设置使用的特征标题
  32. ax.set_title(feature_names[0]+' and '+feature_names[1]+' and '+feature_names[2])
  33. #设置轴名称
  34. ax.set_xlabel(feature_names[0])
  35. ax.w_xaxis.set_ticklabels([])
  36. ax.set_ylabel(feature_names[1])
  37. ax.w_yaxis.set_ticklabels([])
  38. ax.set_zlabel(feature_names[2])
  39. ax.w_zaxis.set_ticklabels([])
  40. #显示图像
  41. plt.show()
复制代码





回复

使用道具 举报

10

主题

82

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2018-9-15 09:08:04 | 显示全部楼层
入门很好的资源,谢谢楼主了
回复

使用道具 举报

1

主题

49

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2018-10-10 08:17:53 | 显示全部楼层
哇,这个数据集很经典啊
回复

使用道具 举报

22

主题

107

帖子

266

积分

中级会员

Rank: 3Rank: 3

积分
266
 楼主| 发表于 2018-10-10 08:34:08 | 显示全部楼层
3529956381 发表于 2018-10-10 08:17
哇,这个数据集很经典啊

是的啊,选自uci,uci还有很多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易学智能

GMT+8, 2024-4-19 17:46 , Processed in 0.015263 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表