机器学习-鸢尾花(Iris Flower)分类

本文通过鸢尾花数据集展示了机器学习项目的完整流程。从数据导入、概述、可视化,到评估多种算法(如LR、LDA、KNN、CART、NB、SVM),最终选定LDA实现98%的预测准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸢尾花  梵高油画作品
鸢尾花分类是机器学习的经典案例了,在这里我们将使用鸢尾花数据集——一个非常容易理解的数据集(花瓣和花萼的长度与宽度),对鸢尾花的3个亚属:山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)进行分类。
接下来我们将通过如下步骤实现这个项目,以展示一个机器学习项目的所有步骤。

  1. 导入数据
  2. 概述数据
  3. 数据可视化
  4. 评估算法
  5. 实施预测

1、导入数据

导入项目中所需要的类库和方法,代码如下:

"""导入类库和方法"""
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

导入数据集:
在UCI机器学习仓库下载鸢尾花数据集,完成后保存在项目地址下。我们将使用Pandas来导入数据并且对数据集进行描述性统计与分析。
导入数据的同时设定数据的名称

separ-lengthsepar-widthpetal-lengthpetal-widthclass
萼片长度萼片宽度花瓣长度花瓣宽度类别

代码如下:

"""导入数据"""
filename = 'iris.data.csv'
names = ['separ-length', 'separ-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(filename, names=names)

2、概述数据

得到数据后,我们查看需要具体查看数据的维度、内容、特征、分布情况等等。代码如下:

"""提要输出"""
# 显示数据的维度:
print("行:%s , 列:%s" % dataset.shape)  
# 查看数据前10行:
print(dataset.head(10))  
# 数据的统计信息:
print(dataset.describe())
#数据的分布情况: 
print(dataset.groupby("class").size())

每个亚属的数据各有50条,分布均衡。如果数据分布不均衡,我们通常会尝试扩大数据样本重新抽样人工生成样本数据异常排除等方案来解决这样的问题。

3、数据可视化

通过数据的审查后,对其基本情况以有了解,接下来将使用图表来进一步分析数据。
首先对单变量进行分析,采取箱线图和直方图来进行分析,
箱线图:描述属性与中位值的离散速度。
直方图:显示每个特征的分布状态。
代码如下:

"""单变量图表"""
#箱线图
dataset.plot(kind="box", subplots=True, layout=(2, 2), sharex=False, sharey=False)
#直方图
dataset.hist()
"""显示图片"""
pyplot.show()

我们将得到如下两张图表:

箱线图直方图

接下来,我们通过散点矩阵图来查看不同属性之间的关系:

"""多变量图表"""
#散点矩阵图
scatter_matrix(dataset)
"""显示图片"""
pyplot.show()

得到如下图表:
散点矩阵图

4、评估算法

根据不同的算法来创建模型,并且评估他们的准确度,以便找到最合适的算法。

分离出评估的数据集。

要验证通过算法创建的模型是否合格,比较出更加优秀的模型,我们得从数据集中分离出一部分,用于评估模型的准确度。
以下,我们按照2 8分分离训练数据集与测试数据集,及:80%的数据用于训练,20%的数据用于评估测试:

"""分离数据 分离评估数据集"""
array = dataset.values
X = array[:, 0:4]
Y = array[:, 4]
validation_size = 0.2
seed = 7
X_train, X_validation, Y_train, Y_validation = \
	train_test_split(X, Y, train_size=validation_size, random_state=seed)

如上,我们分离出了X_trainY_train用来训练算法创建模型,X_validation与Y_validation用于验证评估模型。

创建模型

我们不能仅仅通过对数据的审查来判断那种算法最有效。我们将尝试评估以下六种算法:

  • 线性回归(Linear Regression,LR)
  • 线性判别分析 (linear Discriminant Analysis,LDA)
  • K最近邻 (k-Nearest Neighbor,KNN)
  • 分类与回归树 (Classification And Regression Tree)
  • 朴素贝叶斯(Naïve Bayes,NB)
  • 支持向量机(Support Vector Machine, SVM)

为保证算法评估的准确性,我们在每次算法评估之前重新设置随机种子数,使得每次算法评估的过程中都使用的是相同的数据集。

"""算法审查"""
models = {}
models["LR"] = LogisticRegression(max_iter=1000)
models["LDA"] = LinearDiscriminantAnalysis()
models["KNN"] = KNeighborsClassifier()
models["CART"] = DecisionTreeClassifier()
models["NB"] = GaussianNB()
models["SVM"] = SVC()
"""评估算法"""
results = []
for key in models:
    kfold = KFold(n_splits=10, random_state=seed, shuffle=True)
    cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring="accuracy")
    results.append(cv_results)
    print("%s:%f(%f)" %(key, cv_results.mean(), cv_results.std()))
