本案例由开发者:山东科技大学-崔宾阁老师提供
1 概述
1.1 案例介绍
随着云计算与人工智能技术的快速发展,如何在高效、便捷的环境中开展机器学习实验成为了教育与研发实践中的关键问题。鸢尾花分类(Iris Classification)作为机器学习领域的经典案例,因其数据集规模适中、特征属性清晰、分类结果直观,长期以来被广泛用于算法教学、模型验证与实验环境测试。本案例以K近邻(K-Nearest Neighbors, KNN)算法为核心,通过实现对鸢尾花样本数据的分类任务,旨在为开发者和学习者提供一个低门槛、高价值的入门实践场景,从而更好地理解监督学习的基本思想与模型构建流程。
本案例依托华为云主机的CodeArts IDE for Python作为主要开发与运行环境。借助云端一体化的集成开发工具,开发者可以在无需本地环境配置的前提下,直接完成代码编写、依赖管理、模型调试与结果可视化。云主机不仅为算法运行提供了稳定的算力支持,同时也具备版本管理、资源调度与远程协作等功能,有效提升了实验过程的可复现性与开发效率。这种基于云端的案例开发方式,体现了人工智能实验与云计算平台深度融合的应用趋势。
本案例的设计目标在于通过实践操作,帮助开发者系统性地掌握KNN算法在典型分类任务中的应用方法,并理解其基本原理与适用场景。通过数据加载与预处理、模型训练与验证、分类结果展示等环节,学习者不仅能够获得对监督学习流程的全面认知,还能积累在云端开发环境中开展机器学习实验的实操经验。最终,该案例能够促使开发者在理解算法知识的同时,提升其在华为云平台上构建、运行与管理人工智能项目的综合能力,为后续更复杂的智能应用开发奠定坚实基础。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计30-60分钟(取决于网络与熟练程度)。
1.4 案例流程

