【机器学习】K近邻算法:原理、实例应用(红酒分类预测)

news2024/9/21 0:27:49

案例简介:有178个红酒样本,每一款红酒含有13项特征参数,如镁、脯氨酸含量,红酒根据这些特征参数被分成3类。要求是任意输入一组红酒的特征参数,模型需预测出该红酒属于哪一类。


1. K近邻算法介绍

1.1 算法原理

       原理:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,那么该样本也属于这个类别。简单来说就是,求两点之间的距离,看距离谁是最近的,以此来区分我们要预测的这个数据是属于哪个分类。

       我们看图来理解一下。蓝色点是属于a类型的样本点,粉色点是属于b类型的样本点。此时新来了一个点(黄色点),怎么判断是属于它是a类型还是b类型呢。

        方法是:新点找距离自身最近的k个点(k可变)。分别计算新点到其他各个点的距离,按距离从小到大排序,找出距离自身最近的k个点。统计在这k个点中,有多少点属于a类,有多少点属于b类。在这k个点中,如果属于b类的点更多,那么这个新点也属于b分类。距离计算公式也是我们熟悉的勾股定理。 

 

1.2 算法优缺点

算法优点:简单易理解、无需估计参数、无需训练。适用于几千-几万的数据量。

算法缺点:对测试样本计算时的计算量大,内存开销大,k值要不断地调整来达到最优效果。k值取太小容易受到异常点的影响,k值取太多产生过拟合,影响准确性。


2. 红酒数据集

2.1 数据集获取方式

       红酒数据集是Scikit-learn库中自带的数据集,我们只需要直接调用它,然后打乱它的顺序来进行我们自己的分类预测。首先我们导入Scikit-learn库,如果大家使用的是anaconda的话,这个库中的数据集都是提前安装好了的,我们只需要调用它即可。

找不到这个数据集的,我把红酒数据集连接放在文末了,有需要的自取。

Scikit-learn数据集获取方法:

(1)用于获取小规模数据集,数据集已在系统中安装好了的

sklearn.datasets.load_数据名()  
from sklearn import datasets
#系统中已有的波士顿房价数据集
boston = datasets.load_boston()  

(2)远程获取大规模数据集安装到本地,data_home默认是位置是/scikit_learn_data/

sklearn.datasets.fetch_数据名(data_home = 数据集下载目录)  
# 20年的新闻数据下载到
datasets.fetch_20newsgroups(data_home = './newsgroups.csv') #指定文件位置

这两种方法返回的数据是 .Bunch类型,它有如下属性:

data:特征数据二维数组;相当于x变量
target:标签数组;相当于y变量
DESCR:数据描述
feature_names:特征名。新闻数据、手写数据、回归数据没有
target_name:标签名。回归数据没有

想知道还能获取哪些数据集的同学,可去下面这个网址查看具体操作:

https://sklearn.apachecn.org/#/docs/master/47


2.2 获取红酒数据

       首先导入sklearn的本地数据集库,变量wine获取红酒数据,由于wine接收的返回值是.Bunch类型的数据,因此我用win_data接收所有特征值数据,它是178行13列的数组,每一列代表一种特征win_target用来接收所有的目标值,本数据集中的目标值为0、1、2三类红酒。如果大家想更仔细的观察这个数据集,可以通过wine.DESCR来看这个数据集的具体描述

        然后把我们需要的数据转换成DataFrame类型的数据。为了使预测更具有一般性,我们把这个数据集打乱。操作如下:

from sklearn import datasets
wine = datasets.load_wine()  # 获取葡萄酒数据
wine_data = wine.data  #获取葡萄酒的索引data数据,17813列
wine_target = wine.target  #获取分类目标值
 
# 将数据转换成DataFrame类型
wine_data = pd.DataFrame(data = wine_data)
wine_target = pd.DataFrame(data = wine_target)
 
# 将wine_target插入到第一列,并给这一列的列索引取名为'class'
wine_data.insert(0,'class',wine_target)
 
# ==1== 变量.sample(frac=1)           表示洗牌,重新排序
# ==2== 变量.reset_index(drop=True)   使index从0开始排序
 
