首页 分享 【机器学习】经典数据集鸢尾花的分类识别

【机器学习】经典数据集鸢尾花的分类识别

来源:花匠小妙招 时间:2024-10-31 13:52
【机器学习】经典数据集鸢尾花的分类识别 1、数据集介绍1.1 数据集详情 2、实验内容2.1 准备数据集2.2 创建颜色映射对象2.3 绘制特征散点图2.4 数据的归一化2.5 数据的标准化 3、实验截图提取萼片长度与萼片宽度分类提取萼片长度与花瓣长度分类提取萼片长度与花瓣宽度分类提取萼片宽度与花瓣长度分类提取萼片宽度与花瓣宽度分类提取花瓣长度与花瓣宽度分类

1、数据集介绍

       鸢尾花(Iris)是单子叶百合目花卉,是一种比较常见的花,而且鸢尾花的品种较多。鸢尾花数据集(Iris dataset)是非常著名的机器学习数据集之一,常被用来进行分类和模式识别任务的训练和评估。
       鸢尾花数据集最初由Edgar Anderson 测量得到,而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被使用,用其作为线性判别分析(Linear Discriminant Analysis)的一个例子,证明分类的统计方法,从此而被众人所知,尤其是在机器学习这个领域。

1.1 数据集详情

       该数据集包含了三个品种的鸢尾花(Setosa、Versicolor、Virginica)每个品种各有50个样本,共计150个样本。对于每个样本,测量了4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及其所属的品种标签。
       数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。对花瓣我们可能比较熟悉,花萼是什么呢?花萼是花冠外面的绿色被叶,在花尚未开放时,保护着花蕾。四个属性的单位都是cm,属于数值变量,四个属性均不存在缺失值的情况,字段如下表所示:

字段名称含义sepal length萼片长度sepal width萼片宽度petal length花瓣长度petal width花瓣宽度Species品种类别:分别是:Setosa、Versicolour、Virginica

2、实验内容

       目标要求:通过选取鸢尾花的四种特征中的任意两种特征,对鸢尾花数据集进行种类的分类识别,并对识别后的结果进行统一化与标准化。

2.1 准备数据集

       注:在实验前需要注意可视化的中文以及负号显示,使用以下代码:

plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文 plt.rcParams['axes.unicode_minus'] = False # 显示负号 12

       首先使用 load_iris() 函数加载鸢尾花数据集,并将特征矩阵存储在 X 中,分类值存储在 y 中。
       数据集里面的特征依次为花萼长、宽和花瓣长、宽; 而类别标签为0,1,2分别表示山鸢尾(setosa),变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)
       然后,通过索引操作从 X 中提取了前5条数据,即 X[0:5],以及第二个品种对应的前5条数据: X[50:55]。使用 np.concatenate 函数将这两组数据合并为一个新的特征矩阵 X1。接下来,同样的操作也应用于目标值 y,提取了相应的标签并存储在 y1 中。

2.2 创建颜色映射对象

       使用了 matplotlib.colors.ListedColormap 函数创建了一个颜色映射对象 cm_dark。这个函数接受一个包含颜色名称或颜色代码的列表作为参数。在这里,我传入了一个包含红色、绿色和蓝色的列表 [‘r’, ‘g’, ‘b’]。
       可以将 cm_dark 应用于绘图中的相关元素,以改变它们的颜色显示效果。例如,可以在绘制散点图时使用 cmap=cm_dark 参数将数据点的颜色设置为红、绿、蓝三种颜色之一。

2.3 绘制特征散点图

       使用 plt.scatter 函数绘制了两个特征(萼片长度和萼片宽度)的散点图,并根据目标值 y1 的类别将数据点着色。
       plt.scatter 函数的第一个参数是要绘制的数据点的 x 坐标,即萼片长度(X1[:, 0]);第二个参数是 y 坐标,即萼片宽度(X1[:, 1])。
       通过设置 c=np.squeeze(y1),您将目标值 y1 的类别用作颜色映射的输入。它会根据类别的不同,将数据点着上不同的颜色。edgecolor=‘k’ 设置边缘颜色为黑色。s=50 设置散点的大小为 50。最后,使用 plt.show() 显示绘制的散点图。
