首页 > 分享 > 《机器学习》分析鸢尾花数据集

《机器学习》分析鸢尾花数据集

转载地址:https://www.cnblogs.com/mandy-study/p/7941365.html

分析鸢尾花数据集

下面将结合Scikit-learn官网的逻辑回归模型分析鸢尾花示例,给大家进行详细讲解及拓展。由于该数据集分类标签划分为3类(0类、1类、2类),很好的适用于逻辑回归模型。

1. 鸢尾花数据集

在Sklearn机器学习包中,集成了各种各样的数据集,包括前面的糖尿病数据集,这里引入的是鸢尾花卉(Iris)数据集,它是很常用的一个数据集。鸢尾花有三个亚属,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。

该数据集一共包含4个特征变量,1个类别变量。共有150个样本,iris是鸢尾植物,这里存储了其萼片和花瓣的长宽,共4个属性,鸢尾植物分三类。如表17.2所示:
 

iris里有两个属性iris.data,iris.target。data是一个矩阵,每一列代表了萼片或花瓣的长宽,一共4列,每一行代表某个被测量的鸢尾植物,一共采样了150条记录。

from sklearn.datasets import load_iris

iris = load_iris()

print iris.data

输出如下所示:

[[ 5.1 3.5 1.4 0.2]

[ 4.9 3. 1.4 0.2]

[ 4.7 3.2 1.3 0.2]

[ 4.6 3.1 1.5 0.2]

....

[ 6.7 3. 5.2 2.3]

[ 6.3 2.5 5. 1.9]

[ 6.5 3. 5.2 2. ]

[ 6.2 3.4 5.4 2.3]

[ 5.9 3. 5.1 1.8]]

target是一个数组,存储了data中每条记录属于哪一类鸢尾植物,所以数组的长度是150,数组元素的值因为共有3类鸢尾植物,所以不同值只有3个。种类为山鸢尾、杂色鸢尾、维吉尼亚鸢尾。

print iris.target

print len(iris.target)

print iris.data.shape  

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

2 2]

150

(150L, 4L)

从输出结果可以看到,类标共分为三类,前面50个类标位0,中间50个类标位1,后面为2。下面给详细介绍使用决策树进行对这个数据集进行测试的代码。

2. 散点图绘制

下列代码主要是载入鸢尾花数据集,包括数据data和标签target,然后获取其中两列数据或两个特征,核心代码为:X = [x[0] for x in DD],获取的值赋值给X变量,最后调用scatter()函数绘制散点图。

import matplotlib.pyplot as plt

import numpy as np

from sklearn.datasets import load_iris

iris = load_iris()

print iris.data

print iris.target

DD = iris.data

X = [x[0] for x in DD]

print X

Y = [x[1] for x in DD]

print Y

plt.scatter(X[:50], Y[:50], color='red', marker='o', label='setosa')

plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor')

plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica')

plt.legend(loc=2)

plt.show()

绘制散点图如图所示:

3. 逻辑回归分析

从图中可以看出,数据集线性可分的,可以划分为3类,分别对应三种类型的鸢尾花,下面采用逻辑回归对其进行分类预测。前面使用X=[x[0] for x in DD]获取第一列数据,Y=[x[1] for x in DD]获取第二列数据,这里采用另一种方法,iris.data[:, :2]获取其中两列数据(两个特征),完整代码如下:

import matplotlib.pyplot as plt

import numpy as np

from sklearn.datasets import load_iris

from sklearn.linear_model import LogisticRegression

iris = load_iris()

X = X = iris.data[:, :2]

Y = iris.target

lr = LogisticRegression(C=1e5)

lr.fit(X,Y)

h = .02

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5

y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure(1, figsize=(8,6))

plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')

plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')

plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica')

plt.xlabel('Sepal length')

plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())

plt.ylim(yy.min(), yy.max())

plt.xticks(())

plt.yticks(())

plt.legend(loc=2)

plt.show()

下面作者对导入数据集后的代码进行详细讲解。

lr = LogisticRegression(C=1e5)  
lr.fit(X,Y)

初始化逻辑回归模型并进行训练,C=1e5表示目标函数。

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