wine = wine_data.sample(frac=1).reset_index(drop=True)  #把DataFrame的行顺序打乱

 

      我们取出最后10行数据用作后续的验证预测结果是否正确,这10组数据分出特征值(相当于x)和目标值(相当于y)。剩下的数据也分出特征值features和目标值targets,用于模型训练。剩下的数据中还要划分出训练集和测试集,下面再详述。到此,数据处理这块完成。

#取后10行,用作最后的预测结果检验。并且让index从0开始,也可以不写.reset_index(drop=True)
wine_predict = wine[-10:].reset_index(drop=True)  
# 让特征值等于去除'class'后的数据
wine_predict_feature = wine_predict.drop('class',axis=1)
# 让目标值等于'class'这一列
wine_predict_target = wine_predict['class']
 
wine = wine[:-10]  #去除后10行
features = wine.drop(columns=['class'],axis=1)  #删除class这一列,产生返回值
targets = wine['class']  #class这一列就是目标值


3. 红酒分类预测

3.1 划分测试集和训练集

一般采用75%的数据用于训练,25%用于测试,因此在数据进行预测之前,先要对数据划分。

划分方式:

使用sklearn.model_selection.train_test_split 模块进行数据分割。

x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=数据占比)

train_test_split() 括号内的参数:
x:数据集特征值(features)
y:数据集目标值(targets)
test_size: 测试数据占比,用小数表示,如0.25表示,75%训练train,25%测试test。

train_test_split() 的返回值:
x_train:训练部分特征值
x_test:    测试部分特征值
y_train:训练部分目标值
y_test:    测试部分目标值

# 划分测试集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)


3.2 数据标准化

       由于不同数据的单位不同,数据间的跨度较大,对结果影响较大,因此需要进行数据缩放,例如归一化和标准化。考虑到归一化的缺点:如果异常值较多,最大值和最小值间的差值较大,会造成很大影响。我采用数据标准化的方法,采用方差标准差,使标准化后的数据均值为0,标准差为1,使数据满足标准正态分布。

# 先标准化再预测
from sklearn.preprocessing import StandardScaler  #导入标准化缩放方法
scaler = StandardScaler()  #变量scaler接收标准化方法
# 传入特征值进行标准化
# 对训练的特征值标准化
x_train = scaler.fit_transform(x_train) 
# 对测试的特征值标准化
x_test = scaler.fit_transform(x_test)   
# 对验证结果的特征值标准化
wine_predict_feature = scaler.fit_transform(wine_predict_feature) 


 3.3 K近邻预测分类

使用sklearn实现k近邻算法
from sklearn.neighbors import KNeighborsClassifier 
KNeighborsClassifier(n_neighbors = 邻居数,algorithm = '计算最近邻居算法')
.fit(x_train,y_train)

KNeighborsClassifier() 括号内的参数:

n_neighbors:int类型,默认是5,可以自己更改。(找出离自身最近的k个点)

algorithm:用于计算最近邻居的算法。有:'ball_tree'、'kd_tree'、'auto'。默认是'auto',根据传递给fit()方法的值来决定最合适的算法,自动选择前两个方法中的一个。

from sklearn.neighbors import KNeighborsClassifier  #导入k近邻算法库
# k近邻函数
knn = KNeighborsClassifier(n_neighbors=5,algorithm='auto')
# 把训练的特征值和训练的目标值传进去
knn.fit(x_train,y_train)

        将训练所需的特征值和目标值传入.fit()方法之后,即可开始预测。首先利用.score()评分法输入用于测试的特征值和目标值,来看一下这个模型的准确率是多少,是否是满足要求,再使用.predict()方法预测所需要的目标值。

评分法:根据x_test预测结果,把结果和真实的y_test比较,计算准确率

.score(x_test, y_test)

预测方法:

.predict(用于预测的特征值)
# 评分法计算准确率
accuracy = knn.score(x_test,y_test)
# 预测,输入预测用的x值
result = knn.predict(wine_predict_feature)

       accuracy存放准确率,result存放预测结果,最终准确率为0.952,最终的分类结果和wine_predict_target存放的实际分类结果有微小偏差。


完整代码如下:
import pandas as pd
from sklearn import datasets
 
wine = datasets.load_wine()  # 获取葡萄酒数据
wine_data = wine.data  #获取葡萄酒的索引data数据,17813列
wine_target = wine.target  #获取分类目标值
 
