鸢尾花数据集

鸢尾花

鸢【音:yuān】尾花(Iris)是单子叶百合目花卉,是一种比较常见的花,可能不经意间你就能在某个公园里碰见它,而且鸢尾花的品种较多。如果逛公园的时,想在女神面前一展才华,不妨了解下关于鸢尾花种类识别的数据集:)

鸢尾花数据集可能是模式识别、机器学习等领域里被使用最多的一个数据集了,很多教材用这份数据来做案例,很多工具,包括R、scikit-learn,都会自带这些数据集,而且说学术界很多论文也应用这份数据做实验,可见这份数据的重要意义。

数据来源和背景

鸢尾花数据集最初由Edgar Anderson 测量得到,而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章「The use of multiple measurements in taxonomic problems」中被使用,用其作为线性判别分析(Linear Discriminant Analysis)的一个例子,证明分类的统计方法,从此而被众人所知,尤其是在机器学习这个领域。

数据中的两类鸢尾花记录结果是在加拿大加斯帕半岛上,于同一天的同一个时间段,使用相同的测量仪器,在相同的牧场上由同一个人测量出来的。这是一份有着70年历史的数据,虽然老,但是却很经典,详细数据集可以在UCI数据库中找到。

数据集详情

鸢尾花数据集共收集了三类鸢尾花,即Setosa鸢尾花、Versicolour鸢尾花和Virginica鸢尾花,每一类鸢尾花收集了50条样本记录,共计150条。

数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。对花瓣我们可能比较熟悉,花萼是什么呢?花萼是花冠外面的绿色被叶,在花尚未开放时,保护着花蕾。四个属性的单位都是cm,属于数值变量,四个属性均不存在缺失值的情况,以下是各属性的一些统计值如下:

属性 最大值 最小值 均值 方差
萼长 7.9 4.3 5.84 0.83
萼宽 4.4 2.0 3.05 0.43
瓣长 6.9 1.0 3.76 1.76
瓣宽 2.5 0.1 1.20 0.76

数据探索

在做任何机器学习的任务之前,需要对数据集进行探索,对其要有基本的认识,包括数据背后的业务背景、数据的量级、是否有缺失值、数据属性的数据类型,还有各个属性的极值、均值、分布等汇总统计指标。常用的指标包括:
1、频率和众数,针对无序分类数据集,其中众数是具有最高频率的值。
2、百分位数,主要针对有序数据集,比如我们可计算鸢尾花数据集中的四个属性的10、25、50、75、90等百分位数。
3、位置度量,包括均值中位数
4、散布度量,主要用极差方差两个指标,跟均值和中位数一样,多用于描述连续数据属性。因为极差和方差均对离群值敏感,所以还可以采用绝对平均偏差中位数绝对偏差四分位数极差等指标来度量。
5、在多元属性的数据集中,每个属性的散布度量可独立其他属性,使用4中的指标来计算,但对于连续变量的数据,散布度量会更多采用协方差来表示。

数据探索不仅需要汇总统计,有时适当的可视化可以带来更直观的效果。对数据的可视化,可以让我们更快速更有效的了解数据的信息。Python中有强大的工具可让我们做这些数据探索,属性的汇总统计指标使用numpy中的统计函数计算,而matplotlib用来做数据的可视化也是非常方便。

常见的可视化技术,比如针对少量属性的可视化,多采用直方图、盒装图、饼图、散布图、百分位数图等。以萼长、萼宽属性为例,可得到三类鸢尾花在萼长和萼宽上的散布图,如下:

萼长和萼宽属性的散布图

给出绘制该散步图的代码:

from matplotlib import pyplot
from sklearn.datasets import load_iris

iris = load_iris()
setosa_sepal_len = iris.data[:50, 0]
setosa_sepal_width = iris.data[:50, 1]

versi_sepal_len = iris.data[50:100, 0]
versi_sepal_width = iris.data[50:100, 1]

vergi_sepal_len = iris.data[100:, 0]
vergi_sepal_width = iris.data[100:, 1]

pyplot.scatter(setosa_sepal_len, setosa_sepal_width, marker = 'o', c = 'b',  s = 30, label = 'Setosa')
pyplot.scatter(versi_sepal_len, versi_sepal_width, marker = 'o', c = 'r',  s = 50, label = 'Versicolour')
pyplot.scatter(vergi_sepal_len, vergi_sepal_width, marker = 'o', c = 'y',  s = 35, label = 'Virginica')
pyplot.xlabel("sepal length")
pyplot.ylabel("sepal width")
pyplot.title("sepal length and width scatter")
pyplot.legend(loc = "upper right")

(全文完)

推荐阅读更多精彩内容