说明:
① 用户申请并登录华为开发者空间,进行环境配置;
② 在云主机CodeArts IDE for Python中编写鸢尾花分类案例的项目代码。
1.5 资源总览
本案例预计花费总计0元。
| 资源名称 | 规格 | 单价(元) | 时长(分钟) |
| 开发者空间—云主机 | 鲲鹏通用计算增强型 kC2 | 4vCPUs | 8G | Ubuntu | 免费 | 30 |
| CodeArts IDE | CodeArts IDE for Python | 免费 | 30 |
2 操作步骤
2.1 配置开发者空间—云主机
本案例中,使用华为开发者空间所提供的云主机平台以及CodeArts+Python开发工具,完成鸢尾花分类案例的开发工作。点击链接( https://support.developer.huaweicloud.com/doc/development/resource-tools/zh-cn_topic_0000002367559525-0000002367559525 )可跳转至免费领取云主机指南。
1. 在浏览器中输入华为云开发者空间网址:https://developer.huaweicloud.com/developerspace,进入到华为云开发者空间页面。
在华为开发者空间页面点击“免费领取”,跳转到开发者空间页面,如未领取根据页面提示进行云主机领取。

2. 在开发者空间页面,点击左侧“工作台”按钮进入工作台页面,再点击“配置云主机”进行云主机的配置。

3. 在配置云主机窗口中自定义云主机名称,配置完毕后点击“安装”。

4. 安装完毕后点击“打开云主机”>“进入桌面”即可进入云主机。

5. 等待环境云主机下载镜像、安装系统、安装工具集,首次进入云主机大约需要3至5分钟。

6. 环境准备完毕后,即可进入云主机,云主机桌面如下图所示。

2.2 创建项目
1. 双击打开云主机桌面上的CodeArts IDE for Python。

2. 首次使用CodeArts IDE创建项目,可直接点击左侧栏目中的“新建工程”,创建鸢尾花分类项目。

3. 新建项目后,在项目名称栏输入:Iris Classification,项目存放位置、基础解释器等直接使用默认配置,选择性勾选“创建main.py示例脚本”,接着点击右下角蓝色“创建”按钮。

4. 点击左上角文件,打开新建,选择新建文件,创建Jupyter Notebook文件,该文件是一种交互式文档,支持分步执行代码。

5. 在“新建文件”窗口,点击第二项,新建Jupyter Notebook文件。

6. 在“选择内核”窗口中,点击第一项,选择Jupyter内核源。若在保存文件后,按提示 “安装/启动建议的扩展python+jupyter”却因版本冲突无法成功安装,此时可尝试重置云主机,更新到最新的IDE版本,之后再重新进行内核相关操作。

7. 内核选择新建Iris Classification项目时创建的虚拟环境,点击第三项,选择“venv(Python3.12.3)”。

8. 选择完成后,可以在右上角看到当前Notebook文件运行用到的内核。

9. 在Notebook文件的代码单元格中输入代码,点击单元格左上角的运行按钮,安装ipykernel模块,该模块是将Python环境注册为Jupyter内核的关键组件。

10. 点击“安装”后,可以在右下角看到ipykernel模块的安装,大约等待5-8分钟,该模块安装完成。

11. ipykernel模块成功安装后,代码单元格的代码即可运行。下面代码里导入工具包的部分(from sklearn import datasets),包名(sklearn)下方显示红色波浪线,这是因为编译器里缺少相关的依赖。当点击单元格左上角运行,就会出现运行错误的信息。

12. 点击下方菜单栏中的“终端”按钮,打开终端,安装相关依赖。

13. 在终端输入命令安装缺少的依赖,通过输入:pip install scikit-learn指令下载,输入完成后按下回车键,等待安装完成。如果安装太慢,可以使用国内源,如使用pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple指令下载。

14. 安装完成后,可以看到代码单元格中包名下方红色波浪线消失。此时点击左上角的运行按钮,可以看到代码完成,1.0s表示这段代码的正常运行完的时间为1秒。

15. 当前代码单元格运行完成后,需要新增一个代码单元格,编写接下来的代码。点击“+ 代码”按钮后,一个新的代码单元格被添加到当前代码单元格的下方。

16. 所有代码编写并运行完后,按住键盘“Ctrl+s”保存notebook文件,此时可将默认命名“Untitled-1.ipynb”修改自定义名称,然后点击右下角“保存”按钮。

2.3 鸢尾花数据集介绍
Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa(山鸢尾),Versicolor(杂色鸢尾),Virginica(维吉尼亚鸢尾))三个种类中的哪一类。

鸢尾花(iris)数据集共有4个属性列和1个品种类别列。四个属性分别是sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)、petal width(花瓣宽度),单位都是厘米;三个品种类别是Setosa、Versicolor、Virginica。鸢尾花数据集中样本数量为150个,每类50个,因此,Iris数据集是一个150行5列的二维表。

2.4 编写并运行代码
1. 数据加载
鸢尾花数据集(150个样本,4个数值特征,3个类别)内置于scikit-learn库中,无需下载,只需要使用import导入即可,导入数据集代码如下:
from sklearn import datasets
iris = datasets.load_iris()
在notebook文件的代码单元格中编写并运行鸢尾花数据集导入的代码,运行成功的截图如下。

此时,鸢尾花数据集已导入成功,使用“print()”函数输出一些数据集的基本信息。
print("=== 鸢尾花数据集信息 ===")
print(f"特征名称: {iris.feature_names}")
print(f"目标类别: {iris.target_names}")
print(f"数据形状: {iris.data.shape}")
print(f"目标形状: {iris.target.shape}")
print(f"前5行数据:\n{iris.data[:5]}")
运行完毕后,可以在代码单元格下方看到鸢尾花数据集的基本信息,包括特征名称、目标类别、数据形状和目标形状,并展示了数据集的前五行数据。

定义两个变量X和y,X为特征数据(花萼长度、花萼宽度、花瓣长度、花瓣宽度),y为标签数据(Setosa、Versicolor、Virginica)。
X = iris.data # 特征数据:花萼长度、花萼宽度、花瓣长度、花瓣宽度
y = iris.target # 标签数据:Setosa、Versicolor、Virginica

