葡萄酒质量预测

news2024/11/8 3:03:39

本文中所有代码及数据均存放于:https://github.com/MADMAX110/WineQualityPrediction
本文根据酸度、残糖和酒精浓度等特征训练和调整一个随机的葡萄酒质量森林模型。
一、设置环境,确认你的电脑安装了以下环境

  • Python 3+
  • NumPy
  • Pandas
  • Scikit-Learn (a.k.a. sklearn)
    强烈推荐使用Anaconda安装Python,它已经安装了以上所有的包。

二、导入库和包

#导入numpy,可以提供更高效的数值计算
import numpy as np
#导入pandas,支持数据帧的便捷库
import pandas as pd
#导入modelselection模块中的train_test_split函数,包含许多实用程序
from sklearn.model_selection import train_test_split
#导入整个预处理模块,包含用于缩放、转换和整理数据的实用程序
from sklearn import preprocessing
#导入随机森林模型,这段代码中只专注于训练随机森林并调整其参数。
from sklearn.ensemble import RandomForestRegressor
#导入工具以执行交叉验证
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
#导入一些指标,以便稍后用于评估模型性能
from sklearn.metrics import mean_squared_error, r2_score
#导入一种保留模型以供将来使用的方法
import joblib

三、加载红酒数据
pandas库有一整套有用的导入/输出工具,这里将使用read_csv函数加载。

#加载数据
dataset_url = 'winequality/winequality-red.csv'
data = pd.read_csv(dataset_url)
#查看数据的前五行
print( data.head() )

在这里插入图片描述
看起来CSV文件实际使用分号来分隔数据,可以使用

data = pd.read_csv(dataset_url, sep=';')
print(data.head())

在这里插入图片描述
现在看起来就好多了,还可以查看以下数据的大小及汇总统计数据

print(data.shape)
print( data.describe() )

在这里插入图片描述
看起来该样本中有1599个样本和12个特征,所有特征都是数字,稍后再进行标准化

四、将数据拆分为训练集和测试集
在建模工作流开始时将数据拆分为训练集和测试集对于实际估计模型的性能至关重要。首先需要将目标y特征和输入x特征分开。

#将quality列为标签,赋值给y
y = data.quality
#删除data数据框中的quality列,剩余部分作为特征,赋值给X
X = data.drop('quality', axis = 1)

axis=0表示沿着横向维度,也就是对行进行操作
axis=1表示沿着纵向维度,也就是对列进行操作

#使用sklearn中的train_test_split函数将X和y划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=123, 
                                                    stratify=y)

train_test_split函数的参数含义:

  • X和y:所要划分的数据和标签
  • test_size=0.2:测试集占总数据的20%
  • random_state=123:随机数种子,用于随机采样,确保每次运行得到同样的划分结果
  • stratify=y:分层采样,确保训练集和测试集中的类别比例与原始数据一致,如果不使用这个,可能会导致训练集和测试集中的类别比例可能会差异较大,这会影响后续的模型评估。

执行后,我们得到:

  • X_train和X_test:训练集特征和测试集特征
  • y_train和y_test:训练集标签和测试集标签

这种训练集和测试集的划分是机器学习中非常重要的一步,关系到模型的泛化能力与最终性能。我们通常会将大约20%的数据作为测试集,其余作为训练集。

五、数据预处理
标准化是机器学习中一个很重要的预处理步骤。它的作用是将特征值转换到相同的量纲范围内,通常是0到1范围内,或-1到1范围内。
标准化的主要目的有:

  • 消除量纲影响:不同特征可能具有不同的量纲和范围,这会影响模型的训练和系数的学习。标准化可以消除这种量纲影响,让模型公平地考虑各个特征。
  • 提高优化效果:许多优化算法会更快地收敛当输入的特征位于相近范围时。标准化可以加速模型的训练过程。
  • 避免特征过大影响模型:某个特征的取值范围很大,会主导模型的学习,从而影响模型的泛化能力。标准化可以使各特征对模型的重要性更加平衡。

