【机器学习】基于KNN算法实现鸢尾花数据集的分类
【机器学习】基于KNN算法实现鸢尾花数据集的分类
下滑查看解决方法
欢迎莅临我的个人主页 这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!
博主简介:985高校的普通本硕,曾有幸发表过人工智能领域的 中科院顶刊一作论文,熟练掌握PyTorch框架。
技术专长: 在CV、NLP及多模态等领域有丰富的项目实战经验。已累计一对一为数百位用户提供近千次专业服务,助力他们少走弯路、提高效率,近一年好评率100% 。
博客风采: 积极分享关于深度学习、PyTorch、Python相关的实用内容。已发表原创文章500余篇,代码分享次数逾四万次。
服务项目:包括但不限于科研入门辅导、知识付费答疑以及个性化需求解决。
欢迎添加底部微信(gsxg605888)与我交流
(请您备注来意)
(请您备注来意)
(请您备注来意)
下滑查看解决方法
一、引言
在这个数据驱动的时代,机器学习技术已经成为了我们解决问题的重要工具。KNN(K-Nearest Neighbors)算法是机器学习中最简单、最直观的分类算法之一。它基于实例的学习,通过测量不同数据点之间的距离进行分类。在本篇博客中,我们将使用KNN算法对鸢尾花数据集进行分类,并通过代码示例来展示其实现过程。
二、KNN算法简介
KNN算法的核心思想是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。其中,k通常是一个较小的正整数,可以是2或其他用户指定的值。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
KNN算法的优点是简单易懂,无需估计参数,无需训练;缺点是当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。另外,KNN计算量大,尤其是特征数非常多的时候。
三、鸢尾花数据集介绍
鸢尾花数据集(Iris dataset)是机器学习领域中一个常用的数据集,它包含了三类不同的鸢尾花,每类50个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。我们的目标是基于这四个特征来预测鸢尾花的类别。
四、KNN算法实现鸢尾花分类
首先,我们需要导入必要的库:
import numpy as np # 导入numpy库,用于进行数值计算 import matplotlib.pyplot as plt # 导入matplotlib库,用于绘制图形 from sklearn import datasets # 从sklearn库中导入datasets模块,用于加载数据集 from sklearn.model_selection import train_test_split # 导入train_test_split函数,用于划分训练集和测试集 from sklearn.preprocessing import StandardScaler # 导入StandardScaler类,用于数据标准化 from sklearn.neighbors import KNeighborsClassifier # 导入KNeighborsClassifier类,用于创建KNN分类器 from sklearn.metrics import classification_report, confusion_matrix # 导入分类报告和混淆矩阵的计算函数 1234567
然后,我们加载鸢尾花数据集,并将其划分为训练集和测试集:
# 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data # 数据集中的特征 y = iris.target # 数据集中的标签 # 划分训练集和测试集,测试集占20% X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) 1234567 如果需要进一步了解鸢尾花数据集,博主强烈推荐您阅读博客文章【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载如果需要进一步了解train_test_split(),博主强烈推荐您阅读博客文章【Pytorch】进阶学习:深入解析 sklearn.model_selection 中的 train_test_split(划分数据集一步到位)
接下来,我们对数据进行标准化处理,以消除不同特征之间的量纲差异:
# 创建StandardScaler对象 sc = StandardScaler() # 对训练集进行标准化处理 X_train_std = sc.fit_transform(X_train) # 对测试集进行标准化处理,注意这里使用训练集得到的均值和标准差 X_test_std = sc.transform(X_test) 123456 如果需要进一步了解StandardScaler() ,博主强烈推荐您阅读博客文章【机器学习】详细解析Sklearn中的StandardScaler—原理、应用、源码与注意事项
现在,我们可以使用KNN算法进行训练了:
# 创建KNN分类器,设置邻居数为3 knn = KNeighborsClassifier(n_neighbors=3) # 使用训练集数据对KNN分类器进行训练 knn.fit(X_train_std, y_train) 1234
最后,我们可以评估模型的性能:
# 使用训练好的KNN分类器对测试集进行预测 y_pred = knn.predict(X_test_std) # 打印混淆矩阵 print(confusion_matrix(y_test, y_pred)) # 打印分类报告 print(classification_report(y_test, y_pred)) 1234567 如果需要进一步了解classification_report() ,博主强烈推荐您阅读博客文章【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器如果需要进一步了解confusion_matrix(),博主强烈推荐您阅读博客文章【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 confusion_matrix(混淆矩阵)
输出结果如下:
[[10 0 0] [ 0 9 0] [ 0 0 11]] precision recall f1-score support 0 1.00 1.00 1.00 10 1 1.00 1.00 1.00 9 2 1.00 1.00 1.00 11 accuracy 1.00 30 macro avg 1.00 1.00 1.00 30 weighted avg 1.00 1.00 1.00 30 123456789101112
五、K值的选择
在KNN算法中,K值的选择对模型的性能有很大影响:
如果K值较小,模型会变得复杂,容易过拟合;如果K值较大,模型会变得简单,但可能欠拟合。问题:如何理解KNN的过拟合和欠拟合?
想象一下你身处一个陌生的城市,想要找到一家好吃的餐厅。如果只问了一个朋友,他推荐了一家离你最近的餐厅,这就好比KNN算法中的K=1。如果这位朋友的口味与你相近,那你可能会非常满意。但如果他的口味与你相差甚远,或者他推荐的那家餐厅最近刚好换了厨师,那么你可能会觉得失望。这是因为K值太小,你只参考了一个“邻居”的建议,很容易被个别的情况误导,这就是所谓的“过拟合”。
相反,如果你问了10个朋友,他们都给出了自己的推荐,然后你选择了被推荐次数最多的那家餐厅。这就相当于KNN算法中的K值较大。这样做的好处在于,即使其中一两个朋友的推荐不太靠谱,也不会对你的最终决定产生太大的影响,因为你有更多朋友的推荐作为参考。但这样做也有不足,就是可能会错过那些真正美味但不太为人所知的小众餐厅。这是因为K值太大,你参考了太多“邻居”的建议,导致你的选择变得相对保守,可能无法发现那些独特的美味,这就是所谓的“欠拟合”。
因此,在KNN算法中,选择合适的K值至关重要。K值不能太小,以免受到个别数据点的影响;也不能太大,以免忽略了数据中的有用信息。通常,我们会使用交叉验证等方法来选择一个合适的K值,以确保模型在训练集和测试集上都能有良好的表现。
下面是一个简单的示例,展示了如何通过交叉验证来选择最佳的K值:
# 设置K值的范围 k_range = range(1, 31) # 用于存储不同K值对应的交叉验证得分 k_scores = [] # 遍历K值范围 for k in k_range: # 创建KNN分类器,设置当前K值 knn = KNeighborsClassifier(n_neighbors=k) # 进行交叉验证,并计算得分,使用10折交叉验证,评分为准确率 scores = cross_val_score(knn, X_train_std, y_train, cv=10, scoring='accuracy') # 将当前K值对应的平均得分添加到k_scores列表中 k_scores.append(scores.mean()) # 绘制K值与交叉验证得分的关系图 plt.plot(k_range, k_scores) plt.xlabel('Value of K for KNN') # 设置X轴标签 plt.ylabel('Cross-Validated Accuracy') # 设置Y轴标签 plt.show() # 显示图形 12345678910111213141516171819
通过上面的代码,我们可以绘制出不同K值下的交叉验证准确率曲线,从而选择合适的K值。
输出结果:
六、总结与展望
通过本篇博客,我们详细介绍了KNN算法的基本原理、鸢尾花数据集的特点以及如何使用KNN算法对鸢尾花进行分类。我们展示了完整的代码示例,包括数据的加载、预处理、模型训练以及性能评估。同时,我们还讨论了K值选择的重要性,并通过交叉验证来寻找最佳的K值。
KNN算法虽然简单,但在实际应用中仍然具有很高的价值。它不需要复杂的参数估计,对于非线性问题也能取得较好的效果。然而,KNN算法也有一些局限性,比如对数据的规模和特征维度比较敏感,计算量较大等。因此,在实际应用中,我们需要根据具体问题和数据特点来选择合适的算法。
未来,我们可以进一步探索KNN算法的改进和优化方法,比如通过降维技术减少特征维度、采用更高效的数据结构来加速邻居搜索等。此外,我们还可以将KNN算法与其他机器学习算法进行结合,形成更强大的分类器。
七、拓展与应用
KNN算法的应用并不仅限于鸢尾花数据集这样的分类问题。实际上,KNN算法在各个领域都有着广泛的应用。以下是一些可能的应用场景:
文本分类:在文本分类任务中,我们可以将文本转换为向量表示(如TF-IDF或词嵌入),然后利用KNN算法进行分类。这种方法可以应用于垃圾邮件检测、新闻分类等场景。
图像识别:在图像识别领域,KNN算法可以用于图像的分类和识别。通过提取图像的特征(如颜色、纹理、形状等),我们可以将图像转换为特征向量,并利用KNN算法进行分类。
推荐系统:KNN算法也可以应用于推荐系统中。例如,在电商网站中,我们可以根据用户的购买历史和浏览行为,计算用户之间的相似度,然后利用KNN算法为用户推荐相似的商品或服务。
异常检测:KNN算法还可以用于异常检测。在数据集中,正常的数据点往往比较聚集,而异常点则相对孤立。通过计算每个数据点与其邻居之间的距离,我们可以识别出那些距离较远的异常点。
总之,KNN算法作为一种简单而有效的分类算法,具有广泛的应用前景。通过不断的研究和实践,我们可以进一步挖掘其潜力,为各个领域的问题提供更优的解决方案。
希望本篇博客能够帮助你深入理解KNN算法及其在鸢尾花数据集分类中的应用。通过举一反三,你可以将KNN算法应用于更多实际问题中,不断提升自己的机器学习能力。看完本篇博客后,相信你会受益匪浅!
相关知识
【机器学习】KNN算法实现鸢尾花分类
KNN算法实现鸢尾花数据集分类
原生python实现knn分类算法(鸢尾花数据集)
【python机器学习】KNN算法实现回归(基于鸢尾花数据集)
Knn算法实现鸢尾花分类
Python原生代码实现KNN算法(鸢尾花数据集)
【机器学习】鸢尾花分类
实验一:鸢尾花数据集分类
[机器学习基础][笔记] 一、鸢尾花分类
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
网址: 【机器学习】基于KNN算法实现鸢尾花数据集的分类 https://www.huajiangbk.com/newsview546233.html
上一篇: 必看!10款仓库管理系统(WMS |
下一篇: 【机器学习】任务二:波士顿房价的 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039