获取的鸢尾花两列数据,对应为花萼长度和花萼宽度,每个点的坐标就是(x,y)。 先取X二维数组的第一列(长度)的最小值、最大值和步长h(设置为0.02)生成数组,再取X二维数组的第二列(宽度)的最小值、最大值和步长h生成数组, 最后用meshgrid函数生成两个网格矩阵xx和yy,如下所示:

[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

...,

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]]

[[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ]

[ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]

...,

[ 4.88 4.88 4.88 ..., 4.88 4.88 4.88]

[ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]

Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
调用ravel()函数将xx和yy的两个矩阵转变成一维数组,由于两个矩阵大小相等,因此两个一维数组大小也相等。np.c_[xx.ravel(), yy.ravel()]是获取矩阵,即:

xx.ravel()

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

yy.ravel()

[ 1.5 1.5 1.5 ..., 4.9 4.9 4.9]

np.c_[xx.ravel(), yy.ravel()]

[[ 3.8 1.5 ]

[ 3.82 1.5 ]

[ 3.84 1.5 ]

...,

[ 8.36 4.9 ]

[ 8.38 4.9 ]

[ 8.4 4.9 ]]

总结下:上述操作是把第一列花萼长度数据按h取等分作为行,并复制多行得到xx网格矩阵;再把第二列花萼宽度数据按h取等分,作为列,并复制多列得到yy网格矩阵;最后将xx和yy矩阵都变成两个一维数组,调用np.c_[]函数组合成一个二维数组进行预测。
调用predict()函数进行预测,预测结果赋值给Z。即:

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

[1 1 1 ..., 2 2 2]

size: 39501

Z = Z.reshape(xx.shape)
调用reshape()函数修改形状,将其Z转换为两个特征(长度和宽度),则39501个数据转换为171*231的矩阵。Z = Z.reshape(xx.shape)输出如下:

[[1 1 1 ..., 2 2 2]

[1 1 1 ..., 2 2 2]

[0 1 1 ..., 2 2 2]

...,

[0 0 0 ..., 2 2 2]

[0 0 0 ..., 2 2 2]

[0 0 0 ..., 2 2 2]]

plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
调用pcolormesh()函数将xx、yy两个网格矩阵和对应的预测结果Z绘制在图片上,可以发现输出为三个颜色区块,分布表示分类的三类区域。cmap=plt.cm.Paired表示绘图样式选择Paired主题。输出的区域如下图所示:
 

plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')
调用scatter()绘制散点图,第一个参数为第一列数据(长度),第二个参数为第二列数据(宽度),第三、四个参数为设置点的颜色为红色,款式为圆圈,最后标记为setosa。

输出如下图所示,经过逻辑回归后划分为三个区域,左上角部分为红色的圆点,对应setosa鸢尾花;右上角部分为绿色方块,对应virginica鸢尾花;中间下部分为蓝色星形,对应versicolor鸢尾花。散点图为各数据点真实的花类型,划分的三个区域为数据点预测的花类型,预测的分类结果与训练数据的真实结果结果基本一致,部分鸢尾花出现交叉。

回归算法作为统计学中最重要的工具之一,它通过建立一个回归方程用来预测目标值,并求解这个回归方程的回归系数。本篇文章详细讲解了逻辑回归模型的原理知识,结合Sklearn机器学习库的LogisticRegression算法分析了鸢尾花分类情况。更多知识点希望读者下来后进行拓展,也推荐大学从Sklearn开源知识官网学习最新的实例。

相关知识

机器学习之路:经典的鸢尾花数据集
【机器学习实战】科学处理鸢尾花数据集
分析鸢尾花数据集
【机器学习】经典数据集鸢尾花的分类识别
鸢尾花数据集下载
[Python机器学习]鸢尾花分类 机器学习应用
【机器学习】鸢尾花分类
机器学习入门——鸢尾花问题
[机器学习基础][笔记] 一、鸢尾花分类
实验一:鸢尾花数据集分类

网址: 《机器学习》分析鸢尾花数据集 https://m.huajiangbk.com/newsview387255.html

所属分类:花卉
上一篇: scikit
下一篇: 诗歌