机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)对葡萄酒质量进行预测

news2024/12/26 22:12:10

在这里插入图片描述

前言

系列专栏:机器学习:高级应用与实践【项目实战100+】【2024】✨︎
在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非结构化数据以及指导复杂的模型,如卷积神经网络、门控循环单元、大型语言模型和强化学习模型

我们提出了一种数据挖掘方法来预测人类的葡萄酒口味偏好,该方法基于认证步骤中易于获得的分析测试。考虑了一个大型数据集(与该领域的其他研究相比)。在同时执行变量和模型选择的计算高效程序下应用了五种回归技术。随机森林与梯度提升树取得了可喜的结果,优于多元回归和神经网络方法。这种模型有助于支持酿酒师的品酒评估和提高葡萄酒产量。此外,类似的技术可以通过对于市场的消费者口味进行建模来帮助进行目标营销。

目录

  • 1. 相关库和数据集
    • 1.1 相关库介绍
    • 1.2 数据集介绍
      • 1.2.1 加载数据
      • 1.2.2 描述统计
      • 1.2.3 数据信息
  • 2. 探索性数据分析
    • 2.1 特征分布(堆叠直方图)
    • 2.1 特征相关性(热力图)
    • 2.1 特征缩放(归一化)
  • 3. 数据建模(分类)
    • 3.1 数据准备(拆分为训练集和测试集)
    • 3.2 模型构建(KNN、GaussianNB、SVC、RF、DBDT)
  • 4. 模型评估

1. 相关库和数据集

1.1 相关库介绍

Python 库使我们能够非常轻松地处理数据并使用一行代码执行典型和复杂的任务。

  • Pandas – 该库有助于以 2D 数组格式加载数据框,并具有多种功能,可一次性执行分析任务。
  • Numpy – Numpy 数组速度非常快,可以在很短的时间内执行大型计算。
  • Matplotlib/Seaborn – 此库用于绘制可视化效果,用于展现数据之间的相互关系。
  • Sklearn – 包含多个库,这些库具有预实现的功能,用于执行从数据预处理到模型开发和评估的任务。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score

from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier

1.2 数据集介绍

我们使用互联网上免费提供的葡萄酒质量数据集。该数据集具有影响葡萄酒质量的基本特征。通过使用几个机器学习模型,我们将预测葡萄酒的质量。

FeatureExplain
fixed aciditymost acids involved with wine or fixed or nonvolatile
volatile aciditythe amount of acetic acid in wine
citric acidthe amount of citric acid in wine
residual sugarthe amount of sugar remaining after fermentation stops
chloridesthe amount of salt in the wine.
free sulfur dioxidethe amount of free sulfur dioxide in the wine(those available to react and thus exhibit both germicidal and antioxidant properties)
total sulfur dioxideamount of free and bound forms of SO2
densitythe measurement of how tightly a material is packed together
PHdescribes how acidic or basic a wine is on a scale from 0 (very acidic) to 14 (very basic); most wines are between 3-4
Alcoholthe percent alcohol content of the wine
qualityoutput variable (based on sensory data, score between 3 and 8)

1.2.1 加载数据

# Read in white wine data
# df = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv", sep =';')

# Read in red wine data
# df = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", sep =';')
df = pd.read_csv('winequality-red.csv', sep =';')

1.2.2 描述统计

.describe()生成描述性统计信息。描述性统计包括总结数据集分布的中心趋势、分散度和形状的统计,不包括NaN值。
分析数字序列和对象序列,以及混合数据类型的DataFrame列集。

# Describe `df`
df.describe().T.style.background_gradient(axis=0)

描述性统计

1.2.3 数据信息

.info()方法打印有关DataFrame的信息,包括索引dtype和列、非null值以及内存使用情况。

df.info()

数据信息

2. 探索性数据分析

EDA是一种使用视觉技术分析数据的方法。它用于发现趋势和模式,或借助统计摘要和图形表示来检查假设。现在,让我们检查数据集列中的空值数。

df.isnull().sum()

检查

2.1 特征分布(堆叠直方图)

让我们绘制堆叠直方图,直观显示数据集列中连续值的分布情况。

sns.set_theme(style="white")
long_df = df.melt(var_name='category', value_name='value')

# Initialize the figure with a logarithmic x axis
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(30, 24))
axes = axes.ravel()  # 将多维数组展平为一维数组

# 计算每行每列应该绘制的列索引
for i, ax in enumerate(axes[:len(df.columns)]):
    row, col = divmod(i, 3)
    sns.histplot(data=df, x=df.columns[i], ax=ax, hue="quality", stat='frequency', multiple='stack',palette=sns.color_palette(n_colors=6))
    ax.set_title(df.columns[i])  # 设置子图标题
    ax.set_xlabel('Value')  # 设置x轴标签
    
