鸢【音: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")
(全文完)