wine_data = pd.DataFrame(data = wine_data)  #转换成DataFrame类型数据
wine_target = pd.DataFrame(data = wine_target)
# 将target插入到第一列
wine_data.insert(0,'class',wine_target)
 
# ==1== 变量.sample(frac=1)           表示洗牌,重新排序
# ==2== 变量.reset_index(drop=True)   使index从0开始排序,可以省略这一步
wine = wine_data.sample(frac=1).reset_index(drop=True)
 
# 拿10行出来作验证
wine_predict = wine[-10:].reset_index(drop=True)
wine_predict_feature = wine_predict.drop('class',axis=1)  #用于验证的特征值,输入到predict()函数中
wine_predict_target = wine_predict['class']  #目标值,用于和最终预测结果比较
 
wine = wine[:-10]  #删除后10行
features = wine.drop(columns=['class'],axis=1)  #删除class这一列,产生返回值,这个是特征值
targets = wine['class']  #class这一列就是目标值
# 相当于13个特征值对应1个目标
 
 
# 划分测试集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)
 
# 先标准化再预测
from sklearn.preprocessing import StandardScaler  #导入标准化缩放方法
scaler = StandardScaler()  #变量scaler接收标准化方法
 
# 传入特征值进行标准化
x_train = scaler.fit_transform(x_train)  #对训练的特征值标准化
x_test = scaler.fit_transform(x_test)    #对测试的特征值标准化
wine_predict_feature = scaler.fit_transform(wine_predict_feature)
 
# 使用K近邻算法分类
from sklearn.neighbors import KNeighborsClassifier  #导入k近邻算法库
# k近邻函数
knn = KNeighborsClassifier(n_neighbors=5,algorithm='auto')
 
# 训练,把训练的特征值和训练的目标值传进去
knn.fit(x_train,y_train)
# 检测模型正确率--传入测试的特征值和目标值
# 评分法,根据x_test预测结果,把结果和真实的y_test比较,计算准确率
accuracy = knn.score(x_test,y_test)
# 预测,输入预测用的x值
result = knn.predict(wine_predict_feature)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1202814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GEE学习日记】GEE下载ERA5指定小时数据

1 背景 ERA5数据集提供了逐小时的气象产品,最近做实验需要用到指定日期的14点的气象数据,所以学习了一下。 我的目的:获取2003年每月5,15,25日 14点的空气温度 2 代码 var roi table.geometry(); // table是我上传…

Facebook个人主页和公共主页的区别

Facebook个人主页和公共主页是两种不同类型的页面,它们在功能、用途和管理方面上都是存在着一些明显的区别。本文小编则对他们的区别介绍一下。 首先,个人主页是供普通用户使用的,用于展示个人信息和与朋友、家人保持联系。个人主页通常包括…

curl使用

文章目录 前言一、curl use case常见参数项包括: 二、下载操作我使用第一种方式:不验证证书,果然下载下来了。而且是下载到当前的工作文件夹。C:\Users\xxx\test.zip如果自己想指定文件地址 前言 使用 curl 工具 一、curl use case 常见参数…

编程最佳外挂:批量数据分析与可视化,CodeGeeX工具箱一键完成

ChatGLM3代模型的Code Interpreter能力,本周已经在VSCode里的CodeGeeX插件产品中,以开发者工具箱的产品形态上线。 下图以VSCode插件为例:在CodeGeeX的侧边栏,和智能问答AskCodeGeeX并列出现的工具箱标签,用户登录后就…

【第2章 Node.js基础】2.4 Node.js 全局对象(二)之,process 对象

process 对象 process对象是一个全局对象,提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例,因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的proce…

Web APIs——综合案例学生就业统计表

1、学生就业统计表 2、渲染业务 根据持久化数据渲染页面 步骤: ①:读取localstorage本地数据 如果有数据则转换为对象放到变量里面一会使用它渲染页面如果没有则用默认空数组[]为了测试效果,可以先把initData存入本地存储看效果 ②&…

图文多模态大模型综述

自去年底ChatGPT发布后,大模型技术呈井喷式发展态势,学术界和工业界几乎每天都在刷新各个方向的SOTA榜单。随着大模型技术的发展,人们逐渐意识到多模态将是大模型发展的必经之路。其中,图文多模态大模型是一种结合了图像和文本两种…