常见的标准化方法有:

  • 最小-最大标准化:新值 = (旧值 - 最小值) / (最大值 - 最小值)
  • Z-score标准化:新值 = (旧值 - 均值) / 标准差
  • 小数定标标准化:新值 = 旧值 / 平均值

标准化一般在模型训练前进行,并且只在训练数据上计算标准化所需的统计量,然后使用这些统计量将测试集也标准化,以保证训练和测试数据具有相同的分布。
标准化是机器学习中一个简单但非常重要的步骤。正确地标准化可以让我们的模型训练更加高效稳定,并在一定程度上提高模型的泛化能力与效果。理解各种标准化方法背后的原理和作用,可以让我们在不同场景下选用最佳方案。
sklearn使数据预处理变得轻而易举。

下面是一些我们不会使用地代码
简单地扩展数据集非常容易:

#使用preprocessing.scale()对训练集特征X_train进行标准化,结果存储在X_train_scaled中。
X_train_scaled = preprocessing.scale(X_train)
print( X_train_scaled )

在这里插入图片描述
scale()函数实现的是Z-score标准化,公式为:
新值 = (原值 - 均值) / 标准差
下面可以确认缩放数据集确实以0为中心,单位方差:

#取消Numpy的科学计数法显示,打印完整精度。
np.set_printoptions(suppress=True)
#打印X_train_scaled的各特征均值
print( X_train_scaled.mean(axis=0) )
#打印X_train_scaled的各特征标准差
print( X_train_scaled.std(axis=0) )

在这里插入图片描述
以上代码我们并不会使用,原因是我们无法在测试集上执行完全相同的转换。

下面是将要使用的预处理代码:
我们将使用sklearn中称为Transformer API的功能,而不是直接调用scale函数。Transformer API 允许您使用训练数据“拟合”预处理步骤,就像拟合模型一样.,然后在未来的数据集上使用相同的转换!
该过程如下所示:
1、在训练集上设置transformer(保存均值和标准偏差)
2、在训练集上使用transformer(缩放训练数据)
3、在测试集上使用transformer(使用相同的均值和标准偏差)
这使得模型性能的最终估计更加真实,并允许将预处理步骤插入到交叉验证管道中。

#在训练数据X_train上拟合StandardScaler()
scaler = preprocessing.StandardScaler().fit(X_train)
#使用上一条语句中的参数将X_train进行标准化
X_train_scaled = scaler.transform(X_train)
print X_train_scaled.mean(axis=0)
# [ 0. -0. -0. -0.  0. -0. -0. -0. -0. -0. -0.]
print X_train_scaled.std(axis=0)
# [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

现在scaler对象为训练集中的每个特征都保存了均值和标准差
然后使用对测试集使用相同的转换方法

X_test_scaled = scaler.transform(X_test)
print (X_test_scaled.mean(axis=0))
print (X_test_scaled.std(axis=0))

在这里插入图片描述
这里的单位方差并没有完全以0为中心!这就是我们期望的,因为我们使用训练集的方法而不是测试集本身来转换测试集。

接着使用make_pipeline()构建一个机器学习流程(pipeline),

#构建一个机器学习流程(pipeline)
pipeline = make_pipeline(preprocessing.StandardScaler(),
                         RandomForestRegressor(n_estimators=100,
                                               random_state=123))

该学习流程包括两个步骤

  1. preprocessing.StandardScaler(): Z-score标准化
  2. RandomForestRegressor(): 随机森林回归模型

pipeline会按顺序执行这两个步骤:

  1. 首先使用StandardScaler对数据进行标准化
  2. 然后使用随机森林模型对标准化后的数据进行回归训练和预测

make_pipeline()的作用是将多个数据处理与模型步骤组合成一个流程,方便我们对整体流程进行训练、预测和调参。