2. 数据预处理
scikit-learn库中的train_test_split函数可以打乱数据集并进行拆分,实验中将数据按照70%划分为训练集,30%划分为测试集。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

训练集和测试集划分完成后,输出划分后的数据集信息。
print("=== 数据集划分 ===")
print(f"训练集特征形状: {X_train.shape}")
print(f"测试集特征形状: {X_test.shape}")
print(f"训练集标签形状: {y_train.shape}")
print(f"测试集标签形状: {y_test.shape}")
print(f"训练集标签分布: Setosa={sum(y_train==0)}, Versicolor={sum(y_train==1)}, Virginica={sum(y_train==2)}")
print(f"测试集标签分布: Setosa={sum(y_test==0)}, Versicolor={sum(y_test==1)}, Virginica={sum(y_test==2)}")
print()
从代码的运行结果中可以直观看到训练集的特征形状(样本数量为105,包含花萼长度、花萼宽度、花瓣长度和花瓣宽度4个数据特征)、标签形状(同样包含105个样本,标签数据y与特征数据X一一对应)和标签分布(105个样本中属于三种不同鸢尾花的数量)和测试集的特征形状、标签形状和标签分布。

标准化(使得每个特征均值为0、标准差为1)是数据预处理中的一个重要步骤,目的是将不同量纲和不同尺度的特征数据统一到一个相同的尺度上,使其具有相同的均值和标准差。在鸢尾花数据集中,不同特征的量纲不同,例如花萼长度和花瓣宽度的数值范围差异较大,可能导致某些特征对模型的影响过大,而其他特征则可能被忽略。通过使用StandardScaler方法对训练集拟合,并用其参数对训练集和测试集进行标准化,有助于消除不同特征量纲差异,提高KNN的分类效果。
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

输出标准化后的前五行训练数据示例,标准化处理后,每个特征均值为0、标准差为1。
print("=== 数据标准化 ===")
print("标准化后的前5行训练数据:")
print(X_train[:5])
print()

3. 模型训练与预测
实验使用scikit-learn库neighbors模块中的KNeighborsClassifier类实现K近邻(KNN)分类。KNN 的核心思想是:给定一个新的数据点,算法首先计算它与训练集中所有样本的距离度量(如最常用的欧氏距离),找出距离最近的k个样本;随后将这k个邻居的标签进行投票,把出现次数最多的类别作为新数据点的预测结果。这里k值由参数n_neighbors控制,本实验设为 5,为该规模数据集的经验常用值。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5) # 创建KNN分类器,k=5

若想基于训练集来构建模型,需要调用knn对象的fit方法,输入参数为X_train和y_train,二者都是NumPy数组,前者包含训练数据,后者包含相应的训练标签。
knn.fit(X_train, y_train)
运行代码后,在单元格输出处可以点击“Parameters”项查看使用的KNN参数信息。

之后调用knn对象的predict方法对测试数据做出预测,预测结果保存到变量y_pred中。
y_pred = knn.predict(X_test)
print("=== 预测结果 ===")
print(f"前10个真实标签: {y_test[:10]}")
print(f"前10个预测标签: {y_pred[:10]}")
print()
输出前十个真实的标签和预测的标签进行对比,从运行结果中可以推测出模型对鸢尾花分类的准确率很高。