vivado时序分析-3时序分析关键概念

1、时钟相移 时钟相移对应于延迟时钟波形 , 此波形与因时钟路径内的特殊硬件所导致的参考时钟相关。在 AMD FPGA 中 , 时钟相移通常是由 MMCM 或 PLL 原语引入的 , 前提是这些原语的输出时钟属性 CLKOUT*_PHASE 为非零值。 时序分析期间…

解锁海外网红营销的潜力:关于KOC合作的7大建议

随着社交媒体的崛起,海外网红营销已成为全球各行业的主要趋势之一。传统的广告渠道逐渐被社交媒体平台和网红吸引了大量的广告投放,因此企业需要不断创新,以吸引受众并保持竞争力。其中,KOC合作是一个备受关注的策略,它…

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

文章目录 openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库121.1 连接密态数据库121.2 调用isValid方法刷新缓存示例121.3 执行密态等值查询相关的创建密钥语句121.4 执行密态等值查询相关的创建加密表的语句121.5 执行加密表的预编译SQL语…

程序员被问为什么单身的高赞回答

程序员们经常被问到为什么还单身 程序员们经常被问到为什么还单身 然后他们给出一个程序员风格的回答:“我在等待那个特殊的人,那个烧掉我的CPU,占满我的内存,并且把我的代码base都更新了的人。”#工作生活都在乎 #单身程序员的困…

MyBatis-Plus 系列

目录: 一、 Spring Boot 整合 MyBatis Plus 二、MyBatisPlus 多数据源配置 三、MybatisPlus —注解汇总 四、MyBatis Plus—CRUD 接口 五、MyBatis-Plus 条件构造器 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens …

Clickhouse 学习笔记(7)—— 查看执行计划

在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能 可以看到,并且只能真正执行 sql,在执行日志里面查看 在20.6版本之后可以通过explain语句查看执行计划 基本语法 EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [se…

构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

文章目录 一、前置条件1.创建 ubuntu 镜像源文件【sources.list】2.下载 python 安装包【Python-3.9.10.tgz】 二、构建方法1.构建目录2.创建DockerFile3.打包镜像 一、前置条件 配置一下 ubuntu 的镜像源下载 python 安装包 1.创建 ubuntu 镜像源文件【sources.list】 内容…

粉够荣获淘宝联盟区域理事会常务理事,携手共铸淘客新生态

淘宝联盟区域理事会于2021年成立,首届成立成都、广州、武汉,服务近2000个领军淘宝客企业,作为区域生态与官方交流重要枢纽,理事会举办近百场交流分享会,带动淘客跨域跨业态交流成长。 2023年9月7日第二届淘宝联盟理事…

工作十年+的测试应该具备什么能力?

大概是2014年的时候,我开始接触面试工作,就是从应聘者转为面试官,记得印象深刻的是面试了一位做了8年的测试。对方气场很足,嗯,毕竟那时的我还只是一个3、4年经验的小测试,相反,印象深刻的并不是…

PO设计模式详解(Python+selenium+unittest)

一、什么是PO设计模式(Page Object Model) 1、Page Object是一种设计模式,它主要体现在对界面交互细节的封装上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性。 2、一般PO设计模式有三层 第一层&#…

芯片设计工程师必备基本功——《设计与验证:Verilog HDL》

Verilog HDL 作为两大硬件描述语言之一,拥有很大的用户群。据调查,目前美国有 90%左右的 IC 设计人员使用 Verilog. 在中国,大概再 50% 左右的人在使用 Verilog 。 大量高校毕业生和部分软件设计人员正在不断涌入这个领域。要想尽快在 IC设计…

智能设备管理软件有什么用?如何让工厂设备维修管理更高效?

在当今这个数字化、智能化的时代,企业的生存与发展离不开高效、有序的管理。特别是在制造业中,设备报修与维修管理是关系到企业生产效益、安全和持续发展的关键环节。今天,我们就来聊聊如何通过智能化的设备管理软件,让工厂设备的…

Outlook无法显示阅读窗格

Outlook无法显示阅读窗格 故障现象 Outlook主界面不显示阅读窗格 故障截图 故障原因 阅读窗格被关闭 解决方案 1、打开Outlook - 视图 – 阅读窗格 2、选择“靠右”或者“底部”,正常显示阅读窗格