六、声明要调优的超参数
通常我们需要考虑两种类型的参数:模型参数和超参数。模型参数可以直接从数据中学习(回归系数),而超参数不能。超参数一般表示有关模型的更高级别结构信息,通常在训练模型之前设置。
以随机森林举例,在每个决策树中,计算机可以根据均方误差MSE或均值绝对误差MAE凭经验决定在哪里创建分支,这里的实际分支位置就是模型参数
但是该算法不知道应该使用MSE或MAE中的哪一个,也无法决定森林中包含多少棵树,这些是用户必须设置的超参数
可以通过以下函数列出可调超参数:

print( pipeline.get_params() )
# ...
# 'randomforestregressor__criterion': 'squared_error',
# 'randomforestregressor__max_depth': None,
# 'randomforestregressor__max_features': 'auto',
# 'randomforestregressor__max_leaf_nodes': None,
# ...

声明超参数,格式是Python字典,其中键是超参数名称,值是要尝试的设置列表。

hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],
                  'randomforestregressor__max_depth': [None, 5, 3, 1]}

七、使用交叉验证管道优化模型
交叉验证(cross-validation)是所有机器学习中最重要的技能之一,它可以最大限度地提高模型性能,同时减少过度拟合地机会。
交叉验证是通过使用相同的方法多次训练和评估模型来可靠地估计构建模型的方法的性能的过程,以下是CV的步骤
1、将数据拆分为 k份 相等的部分(通常 k=10)。
2、在 前k-1个部分 (例如前 9 个部分)上训练模型。
3、在剩余的“保留”部分(例如第 10 个部分)上对其进行评估。
4、执行步骤(2)和(3)k次,每次保持不同的部分。
5、汇总所有 k 份的性能。这是就是性能指标。
请添加图片描述
它的基本思想是:将数据集划分为训练集和验证集,在训练集上训练模型,在验证集上评估模型性能,并通过多次试验减少评估的方差,获得更加可靠的评估结果。
交叉验证管道指的是将交叉验证整合到机器学习流程中的一种方法。
它的基本思想是:

  1. 在机器学习流程的各个步骤(数据清理、特征工程、模型选择等)中都采用交叉验证进行评估
  2. 重复以上步骤,获得多轮交叉验证的结果
  3. 综合多轮交叉验证的结果,得出最终的评估结论

交叉验证管道的目的在于:更全面和真实地评估整个机器学习流程的效果,而不仅仅是评估某一个模型算法的效果。一个典型的交叉验证管道可以包含:

  1. 对不同的数据清理和特征选取方案进行评估,选择效果最佳的方案
  2. 在选取的特征上,对不同的机器学习模型进行评估,选择最优模型
  3. 通过多次重复步骤1和2,评估数据清理、特征工程和模型选择的稳定性,得出最终的方案
  4. 使用最终确定的方案在全部数据集上重新训练模型,并在独立的测试集上测试最终的效果
    交叉验证管道为我们提供了一种更加全面评估完整机器学习流程的手段。它考虑到机器学习效果的不确定性,通过多轮试验和效果的汇总统计,能让我们的结论更加可靠。
    可以使用sklearn方便地实现这一点:
#GridSearch本质上就是对超参数的所有可能的排列执行交叉验证
clf = GridSearchCV(pipeline, hyperparameters, cv=10)
#拟合和调整模型
clf.fit(X_train, y_train)
#输出最佳参数集
print( clf.best_params_ )

八、在整个训练集上重新拟合
使用交叉验证适当地调整超参数后,通常可以通过在整个训练集上重新拟合模型来获得较小的性能改进。
方便的是,来自sklearn的GridSearchCV将使用整个训练集自动使用最佳超参数集重新调整模型。此功能默认处于打开状态,但可以确认一下

Python
print( clf.refit )
# True

九、根据测试数据评估模型管道

#使用训练好的分类模型clf对测试集X_test进行预测,结果存储在y_pred中。
y_pred = clf.predict(X_test)
#将真实标签y_test和预测结果y_pred输入r2_score函数,计算R squared(R方)值,并打印结果。
print( r2_score(y_test, y_pred) )
# 0.4712595193413647
#将真实标签y_test和预测结果y_pred输入mean_squared_error函数,计算均方误差(MSE),并打印结果。
print( mean_squared_error(y_test, y_pred) )
# 0.34118218749999996
  • R方值越高,表示预测结果与真实值的相关性越高,模型效果越好。R方为1表示完全相关,0表示不相关。
  • MSE值越低,表示预测误差越小,模型效果越好。