在绘制散点图中使用:

plt.grid(color='black', linestyle='--')//添加网格线,颜色为黑色,线型为虚线。 plt.xlabel('sepal length(萼片长度)') plt.ylabel('sepal width(萼片宽度)')//分别设置 x 轴和 y 轴的标签。 plt.title("通过提取萼片长度与宽度的分类")//设置图表的标题。 handles, labels = scatter.legend_elements()//获取散点图中的每个类别对应的标记和标签 //定义图例中的标签内容 legend_labels = ['山鸢尾花(Iris-setosa)','变色鸢尾花(Iris-versicolor)'] //创建图例,并将标记和标签添加进去。 plt.legend(handles, legend_labels, loc='best') 123456789

下图为一个可视化的示例:

import numpy as np from matplotlib import pyplot as plt import matplotlib as mpl from sklearn.svm import SVC from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei']# 显示中文 plt.rcParams['axes.unicode_minus'] = False# 显示负号 data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) print(X1) y1 = np.concatenate([y[0:5], y[50:55]]) print(y1) cm_dark = mpl.colors.ListedColormap(['r', 'g', 'b']) #通过提取列表的第一个特征与第二个特征,即萼片长度与萼片宽度 scatter=plt.scatter(X1[:,0],X1[:,1], c=np.squeeze(y1), edgecolor='k', s=50) plt.grid(color='black', linestyle='--') plt.xlabel('sepal length(萼片长度)') plt.ylabel('sepal width(萼片宽度)') plt.title("通过提取萼片长度与宽度的分类") # 创建图例 handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] plt.legend(handles, legend_labels, loc='best') plt.show()

123456789101112131415161718192021222324252627282930313233343536

在这里插入图片描述

2.4 数据的归一化

       归一化(Normalization) 是将数值型数据缩放到一个固定的范围,通常是[0, 1]。归一化可以通过以下公式实现:
                                                                X_norm = (X - X_min) / (X_max - X_min)
       其中,X表示原始数据,X_norm表示归一化后的数据,X_min和X_max分别表示原始数据的最小值和最大值。
       归一化使得不同特征的数据具有相同的尺度范围,避免了某些特征对模型训练产生过大的影响。常见的归一化方法有最大最小值归一化和Z-score归一化。

2.5 数据的标准化

       标准化(Standardization) 是将数值型数据转换为均值为0、标准差为1的分布。标准化可以通过以下公式实现:
                                                                X_std = (X - X_mean) / X_stddev
       其中,X表示原始数据,X_std表示标准化后的数据,X_mean和X_stddev分别表示原始数据的均值和标准差。
       标准化使得数据分布更符合标准正态分布,对异常值和离群点的影响较小。通常情况下,标准化是数据预处理的常用选择。

3、实验截图

       本节放置实验截图,共六张,为四种特征任选两种特征进行数据的可视化以及统一和标准化。

提取萼片长度与萼片宽度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,0], X1[:,1], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('sepal length(萼片长度)') ax1.set_ylabel('sepal width(萼片宽度)') ax1.set_title("通过提取萼片长度与宽度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,0],X1[:,1], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('sepal length(萼片长度)') ax2.set_ylabel('sepal width(萼片宽度)') ax2.set_title("通过提取萼片长度与宽度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

提取萼片长度与萼片宽度分类

提取萼片长度与花瓣长度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) #sepal length(萼片长度) #sepal width(萼片宽度) #petal length(花瓣长度) #petal width (花瓣宽度) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,0], X1[:,2], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('sepal length(萼片长度)') ax1.set_ylabel('petal length(花瓣长度)') ax1.set_title("通过提取萼片长度与花瓣长度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,0],X1[:,2], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('sepal length(萼片长度)') ax2.set_ylabel('petal length(花瓣长度)') ax2.set_title("通过提取萼片长度与花瓣长度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

在这里插入图片描述

