机器学习:基于KNN对葡萄酒质量进行分类

news2024/12/25 9:03:54

在这里插入图片描述

机器学习:基于KNN对葡萄酒质量进行分类

作者:i阿极

作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


订阅专栏案例:机器学习
机器学习:基于逻辑回归对某银行客户违约预测分析
机器学习:学习k-近邻(KNN)模型建立、使用和评价
机器学习:基于支持向量机(SVM)进行人脸识别预测
决策树算法分析天气、周末和促销活动对销量的影响
机器学习:线性回归分析女性身高与体重之间的关系
机器学习:基于主成分分析(PCA)对数据降维
机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
机器学习:学习KMeans算法,了解模型创建、使用模型及模型评价
机器学习:基于神经网络对用户评论情感分析预测
机器学习:朴素贝叶斯模型算法原理(含实战案例)
机器学习:逻辑回归模型算法原理(附案例实战)
机器学习:基于逻辑回归对优惠券使用情况预测分析
机器学习:基于逻辑回归对超市销售活动预测分析

文章目录

  • 机器学习:基于KNN对葡萄酒质量进行分类
  • 一、实验简介
  • 二、数据说明
  • 三、实验环境
  • 四、加载数据
  • 五、定义高质量红酒
  • 六、转换数据
  • 七、划分数据集
  • 八、数据归一化
  • 九、建立KNN分类模型
  • 十、选择最优K
  • 十一、将最好的KNN分类器应用于test set上
  • 总结


一、实验简介

该数据集采集于葡萄牙北部“Vinho Verde”葡萄酒,由于隐私和物流问题,只有理化变量特征是可以进行使用的(例如,数据集中没有关于葡萄品种、葡萄酒品牌、葡萄酒销售价格等的数据)。本篇notebook使用了红葡萄酒质量的数据集,并用KNN进行分类模型的训练。

二、数据说明

文件列表
该数据集包含四个文件

  • winequality-red.csv:红葡萄酒质量数据
  • winequality-white.csv:白葡萄酒质量数据
  • white_train.csv:白葡萄酒质量训练集数据(target label: good_or_not, 即quality>5的样本都为品质好的葡萄酒)
  • white_test.csv:白葡萄酒质量测试集数据(without target label)

三、实验环境

Python 3.9

Anaconda

Jupyter Notebook

四、加载数据

加载模块

import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

加载数据

df = pd.read_csv("./input/winequality/winequality-red.csv")
df.head()

在这里插入图片描述

查看数据集行列数

print("该数据集共有 {} 行 {} 列".format(df.shape[0],df.shape[1]))

在这里插入图片描述

查看特征值和空值

df.isnull().any()

在这里插入图片描述

查看葡萄酒质量情况分布

score = df.groupby("quality").agg({"fixed acidity": lambda x: len(x)})
score = score.reset_index()
score.columns = ["quality","count"]
score

在这里插入图片描述

sns.barplot(x = 'quality', y = 'count', data = score, palette="rocket").set_title("葡萄酒质量分布")
plt.show()

在这里插入图片描述

五、定义高质量红酒

我们将评分为6分及以上的红酒定义为高质量红酒。
本研究的目的是建立KNN模型,区分“高质量红酒”与非“高质量红酒”,是一个二元分类问题。

df["GoodWine"] = df.quality.apply(lambda x: 1 if x >=6 else 0)
df["GoodWine"].head()

在这里插入图片描述

六、转换数据

SciKit-Learn接受NumPy Arrays形式的输入,因此我们把11个特征(features)和分类标签(classification label)改成NumPy Arrays的形式。


#特征
X = np.array(df[df.columns[:11]])
X

在这里插入图片描述

#分类标签
y = np.array(df.GoodWine)
y

在这里插入图片描述

七、划分数据集

我们有1599行数据,按照70%和30%将数据集分为training set和test set。

from sklearn.model_selection import train_test_split
X_train_unproc, X_test_unproc, y_train, y_test = train_test_split(X,y,test_size = 0.3)
X_train_unproc

在这里插入图片描述

八、数据归一化

因为KNN模型对数据的缩放(scaling)很敏感,我们根据training set数据进行归一化,并把同样的转换加诸于test set上。这样能够确保每个特征对KNN模型的影响力一样大。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X_train_unproc)

X_train = scaler.transform(X_train_unproc)
X_test = scaler.transform(X_test_unproc)

X_train

九、建立KNN分类模型

KNN算法主要考虑三个重要要素:

  • K值的选择
  • 距离度量的方式
  • 分类决策规则

在这里,我们先给k值选择一个较小的值,然后通过交叉验证选择一个合适k值。