# 隐藏超出数据范围的子图
for ax in axes[len(df.columns):]:
    ax.axis('off')
    
plt.tight_layout()
plt.show()

堆叠直方图

2.1 特征相关性(热力图)

sns.heatmap(df.corr(), annot=True, fmt='.1f', linewidth=0.25, annot_kws={"fontsize": 8}, cmap='Purples', square=True)

特征相关性
从上面的热图中,我们可以得出结论,“总二氧化硫”和“游离二氧化硫”是高度相关的特征

sns.pairplot(df, hue='quality', corner = True, palette='Purples')

在这里插入图片描述

2.1 特征缩放(归一化)

MinMaxScaler 是 scikit-learn(一个流行的 Python 机器学习库)中的一个实用工具,用于特征缩放。它通过对每个特征进行最小-最大缩放(也称为归一化)来将特征值转换到一个指定的范围,通常是 [0, 1]。 最小-最大缩放是一种常用的特征预处理技术,特别是在使用那些基于距离的算法(如 k-最近邻、支持向量机、神经网络等)时。这是因为不同的特征可能具有不同的量纲或单位,这可能会导致某些特征在算法中占据主导地位。通过缩放,可以确保所有特征都在相同的范围内,从而避免这种情况。

MinMaxScaler 的主要功能是:

对每个特征进行缩放,使其值在 [0, 1] 范围内。 它是无参数的,这意味着它不需要估计任何参数(如均值和标准差)。 它是可逆的,意味着你可以从缩放后的数据恢复到原始数据。

# Create X from DataFrame and y as Target
X_temp = df.drop(columns='quality', axis=1)
scaler = MinMaxScaler(feature_range=(0, 1)).fit_transform(X_temp)
features = pd.DataFrame(scaler, columns=X_temp.columns)

df['best quality'] = [1 if x > 5 else 0 for x in df.quality]
target = df['best quality']

features.describe().T.style.background_gradient(axis=0, cmap='Purples')

特征缩放

3. 数据建模(分类)

3.1 数据准备(拆分为训练集和测试集)

让我们准备好用于训练的数据,并将其分为训练数据和验证数据,这样我们就能根据用例选择性能最佳的模型。我们将训练一些最先进的机器学习分类模型,然后使用验证数据从中选出最佳模型。

# Splitting the data set for training and validating 
X_train, X_val,\
	Y_train, Y_val = train_test_split(features, target,
									test_size=0.2,
									random_state=10)
X_train.shape, X_val.shape
((1279, 11), (320, 11))

3.2 模型构建(KNN、GaussianNB、SVC、RF、DBDT)

models = [KNeighborsClassifier(), GaussianNB(), SVC(kernel='rbf'),\
          GradientBoostingClassifier(), RandomForestClassifier()]

# 循环遍历每个分类器
for i in range(len(models)):
	models[i].fit(X_train, Y_train)

	print(f'{models[i]} : ')

	train_preds = models[i].predict(X_train)
	print('Training Accuracy : ', accuracy_score(Y_train, train_preds))

	val_preds = models[i].predict(X_val)
	print('Validation Accuracy : ', accuracy_score(Y_val, val_preds))
	print()

分类器

4. 模型评估

从上述精度中,我们可以说随机森林分类器在验证数据上表现更好,验证数据和训练数据之间的差异较小。让我们使用随机森林模型绘制验证数据的混淆矩阵。

models = [KNeighborsClassifier(), GaussianNB(), SVC(kernel='rbf'),\
          GradientBoostingClassifier(), RandomForestClassifier()]
    
# 循环遍历每个分类器
for i in range(len(models)):
    # 训练分类器
    models[i].fit(X_train, Y_train)
    
    # 在验证集上进行预测
    val_preds = models[i].predict(X_val)
    
    # 显示混淆矩阵
    metrics.ConfusionMatrixDisplay.from_estimator(
        models[i], X_val, Y_val, 
        cmap=sns.cubehelix_palette(dark=.20, light=.95, as_cmap=True))
    
    plt.title(f'Confusion Matrix for {models[i].__class__.__name__}')
    plt.show()
    print(f'{models[i].__class__.__name__} : ')
    print(metrics.classification_report(
    Y_val, models[i].predict(X_val)))

混淆矩阵

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

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

相关文章

《MySQL45讲》读书笔记

重建表 alter table t engine InnoDB(也就是recreate),而optimize table t 等于recreateanalyze,让表大小变小 重建表的执行流程 建立一个临时文件,扫描表 t 主键的所有数据页;用数据页中表 t 的记录生…