选择最优模型

执行上述代码,我们得到对于各种算法的准确度得分:

LR:0.866667(0.163299)
LDA:0.933333(0.133333)
KNN:0.900000(0.213437)
CART:0.933333(0.133333)
NB:0.900000(0.152753)
SVM:0.900000(0.152753)

在以上的评分中,LDA与CART获得较高的评分。同样,我们也将评分结果用箱线图显示出来:

"""箱线图比较算法"""
fig = pyplot.figure()
fig.suptitle("Algorithm Comparison")
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

箱线图比较算法

5、实施预测

现在我们选取线性判别分析 (LDA)算法,使用预留的评估数据集来验证这个算法模型,这将能更加准确的了解模型的准确度情况。
以下,使用全部训练数据集的数据来生成LDA算法的模型,并且用预留的评估数据集进行测试,再生成算法模型报告:

"""使用评估数据集评估算法模型"""
svm = LinearDiscriminantAnalysis()
svm.fit(X=X_train,y=Y_train)
predictions = svm.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation,predictions))
print(classification_report(Y_validation,predictions))

执行以上程序,得到报告如下:
测试报告
可以看到该算法模型的准确度达到0.98,我们还得到了冲突矩阵、精确度(precision) 、召回率(recall)、F1值(f1-score)等数据。

总结

至此,我们已经完成了一个非常简单的机器学习项目。该项目包括:导入数据,概述数据,数据可视化,评估算法,实施预测的全部过程。我们也将继续探索机器学习领域,尝试实践对数据进行处理和分析的算法与技巧以及算法的改进。

鸢尾花分类是一个经典的机器学习案例,可以使用机器学习模型对鸢尾花的品种进行分类。在这个问题中,我们使用了鸢尾花数据集,该数据集包含了鸢尾花的花瓣和花萼的长度与宽度等测量数据。根据这些已知品种的鸢尾花数据,我们可以构建一个机器学习模型,通过学习这些数据来预测新鸢尾花的品种。\[1\] 在这个问题中,我们使用了k近邻分类器作为分类算法。k近邻分类器是一种简单易懂的算法,它通过在训练集中寻找与新数据点最近的邻居来进行预测。k的值表示我们考虑训练集中最近的k个邻居,然后根据这些邻居中数量最多的类别来做出预测。在这个案例中,我们将k设为1,即只考虑最近的邻居。\[3\] 在实现这个项目时,我们首先需要导入数据,并对数据进行概述和可视化。然后,我们使用k近邻分类器对数据进行训练,并进行预测。最后,我们评估算法的性能。\[2\] 总结来说,通过使用机器学习模型和k近邻分类算法,我们可以对鸢尾花的品种进行分类,并根据花瓣和花萼的测量数据来进行预测。 #### 引用[.reference_title] - *1* *3* [【机器学习鸢尾花分类](https://blog.youkuaiyun.com/weixin_43651049/article/details/122639847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [机器学习-鸢尾花(Iris Flower)分类](https://blog.youkuaiyun.com/weixin_42611925/article/details/122902579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值