假定k = 3,建立一个KNN分类器,并查看其准确率。

from sklearn.neighbors import KNeighborsClassifier

#初始化
k = 3
clf = KNeighborsClassifier(k)

#使用training set训练模型
clf.fit(X_train, y_train)

在这里插入图片描述

# training set正确率
print("训练集正确率:{}%".format(round(clf.score(X_train, y_train)*100,2)))

在这里插入图片描述
交叉验证

# cross validation正确率
from sklearn import model_selection as cv
scores = cv.cross_val_score(clf, X_train, y_train, cv = 5)
score = scores.mean()
print("交叉验证正确率:{}%".format(round(score*100, 2)))

在这里插入图片描述

十、选择最优K

我们使用交叉验证(cross validation)选择最好的k,使得KNN分类器在未来的数据上有最好的表现。
这里我们尝试了k = 1,2,3,…100。

# selecting the best k
ks = range(1,100)
inSampleScores = []
crossValidationScores = []
d = {} #key = k, value = cv accuracy rate

for k in ks:
    clf = KNeighborsClassifier(k).fit(X_train, y_train)
    inSampleScores.append(clf.score(X_train, y_train))
    scores = cv.cross_val_score(clf, X_train, y_train, cv = 5)
    crossValidationScores.append(scores.mean())
    d[k] = scores.mean()
# 画图
import matplotlib.pyplot as plt

p1 = plt.plot(ks, inSampleScores)
p2 = plt.plot(ks, crossValidationScores)
plt.legend(["train正确率", "cv正确率"])
plt.show()

在这里插入图片描述

# 选择最好的k
best_k = sorted(d.items(), key = lambda x:x[1], reverse = True)[0][0]
print("最优的k值:{}".format(best_k))

在这里插入图片描述

十一、将最好的KNN分类器应用于test set上

#建模
clf = KNeighborsClassifier(best_k).fit(X_train, y_train)

#预测
y_test_pred = clf.predict(X_test)

#正确率
print("测试集正确率:{}%".format(round(clf.score(X_test, y_test)*100, 2)))

在这里插入图片描述

混淆矩阵

# 混淆矩阵 (confusion matrix)
from sklearn.metrics import confusion_matrix
cnf_matrix = confusion_matrix(y_test, y_test_pred)

class_names = [0,1]
plot_confusion_matrix(cnf_matrix , classes=class_names, title='Confusion matrix')
plt.show()

在这里插入图片描述

评估报告

from sklearn.metrics import classification_report
print(classification_report(y_test, y_test_pred))

在这里插入图片描述


总结

可以从以下几个方面来探索葡萄酒质量数据:

  • 葡萄酒质量的分布情况如何?
  • 如何根据现有数据预测新的葡萄酒的质量?
  • 是否所有理化特征都与葡萄酒的质量相关?

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

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

相关文章

网盘工具助力律师团队文件管理

律师的日常工作离不开文件管理。文档管理对于律师而言是一门必修课,这也是日积月累的工作。良好的文件管理习惯可以帮助我们让工作流程化、标准化,助力知识管理,避免职业风险,提升团队工作效率。 好用的文件管理工具也可以帮助律师…

Python 实验三 控制语句

1.从键盘接收整数的一百分制成绩(0到100),要求输出其对应的成绩等级A-E。其中,90分(包含)以上为A,80-89(均包含)分为B,70-79(均包含)分为C,60-69&…

[网络安全] Windows Server 设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件

我在负责网站运维期间,遇到过一次黑客利用网站内使用的开源文件上传工具漏洞上传非法文件(可执行脚本) 我是通过设置文件屏蔽来防止此类事件的再次发生。特在此做下记录。 文章目录前言一、黑客是怎么攻击我的二、我是怎么防范的2.1 Windows …

我学习网络安全的心得

我的学习心得,我认为能不能自学成功的要素有两点。 第一点就是自身的问题,虽然想要转行学习安全的人很多,但是非常强烈的想要转行学好的人是小部分。而大部分人只是抱着试试的心态来学习安全,这是完全不可能的。 所以能不能学成并…

Matplotlib 二维图像绘制方法

Matplotlib 二维图像绘制方法 介绍 Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。本次实验课程中,我们将学会使用 Matplotlib 绘图的方法和技巧。…

GitHub的简介与Idea集成Git

六大基础功能 : 创建远程库、代码推送(Push)、代码拉取(Pull)、代码克隆(Clone)、SSH免密登录、Idea集成GitHub GitHub 网址:https://github.com/ 1.创建远程仓库 登录后的页面右上…

亚马逊云科技帮助BMW Financial Services设计和构建数据架构