HTML_CSS学习:CSS盒子模型

一、CSS中常用的长度单位 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS中常用的长度单位</title><style>html{font-size: 40px;}#d1{/*第一种长度单位&…

MySQL CRUD进阶

前言&#x1f440;~ 上一章我们介绍了CRUD的一些基础操作&#xff0c;关于如何在表里进行增加记录、查询记录、修改记录以及删除记录的一些基础操作&#xff0c;今天我们学习CRUD&#xff08;增删改查&#xff09;进阶操作 如果各位对文章的内容感兴趣的话&#xff0c;请点点小…

Python设计模式 - 单例模式

定义 单例模式是一种创建型设计模式&#xff0c; 其主要目的是确保一个类只有一个实例&#xff0c; 并提供一个全局访问点来访问该实例。 结构 应用场景 资源管理&#xff1a;当需要共享某个资源时&#xff0c;例如数据库连接、线程池、日志对象等&#xff0c;可以使用单例模…

OpenCV(六) —— Android 下的人脸识别

本篇我们来介绍在 Android 下如何实现人脸识别。 上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别&#xff0c;实际上&#xff0c;在 Android 下的实现的核心原理是非常相似的&#xff0c;因为 OpenCV 部分的代码改动不大&#xff0c;绝大部分代码可以直接移植到 …

银行ETL-监管报送

1104报表 1104报表主要包括&#xff1a;资产负债&#xff0c;表外业务、流动性风险、贷款质量、投向行业和地区、重点客户等。 1104报表分类 普通报表、机构特色类报表。 反洗钱 大额交易、可疑交易。标签分类&#xff1a;疑似犯罪、疑似毒品、疑似传销。 反洗钱—接口报…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【PowerJob】从源码编译到k8s部署

前言 虽然PowerJob官方说支持JPA各种数据源&#xff0c;但在PG数据库的兼容性上&#xff0c;确实存在小问题&#xff0c;issue也有相关原理描述&#xff0c;官方采用的优雅方式并未真正解决问题&#xff0c;因为只解决了从Lob字段读取的时候&#xff0c;自动建表的时候还是会生…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

mac nvm install node<version> error 404

mac m2芯片遇到的问题&#xff0c;估计m系列的应该也有这个问题&#xff0c;在这里记录一下 解决方案&#xff1a; ## 需要先处理一下兼容就OK了arch -x86_64 zsh nvm install returns curl: (22) The requested URL returned error: 404 Issue #2667 nvm-sh/nvm GitHub

平平科技工作室-Python-猜数字游戏

一.代码展示 import random print(__猜数字游戏__) print(由平平科技工作室制作) print(游戏规则:1至10随机数随便猜) print (三次没猜对游戏结束) numrandom.randint (1,10) for i in range(3):aint(input(输入你想要猜测的数字))if a>num:print (数字猜的有点大了)elif a…

Three.js的摄像机

什么是摄像机 一般情况下&#xff0c;显示屏是二维的&#xff0c;如何把三维的场景显示到屏幕上呢&#xff1f;摄像机就是这样的一个抽象&#xff0c;它定义了三维空间到二维屏幕上的投影方式。 根据投影方法的不同&#xff0c;摄像机又分为正交投影照相机和透视投影摄像机。…

未发表!QRCNN-BiGRU-MultiAttention实现区间预测!轻松发顶刊!区间预测全家桶再更新!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 结果展示 数据介绍 原理讲解与流程 1.CN…

IOS 开发 - block 使用详解

1.Blobk的定义 block的写法相对难记,不必司机应被,只需要在xcode里打出"inlineBlock"--回车, 系统会自动帮你把基础版写法给你匹配出来 //Block的基础声明//等号""之前是blobk的声明,等号“”后面是block的实现/*returnType:返回类型(void、int、String *…

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&a…

ThreeJS:常见几何体与基础材质入门

在前文《ThreeJS:Geometry与顶点|索引|面》中&#xff0c;我们了解了与Geometry几何体相关的基础概念&#xff0c;也尝试了如何通过BufferGeometry自定义几何体。 常见Geometry几何体 ThreeJS内部也提供了诸多封装好的几何体&#xff0c;常见的Geometry几何体如下图所示&#…

Java | Leetcode Java题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(), b.length()), carry 0;for (int i 0; i < n; i) {carry i < a.length() ? (a.charAt(a.leng…

【平衡二叉树】AVL树(右单旋和左单旋的情况)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | 初阶数据结构 | Linux 文章目录 1. AVL树的定义2. C实现AVL树2.1 插入——左左型的右旋2.2 插入——右右型的左旋 3. 总结 1. AVL树的定…