4. 模型评估
在测试集上进行预测,并输出评估指标。其中,混淆矩阵展示分类正确与错误的分布情况(对角线是正确的预测,非对角线是错误分类,可以直观看到哪些类容易混淆);分类报告给出精确率、召回率与F1值,可以全面评估模型性能。
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
accuracy = accuracy_score(y_test, y_pred)
print("=== 模型评估 ===")
print(f"模型准确率: {accuracy:.4f} ({accuracy*100:.2f}%)")
print("=== 混淆矩阵 ===")
print(confusion_matrix(y_test, y_pred))
print("\n详细分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
实验运行结果显示准确率为1.00,这主要是因为鸢尾花数据集规模较小(只包含150个样本)、特征分布分明,容易被分类正确,在在更复杂或更大规模数据集上,模型准确率未必能达到相同效果。
混淆矩阵是用来评估分类模型准确度的工具,显示了模型预测结果与实际标签之间的比较。在输出的混淆矩阵中,第一行表示Setosa类的预测结果,可以观察到19个Setosa样本被正确分类为Setosa,0个Setosa样本被误分类为其他类别。第二行表示Versicolor类的预测结果,第三行表示Virginica类的预测结果,同样可以分析出KNN模型分类非常准确,没有出现误分类的情况。

分类报告提供了多个关键评估指标,包括:Precision(精确率)、Recall(召回率)、F1-score和Support(每个类在测试集中实际存在的样本数)。从上面截图的运行结果中可以看出,Setosa、Versicolor和Virginica三类的精确率、召回率和F1分数都为1.00。精确率为1.00表示凡是被预测为Setosa(或其余两类)的记录,没有一例是其他类别被错分进来。召回率为1.00所有真正的Setosa、Versicolor、Virginica都被模型捕获,没有遗漏。F1分数取得1.00说明精确率与召回率同时完美,模型对该类别的预测既“准”又“全”。
5. 可视化结果
matplotlib.pyplot是专门用于数据可视化的库(首次使用数据可视化库需要在终端输入命令:pip install matplotlib进行安装)。通过可视化,可以查看数据集内部特征之间的关系,观察到特征间分布关系。本次实验中鸢尾花数据集的可视化将通过散点图展现,散点图(scatter plot)将二维样本数据以点的形式展现在直角坐标系上。不同类别在二维空间可能有一定重叠,因此需要多维特征才能更好地区分。由于鸢尾花数据集的特征有四项,实验仅选取前两个(花萼长度和花萼宽度)特征进行绘制。
下列示例以标准化后的花萼长度为x轴,标准化后的花萼宽度为y轴,以KNN鸢尾花分类结果为标题绘制的散点图,并使用plt.savefig(...)将绘制的散点图保存为"knn_iris_classification.png"。
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap=plt.cm.Set1,
marker='o', edgecolor='k', s=80)
plt.title("KNN Iris Classification Results", fontsize=14)
plt.xlabel("sepal length (standardized)")
plt.ylabel("sepal width (standardized)")
plt.grid(True)
plt.savefig("knn_iris_classification.png", dpi=300, bbox_inches='tight')# 保存为PNG图片
plt.close()
运行代码后,可以看到左侧出现了一张“knn_iris_classification.png”图像,点击这张图像便可以查看使用KNN算法进行鸢尾花分类的可视化结果。

下图是鸢尾花分类结果的二维散点图。其中,X轴为标准化后的花萼长度,Y轴为标准化后的花萼宽度,每个点代表鸢尾花数据集中的一个样本,点的颜色代表了该样本所属的类别(颜色由系统自动分配,下图为运行示例)。颜色的不同有助于我们直观地看到不同种类的鸢尾花在这两个特征维度上的分布情况。在图中,每个类别的样本根据其在花萼长度和花萼宽度特征上的位置被标记,并且颜色区分清楚,以便观察各个类别在这两个特征的空间中是否存在明显的分隔。

至此本次实验全部内容完成。
2.5 拓展思考
1. 尝试修改K值,观察准确率是否变化;
2. 替换分类算法(如逻辑回归、决策树),比较模型表现。
3 释放资源
3.1 关闭云主机
1. 使用完毕后,点击云主机桌面顶端菜单中的“关机”按钮,在弹出的对话框中点击“确定”即可退出云主机。

2. 点击“确定”按钮后页面自动跳转到开发者空间页面,可以看到我的云主机显示“关机中”,说明云主机正在关机。

3.2 检查资源
云主机关机后,等待3至5分钟,当我的云主机显示“已就绪”时,说明云主机成功关机,下次使用云主机只需点击“打开云主机”>“进入桌面”即可,可参考2.1小节。

华为云主机实现鸢尾花分类
6万+

被折叠的 条评论
为什么被折叠?