BMW Group和亚马逊云科技于2020年宣布达成全面战略合作。在re:Invent2019上,BMW和亚马逊云科技展示了新的云数据中心平台,先是大致介绍了不同的数据平台原型,然后介绍了构建BMW Group云数据中心的过程。Amazon Data Lab使用亚马逊云科技的云数…

Volatile关键字的作用探究

前言 今天下午BOSS上投了个简历小试了一波水,结果被问到一个知识点volatile关键字的作用,我回答了线程的可见性,另一个死活想不起来是什么,当回到工位上看了眼笔记,才想起来。这种知识点其实平时使用的频率还是挺高的…

Phaser笔记-scene中的preload、create、update、player、键盘控制

一般phaser最简单的配置文件如下: let config {type: Phaser.AUTO,width: 800,height:600,scene: {preload: preload,create: create,update: update},physics:{default: arcade,arcade: {gravity: { y: 300},debug: false}}};其中scene有3个函数:prel…

CI570 3BSE001440R1适用于数字功能需求较多的设计

CI570 3BSE001440R1适用于数字功能需求较多的设计 尽管纯硅的CMOS 制程被认为仅适用于数字功能需求较多的设计,而不适用于以模拟电路为主的射频IC 设计,不过历经十几年的努力后,随着CMOS 性能的提升、晶圆代工厂在0.25mm 以下制程技术的配合、…

解决 Docker + selenium + chromedriver + chrome 会出现僵尸进程的问题

一、僵尸进程问题 在docker里,使用selenium爬虫, webdriver quit后,会产生很多僵尸进程。docker run -it -v /home/blackip:/home/blackips/ selenium:1.0python3 linux_black_ip.pytop查看僵尸进程:ps -ef | grep defunct查看…

微服务+springcloud+springcloud alibaba学习笔记【Ribbon的使用】(4/9)

Ribbon的使用 4/91、Ribbon负载均衡1.1 Ribbon简介1.2 Ribbon功能1.3 使用Ribbon:1.3.1 Ribbon常用负载均衡算法1.3.2 使用Ribbon1.3.3 ribbon的轮询算法原理1.3.4 手写一个负载均衡轮询算法1.3.5 启动服务,测试1、Ribbon负载均衡 1.1 Ribbon简介 Spring Cloud Ribbon是基于N…

Nestjs实战干货-概况-管道-Pipes

管道 带上装饰器 Injectable() 并实现了 PipeTransform 接口的类,就是管道。 管道有 2 个典型的应用场景: 数值转换:将输入的参数转换成目标类型,例如,string to number。 数值校验:对输入的参数进行校验…

记一次 MySQL 主从同步异常的排查记录,百转千回

本文主要内容如下: 一、现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的数据更改。 备库报错如下: 完整的错误信息: Relay log read failure: Could not parse relay log even…

一文读懂【Git 工作流】

文章目录一、Git分支管理二、Git日志规范三、Git Flow工作流一、Git分支管理 我们在实际工作中会创建很多分支以便于不同场景下的开发,但是如果没有分支规范就会造成分支杂乱,大家往往也搞不清楚某一个分支是在做什么,下面我们就介绍一下我们…

车企围攻整车OS,这张“新王牌”怎么打?

今年2月23日,梅赛德斯--奔驰发布了打造自有操作系统MB.OS的具体计划,该操作系统将在本年代中期随全新梅赛德斯-奔驰模块化架构(MMA)平台推出,预计2025年用户将能体验到它的强大功能。 据悉,基于覆盖芯片到…

YOLOv8运行参数解读

整理来自yolov8官方文档常用的一些命令行参数,官方文档YOLOv8 Docs yolov8命令行的统一运行格式为: yolo TASK MODE ARGS其中主要是三部分传参: TASK(可选) 是[detect、segment、classification]中的一个。如果没有显式传递,YO…

智慧水务软件-科学系统架构-数字化管理

平台概述 柳林智慧水务软件是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心,以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为支撑,以城市水资源、水生态、水环境…

VGG论文翻译及复现

VGG网络实现:https://blog.csdn.net/weixin_43912621/article/details/127852595 论文地址:https://arxiv.org/abs/1409.1556 VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 用于大规模图像识别的深度卷积网络 Abstract In t…

Salesforce Admin管理员中文学习教程,如何高效筛选出具有Admin权限的用户!

组织中最常见的错误之一就是拥有太多具有系统管理员简档的用户。不幸的是,这在某些行业中非常普遍。 实际上这存在着很大的潜在风险。拥有这些权限的用户可能会暴露、窃取或删除组织中的数据,甚至影响到其他用户。防止过多的管理员访问权限是保护Salesf…