提取萼片长度与花瓣宽度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) #sepal length(萼片长度) #sepal width(萼片宽度) #petal length(花瓣长度) #petal width (花瓣宽度) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,0], X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('sepal length(萼片长度)') ax1.set_ylabel('petal width (花瓣宽度)') ax1.set_title("通过提取萼片长度与花瓣宽度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,0],X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('sepal length(萼片长度)') ax2.set_ylabel('petal width (花瓣宽度)') ax2.set_title("通过提取萼片长度与花瓣宽度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

在这里插入图片描述

提取萼片宽度与花瓣长度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) #sepal length(萼片长度) #sepal width(萼片宽度) #petal length(花瓣长度) #petal width (花瓣宽度) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,1], X1[:,2], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('sepal width(萼片宽度)') ax1.set_ylabel('petal length(花瓣长度)') ax1.set_title("通过提取萼片宽度与花瓣长度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,1],X1[:,2], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('sepal width(萼片宽度)') ax2.set_ylabel('petal length(花瓣长度)') ax2.set_title("通过提取萼片宽度与花瓣长度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

在这里插入图片描述

提取萼片宽度与花瓣宽度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) #sepal length(萼片长度) #sepal width(萼片宽度) #petal length(花瓣长度) #petal width (花瓣宽度) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,1], X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('sepal width(萼片宽度)') ax1.set_ylabel('petal width(花瓣宽度)') ax1.set_title("通过提取萼片宽度与花瓣宽度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,1],X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('sepal width(萼片宽度)') ax2.set_ylabel('petal width(花瓣宽度)') ax2.set_title("通过提取萼片宽度与花瓣宽度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

在这里插入图片描述

提取花瓣长度与花瓣宽度分类

import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec import matplotlib as mpl from sklearn.datasets import load_iris plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = load_iris() X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 = (X1-np.min(X1))/(np.max(X1)-np.min(X1)) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) fig = plt.figure(figsize=(10, 4)) gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) #sepal length(萼片长度) #sepal width(萼片宽度) #petal length(花瓣长度) #petal width (花瓣宽度) # 第一个子图 ax1 = plt.subplot(gs[0]) scatter = ax1.scatter(X1[:,2], X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax1.grid(color='black', linestyle='--') ax1.set_xlabel('petal length(花瓣长度)') ax1.set_ylabel('petal width (花瓣宽度)') ax1.set_title("通过提取花瓣长度与花瓣宽度的分类【归一化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax1.legend(handles, legend_labels, loc='best') X = data['data'] y = data['target'] # 按照要求提取每50条数据的前5条 X1 = np.concatenate([X[0:5], X[50:55]]) y1 = np.concatenate([y[0:5], y[50:55]]) X1 -= np.mean(X1, axis=0) X1 /= np.std(X1, axis=0, ddof=1) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 第二个子图 ax2 = plt.subplot(gs[1]) scatter = ax2.scatter(X1[:,2],X1[:,3], c=np.squeeze(y1), edgecolor='k', s=50) ax2.grid(color='black', linestyle='--') ax2.set_xlabel('petal length(花瓣长度)') ax2.set_ylabel('petal width (花瓣宽度)') ax2.set_title("通过提取花瓣长度与花瓣宽度的分类【标准化】") handles, labels = scatter.legend_elements() legend_labels = ['山鸢尾花(Iris-setosa)', '变色鸢尾花(Iris-versicolor)'] ax2.legend(handles, legend_labels, loc='best') plt.tight_layout() plt.show()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

在这里插入图片描述

相关知识

【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
【机器学习】鸢尾花分类
[Python机器学习]鸢尾花分类 机器学习应用
实验一:鸢尾花数据集分类
[机器学习基础][笔记] 一、鸢尾花分类
机器学习入门——鸢尾花问题
Python机器学习基础教程——1.7第一个应用:鸢尾花分类——学习笔记
第一个机器学习项目(鸢尾花分类问题)
探索花朵的秘密世界:高品质五分类花卉识别数据集
机器学习,实现鸢尾花植物种类自动分类(大数据人工智能公司)

网址: 【机器学习】经典数据集鸢尾花的分类识别 https://www.huajiangbk.com/newsview310400.html

所属分类:花卉
上一篇: 《花卉识别草花》ppt课件(文件
下一篇: 哪些花需要夏季休眠,夏季养护花采

推荐分享