机器学习:KNN算法对鸢尾花进行分类

1.KNN算法的理解:

1.算法概述

KNN(K-NearestNeighbor)算法经常用来解决分类与回归问题, KNN算法的原理可以总结为"近朱者赤近墨者黑",通过数据之间的相似度进行分类。就是通过计算测试数据和已知数据之间的距离来进行分类。

如上图,四边形代表测试数据,原型表示已知数据,与测试数据最近的一个已知数据为红色的’whale’,所以对这个测试数据的预测值也为’whale’,这是取k值为一的情况,k表示要取最近的k个已知数据进行预测。k取大于一时则以占比较多的那类数据为预测结果,通常k值不等于一,容易产生过拟合的情况。

算法流程:

  1. 计算预测数据与训练数据的距离
  2. 选择距离最小的前K个数据
  3. 确定前K个数据的类别,及其出现频率
  4. 返回前K个数据中频率最高的类别(预测结果)

2.算法难点

KNN算法的难点在于距离计算以及k值的确定

距离计算:

测试数据与训练数据的距离计算方法有很多种,可以用如曼哈顿距离,欧式距离,余弦距离等。在KNN算法中常使用的距离计算方式是欧式距离,计算公式如下

确定k值:

K值选择问题,李航博士的一书「统计学习方法」上所说:

  1. 选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

  2. 选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。

  3. K=N(N为训练样本个数),则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。

总结:

  • K值较小,则模型复杂度较高,容易发生过拟合,学习的估计误差会增大,预测结果对近邻的实例点非常敏感。
  • K值较大可以减少学习的估计误差,但是学习的近似误差会增大,与输入实例较远的训练实例也会对预测起作用,使预测发生错误,k值增大模型的复杂度会下降。
  • 在应用中,k值一般取一个比较小的值,通常采用交叉验证法来来选取最优的K值。

2.sklearn的iris数据集介绍

Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性

iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。

四个属性:
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;

查看数据集:

from sklearn.datasets import load_irisif __name__=='__main__':#鸢尾花数据集datas = load_iris()print(datas)

sklearn的其他数据集可见:

sklearn提供的自带的数据集 - nolonely - 博客园 (cnblogs.com)

3.使用sklearn库实现KNN算法对iris数据集的分类

载入数据集并划分训练与测试集:

iris = datasets.load_iris()feature = iris['data']
target = iris['target']  x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2022)# print(x_train)  

定义k值并对比测试集的测试结果,查看准确率

knn = KNeighborsClassifier(n_neighbors=3) train = knn.fit(x_train, y_train)
#print(knn)  y_pred = knn.predict(x_test)
y_true = y_testprint('模型的分类结果:', y_pred)
print('真实的分类结果:', y_true)print(knn.score(x_test, y_test))

完整代码:

import sklearn.datasets as datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_splitiris = datasets.load_iris()feature = iris['data']
target = iris['target']  x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2022)#8:2划分数据集# print(x_train)  knn = KNeighborsClassifier(n_neighbors=3) train = knn.fit(x_train, y_train)
#print(knn)  y_pred = knn.predict(x_test)
y_true = y_testprint('模型的分类结果:', y_pred)
print('真实的分类结果:', y_true)print(knn.score(x_test, y_test))test1 = knn.predict([[6.6, 3.1, 4.7, 2.6]])#测试
print(test1)

结果

K=3:

K=20:

K=100:

在三个k值中k=20时分类效果最好

(可以使用交叉验证来求最佳的k值,参考博客:史上最全KNN_knn数据集 )

讨论:

KNN算法的优缺点:

优点:
1.理论简单,容易实现,既可以分类也可以回归;

2.精度高,对异常值不敏感,几个异常值无关大碍;

3.新数据可以直接加入数据集而不必进行重新训练。

缺点:
1.分类计算量大时,内存开销大,必须保存全部数据集,即空间复杂度高;

2.无法给出基础结构信息,无法知晓平均实例样本与典型实例样本具有什么特征,即无法给出数据的内在含义(决策树),可解释性差;

3.对于稀疏数据集束手无策,要求样本数据平衡,否则预测偏差比较大。

4.只适用于监督学习,就标签表明种类。

