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

案例简介:有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 datasetswine = 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.mzph.cn/news/141327.shtml

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

相关文章

JavaScript从入门到精通系列第三十六篇:详解JavaScript中的事件监听和事件响应

文章目录 一:什么叫事件 1:概念 2:处理这个事件 (一):鼠标单机按钮 (二):鼠标双机按钮 (三):鼠标移动 3:写法弊端 4:Dom Event 二:监听事件 1:元素事…

域名反查Api接口——让您轻松查询域名相关信息

在互联网发展的今天,域名作为网站的唯一标识符,已经成为了企业和个人网络营销中不可或缺的一部分。为了方便用户查询所需的域名信息,API接口应运而生。本文将介绍如何使用挖数据平台《域名反查Api接口——让您轻松查询域名相关信息》进行域名…

c 实用化的摄像头生成avi视频程序(加入精确的时间控制)

I时间控制是指:生成了n张图片帧用了多少时间m。帧率等于n/m。对应于头文件,m等于scale, n等于rate.为了精确,采用微秒计时。 I此程序生成的视频远好于ffmpeg,可能是此程序没有压缩数据原因吧。 现在的帧率不高,是因…

Java之“数字困境”:资产管理项目中的Bug追踪与启示

目录 1 前言2 问题的发现3 调试的开始4 深入调试5 调试心得与反思6 结语 1 前言 在程序员的日常工作中,我们时常面对各种令人头疼的问题,其中最令人崩溃的瞬间之一,就是当我们花费大量时间追踪一个看似复杂的bug,最终发现问题的根…

C# PDF转HTML字符串

需要nuget安装Aspose.PDF插件,本文使用23.10.0版本 一、获取PDF文件,保存到某个路径;再读取返回字符串。 //html文件保存路径 string filePath dirPath "xxx.html"; if (!File.Exists(filePath)) {//获取pdf文件流Byte[] pdfBy…

windows安装composer并更换国内镜像

第一步、官网下载 下载地址 Composer安装https://getcomposer.org/Composer-Setup.exe第二步、双击安装即可 第三步选择 php安装路径并配置path 第四步、 composer -v查看安装是否成功,出现成功界面 第五步、查看镜像地址并更换(composer国内可能较慢…

达梦数据库安装

一、官网参考文档 达梦数据库官网:https://www.dameng.com/ ,参考文档如下: 最后的文档地址为:Docker安装 | 达梦技术文档 二、dcoker安装 docker基本按照官网来就行,点击相应的链接下载镜像包。 复制到linux中&#x…

Linux命令——ssh

Linux命令——ssh 背景 SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。 历史上,网络主机之间的通信是不加密的,属于明文通信。这使得通信很不安全&a…

万界星空科技智能管理系统低代码平台

低代码平台正成为企业数字化基础设施的重要一环,越来越多的企业为了可持续的数字化建设,开始启用低代码平台,其选型除了平台易用性、应用搭建能力外,也关注与第三方平台的集成性,及厂商对行业knowhow的积累、品牌口碑及…

LeetCode(9)跳跃游戏【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 55. 跳跃游戏 1.题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回…

解决服务器中的mysql连接不上Navicat的问题脚本

shell标本,快速解决服务器中的mysql连接不上Navicat的问题 在Linux服务器开发中,mysql的配置文件一般是只允许本地连接 所以想用Navicat进行连接,就需要修改配置和mysql中用户访问表的权限 为了方便,写成了shell脚本 #!/bin/bas…

飞天使-django概念之urls

urls 容易搞混的概念,域名,主机名,路由 网站模块多主机应用 不同模块解析不同的服务器ip地址 网页模块多路径应用 urlpatterns [ path(‘admin/’, admin.site.urls), path(‘’, app01views.index), path(‘movie/’, app01views.movi…

ffmpeg命令行处理视频,学习记录

ffmpeg命令行处理视频 截取视频前5s ffmpeg -ss 00:00:00 -t 00:00:05 -i .\public\uploads\20231109\116a292eccf8315f65d7166e794d1730.mp4 .\public\uploads\20231109\116a292eccf8315f65d7166e794d1731.mp4两视频合并为1个 ffmpeg -i F:\xuejiao\code\cms.openlai.com\p…

5 新的关键字

动态内存分配 回想C语言中,动态内存是怎么分配的?通过C库里面的malloc free去进行动态内存分配。 C通过new关键字进行动态内存申请,动态内存申请是基于类型进行的。 delete 关键字用于内存释放。 //变量申请 type* pointer new type; dele…

友元的三种实现

友元的三种实现 全局函数做友元类做友元成员函数做友元 #include <iostream> #include <string> using namespace std;//友元的三种实现 // //* 全局函数做友元 //* 类做友元 //* 成员函数做友元class Building {//告诉编译器 goodGay全局函数 是 Building类的好…

[Socket]Unix socket 运行权限问题

Unix socket 运行权限问题 hongxi.zhu 2023-11-13 问题&#xff1a;socket只能在当前源码目录运行&#xff0c;换个路径或者换个机子运行&#xff0c;如果是服务端&#xff0c;启动则会出现无法bind, 客户端则会出现无法connect 原因&#xff1a;unix socket是基于文件的fd方式…

Mistral 7B 比Llama 2更好的开源大模型 (一)

Mistral 7B 简介 Mistral 7B Mistral 7B 是一个 7.3B 参数模型: 在所有基准测试中优于 Llama 2 13B在许多基准测试中优于 Llama 1 34B接近 CodeLlama 7B 的代码性能,同时保持擅长英语任务使用分组查询注意力 (GQA) 加快推理速度使用滑动窗口注意力 (SWA) 以更低的成本处…

K8S集群etcd 某个节点数据不一致如何修复 —— 筑梦之路

背景说明 二进制方式安装的k8s集群&#xff0c;etcd集群有3个节点&#xff0c;某天有一台机器hang住了&#xff0c;无法远程ssh登陆&#xff0c;于是被管理员直接重启了&#xff0c;重启后发现k8s集群删除一个deployment应用&#xff0c;多次刷新一会有&#xff0c;一会没有&am…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志&#xff1a; Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…

DefaultListableBeanFactory

DefaultListableBeanFactory 是一个完整的、功能成熟的 IoC 容器&#xff0c;如果你的需求很简单&#xff0c;甚至可以直接使用 DefaultListableBeanFactory&#xff0c;如果你的需求比较复杂&#xff0c;那么通过扩展 DefaultListableBeanFactory 的功能也可以达到&#xff0c…