十、保存模型以便将来使用
Joblib是一个Python库,提供了简单易用的序列化与持久化方案。

#将训练好的模型clf序列化后保存到文件rf_regressor.pkl中
joblib.dump(clf, 'rf_regressor.pkl')
#从文件rf_regressor.pkl中加载序列化后的模型,并赋值给clf2。
clf2 = joblib.load('rf_regressor.pkl')
 #用现成的模型预测数据
clf2.predict(X_test)

通过这三行代码,我们实现了模型的持久化存储与加载。
序列化后的模型文件rf_regressor.pkl中包含模型的各个参数与配置信息。当我们需要使用该模型对新数据进行预测时,只需要从文件加载模型即可,而不需要重新训练。
这在实际工作中有几个主要的应用:

  1. 模型部署:我们可以训练好模型,序列化并发布,用户只需要加载模型文件即可使用,无需训练模型。
  2. 避免重复训练:如果模型训练成本较高,我们可以周期性训练并序列化最新的模型,在需要预测时直接加载最新模型,避免重复训练。
  3. 模型备份:序列化模型可以长期保存,避免训练好的模型丢失,有备份可以随时加载使用。

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

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

相关文章

Ubuntu 18.04 交叉编译Opencv-4.6.0

环境 操作系统:Ubuntu 18.04 OpenCv版本:4.6.0 交叉工具链:arm-linux-gnueabihf-gcc-5.3.1 下载OpenCV源代码 这里推荐大家到网上找OpenCV的Linux版本安装包(.tar.gz结尾),不要github上clone&#xff08…

leetcode688. 骑士在棋盘上的概率(java)

骑士在棋盘上的概率 leetcode688. 骑士在棋盘上的概率题目描述 解题思路代码演示动态规划专题 leetcode688. 骑士在棋盘上的概率 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/knight-probability-in-chessboard 题目描…

【源码篇】基于ssm+vue+微信小程序的医疗科普小程序

系统介绍 这是一个ssmvue微信小程序的医疗科普小程序,分为pc端和微信小程序端 pc端包括:管理员角色和学生角色。 管理员拥有:学生管理、科普知识管理、论坛管理、收藏管理、试卷管理、留言板管理、试题管理、系统管理、考试管理 学生端拥…

AI实战营第二期 第五节 《目标检测与MMDetection》——笔记6

文章目录 摘要主要特性 常用概念框、边界框交并比 (loU)感受野有效感受野置信度 目标检测的基本思路难点滑框在特征图进行密集计算边界框回归基于锚框VS无锚框NMS(非极大值抑制)使周密集预测模型进行推理步骤如何训练密集预测模型的训练匹配的基本思路密…

C++ 教程(01)

C 教程 C 是一种高级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。 本教程通过…

节省90%编译时间,这是字节跳动开源的基于Rust的前端构建工具

Rspack 是一个基于 Rust 的高性能构建引擎,它可以与 Webpack 生态系统交互,并提供更好的构建性能。 在处理具有复杂构建配置的巨石应用时,Rspack 可以提供 5~10 倍的编译性能提升。 字节跳动将 Rspack 开源后,它在 GitHub 上已有 …

Bert+FGSM/PGD实现中文文本分类(Loss=0.5L1+0.5L2)

任务目标:在使用FGSM/PGD来训练Bert模型进行文本分类,其实现原理可以简单概括为以下几个步骤: 对原始文本每个词转换为对应的嵌入向量。将每个嵌入向量与一个小的扰动向量相加,从而生成对抗样本。这个扰动向量的大小可以通过一个超…

2023年牛客网最新版大厂Java八股文面试题总结(覆盖所有面试题考点)