机器学习:KNN算法对鸢尾花进行分类相关推荐

  1. 机器学习之Python使用KNN算法对鸢尾花进行分类

    文章目录 2. 编写代码,实现对iris数据集的KNN算法分类及预测 要求: 第一步:引入所需库 第二步:划分测试集占20% 第三步:n_neighbors=5 第四步:评价模型的准确率 第五步:使用 ...

  2. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  3. 机器学习KNN算法实践:预测城市空气质量

    出品:Python数据之道 作者:叶庭云 整理:Lemon 机器学习KNN算法实践 预测城市空气质量 「Python数据之道」导读: 之前在公众号上分享过 "图解KNN算法" 的内 ...

  4. 使用KNN算法对鸢尾花种类预测

    使用KNN算法对鸢尾花种类预测 一. 数据集介绍 1.1 小数据集获取 load_* 1.2 大数据集获取 fetch_* 1.3 查看数据分布 seaborn画图的 二. 数据集的划分 三. 特征工 ...

  5. 机器学习 —— KNN算法简单入门

    机器学习 -- KNN算法简单入门 第1关:手动实现简单kNN算法 1 KNN算法简介 1.1 kNN 算法的算法流程 1.2 kNN 算法的优缺点 1.3 编程要求+参数解释 2. 代码实现 3. ...

  6. KNN算法实现鸢尾花数据集分类

    KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...

  7. 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例

    ** 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例. 具体knn算法是怎样的我这里就不再详细论述.在这里我注意总结我使用knn算法进行一个分类的分析 ** 分析过程 1.前期准备 引入 ...

  8. KNN算法解决鸢尾花分类案例

    KNN算法解决鸢尾花分类案例 本文分别通过KNN底层算法实现和sklearn中的KNeighbors Classifier(K近邻分类模拟)和对3中不同的鸢尾花的分类. 一.K近邻(KNN)算法介绍 ...

  9. Knn算法实现鸢尾花分类

    文章目录 前言 引例 KNN算法实现鸢尾花分类 1获取数据 2划分数据集 3特征工程:标准化数据 4模型训练 5模型评估 总结 前言 近朱者赤近墨者黑,物以类聚人以群分.KNN算法就是计算和别人和自己 ...

最新文章

  1. [codevs 1789] 最大获利(2006年NOI全国竞赛)
  2. python 数据分析班_Python数据分析班
  3. 某电视台晚会多机位特殊视频修复案例
  4. 微软RPA工具Power Automate Desktop
  5. C#编号的ActiveX控件采用CAB的布署方式实例
  6. mysql+tushare搭建本地数据库
  7. Linux-----diff命令
  8. 关于Python的一些学习笔记(小白式笔记,持续更新)
  9. 博客园,我的技术摇篮
  10. sql转化为int类型
  11. Java学习路线,Java SE,EE,ME的区别,SSM框架基本概念
  12. Surprise 使用本地数据
  13. 读Zepto源码之Ajax模块
  14. oppok3如何刷机_OPPO K3 PCGM00刷机教程,卡刷升级更新官方固件系统包
  15. word文档如何设置/取消首行输入空格当作缩进
  16. 数学基础篇 有理数(一)
  17. Xshell- Xftp评估过期处理方法
  18. 鸿蒙系统升级到第几批了,鸿蒙系统第四批升级名单有哪些 鸿蒙系统第四批升级机型介绍...
  19. 现在买5G手机你考虑好了吗?
  20. 揭秘:如何只用一个软件分析股市数据?

热门文章

  1. 小仙女讲InnoDB(6)——综述
  2. 3D-HEVC/HTM测试序列下载地址(官方完整版)
  3. 正确理解RR(relative risk,相对危险度),OR(odds ratio,比值比),HR(hazard ratio,风险比)等医学统计名词。包括前瞻性实验与回顾性实验概念介绍
  4. linux查看根目录所有磁盘空间,linux查看磁盘空间及处理方法
  5. mathplotlib库学习笔记
  6. python判断类型是float_验证浮点数据类型python
  7. 拼多多店铺没流量?怎么增加店铺流量?
  8. 解决:module 'xlrd' has no attribute 'open_workbook'的报错
  9. Linux内核抢占和进程调度
  10. Qt模仿VS停靠窗口(一)