程序员真的是需要将终生学习贯彻到底的职业,一旦停止学习,离被淘汰,也就不远了。 金九银十跳槽季,这是一个千年不变的话题,每到这个时候,很多人都会临阵磨枪,相信不快也光。于是,大…

多业务线下,IT企业如何应对市场经济下行危机?

多业务线下,IT企业如何应对市场经济下行危机? 市场经济下行就像是一辆行驶的车子遇到了坡道,速度开始变慢甚至停下来。在这个情况下,经济的增长变得较为缓慢,消费减少,投资减少,也对企业会带来…

运筹说 第25期 | 对偶理论经典例题讲解

对偶理论是研究线性规划中原始问题与对偶问题之间关系的理论,主要研究经济学中的相互确定关系,涉及到经济学的诸多方面。产出与成本的对偶、效用与支出的对偶,是经济学中典型的对偶关系。 对偶理论中最有力的武器是影子价格,影子…

【MySQL】主从复制部署

文章目录 概述SQL数据库的三大范式 主从复制技术产生原因主从形式原理图主节点 binary log dump 线程从节点I/O线程作用从节点SQL线程作用 复制过程复制模式异步模式(mysql async-mode)半同步模式(mysql semi-sync)全同步模式 复制机制binlog记录模式GTI…

android frida检测绕过

Frida检测是一种常见的安卓逆向技术,常用于防止应用程序被反向工程。如果您遇到了Frida检测,您可以尝试以下方法来绕过它: 使用Magisk Hide模块:Magisk是一个强大的安卓root工具,它附带了一个Magisk Hide模块&#xff…

二阳大规模来袭,热图地图分析新冠疫情期间的高发地点,掌握防控重点!

一、概述 最近,新冠疫情似乎又要“卷土重来”... 身边逐渐有人传来“二阳”或者“三羊”的消息,网上相关的讨论和报道也变得越来越多。 据「钟南山院士」在大湾区科学论坛上的发言,预测模型seirs显示,第二波新冠疫情已于4月中旬开…

当数据汇聚成海,Excel 表成为我们的航海图,如何在茫茫数据中找到目标?——Excel 表中某个范围内的单元格遍历思路

本篇博客会讲解力扣“2194. Excel 表中某个范围内的单元格”的解题思路,这是题目链接。 先来审题: 以下是输出示例和提示: 这道题的解题思路是:模拟,遍历每一列,某一列遍历完后遍历下一列。 下面我们需…

爆肝整理,性能测试-全链路压测与普通压测区别总结,进阶高级测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 抛出一个问题&…

Shell脚本:expect脚本免交互

Shell脚本:expect脚本免交互 expect脚本免交互 一、免交互基本概述:1.交互与免交互的区别:2.格式:3.通过read实现免交互:4.通过cat实现查看和重定向:5.变量替换: 二、expect安装:1.…

Docker Registry部署

之前执行 docker pull的命令都是从 docker hub上拉取的,是docker 公共仓库,如果在公司中使用docker,我们不可能把自己的镜像上传到公共仓库,这个时候就需要一个自己的仓库(私有仓库),在局域网之…

usb 驱动

usb 驱动 usb 的基本概念 这个忽略, 基本上usb 是啥都知道 usb 的拓扑结构 usb 是一种主从结构的系统 usb主机由usb主控之器(Host Controller)和根集线器(Root Hub) 构成 usb 主控制器: 主要负责数据处理(就是我…

微信怎么批量自动添加好友?

如何批量加客户资源到微信,怎么加微信好友,这个基本上熟悉的人都会知道。 实际上,你知道所有添加微信好友的方式吗?或者说,你知道如何批量加客户微信吗? 比如说在一定时间内,把你所有的客户资…

AIGC文本生成智能应用(ChatGPT)提示工程师技巧

我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下AIGC文本生成智能提示工程师技巧。 当你在使用类似于ChatGPT这样的AIGC文本生成智能应用时,有没有想过,你所问的问题中的每一个词语对AIGC文本生成智能应用给你的回答的好…