美文网首页
葡萄酒品质

葡萄酒品质

作者: 逍遥_yjz | 来源:发表于2020-10-14 14:02 被阅读0次

在此端到端Python机器学习教程中,您将学习如何使用Scikit-Learn来构建和调整有监督的学习模型!
我们将训练和调整随机森林的葡萄酒品质(由葡萄酒专家判断)基于酸度,残留糖和酒精浓度等特征。
链接:https://pan.baidu.com/s/1XZnPibKchT-Wu_ALpzytSQ
提取码:qzfy

1.设置您的环境。
2.导入库和模块。
3.加载红酒数据。
4.将数据分为训练和测试集。
5.声明数据预处理步骤。
6.声明要调整的超参数。
7.使用交叉验证管道调整模型。
8.重新安装整个训练集。
9.根据测试数据评估模型管道。
10.保存模型以备将来使用。

import numpy as np
import pandas as pd
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

步骤3:加载红酒数据。


dataset_url = 'data/winequality-red.csv'
data = pd.read_csv(dataset_url)
print(data.head())

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

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

特征标量:
质量(目标) 固定酸度 挥发性酸度 柠檬酸 残留糖 氯化物 游离二氧化硫 总二氧化硫 密度 pH值 硫酸盐 醇
结果:

fixed acidity;"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"
0   7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5                                                                                                                     
1   7.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5                                                                                                                     
2  7.8;0.76;0.04;2.3;0.092;15;54;0.997;3.26;0.65;...                                                                                                                     
3  11.2;0.28;0.56;1.9;0.075;17;60;0.998;3.16;0.58...                                                                                                                     
4   7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;5                                                                                                                     
   fixed acidity  volatile acidity  citric acid  ...  sulphates  alcohol  quality
0            7.4              0.70         0.00  ...       0.56      9.4        5
1            7.8              0.88         0.00  ...       0.68      9.8        5
2            7.8              0.76         0.04  ...       0.65      9.8        5
3           11.2              0.28         0.56  ...       0.58      9.8        6
4            7.4              0.70         0.00  ...       0.56      9.4        5

[5 rows x 12 columns]
(1599, 12)
       fixed acidity  volatile acidity  ...      alcohol      quality
count    1599.000000       1599.000000  ...  1599.000000  1599.000000
mean        8.319637          0.527821  ...    10.422983     5.636023
std         1.741096          0.179060  ...     1.065668     0.807569
min         4.600000          0.120000  ...     8.400000     3.000000
25%         7.100000          0.390000  ...     9.500000     5.000000
50%         7.900000          0.520000  ...    10.200000     6.000000
75%         9.200000          0.640000  ...    11.100000     6.000000
max        15.900000          1.580000  ...    14.900000     8.000000

[8 rows x 12 columns]

步骤4:将数据分为训练集和测试集。

y = data.quality
X = data.drop('quality', axis=1)

注:stratify=y : 按照数据集中y的比例分配给train和test,使得train和test中各类别数据的比例与原数据集的比例一致。
举例:
原数据集中有100条数据,A类有80条,B类有20条,且前80条全为A类。
那么我们在不指定stratify参数的情况下,切分出前80条的数据就全部为A类。
所以我们要设置stratify=y来使得切分出的测试集与训练集中包含的类别为4:1。
通常在数据集的分类分布不平衡的情况下会用到stratify。

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2,
                                                    random_state=123,
                                                    stratify=y)

步骤5:声明数据预处理步骤。

https://zhuanlan.zhihu.com/p/120780686 标准化
首先,这里是一些我们不会使用的代码 ...

X_train_scaled = preprocessing.scale(X_train)
#print(X_train_scaled)

X_train_mean = X_train_scaled.mean(axis=0)
print(X_train_mean)

X_train_std = X_train_scaled.std(axis=0)
print(X_train_std)

很好,但是为什么我们说我们 将不使用此代码?原因是我们将无法对测试集执行完全相同的转换。

现在,这是我们将使用的预处理代码 ...
该过程如下所示:

将transformer 安装在训练套件上(保存均值和标准偏差)
将transformer 应用于训练集(缩放训练数据)
将transformer 应用于测试仪(使用相同的均值和标准偏差)

scaler = preprocessing.StandardScaler().fit(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.]

注意我们如何获取缩放器对象并使用它来转换训练集。稍后,我们可以使用与转换训练集完全相同的方法和标准偏差来转换测试集:

X_test_scaled = scaler.transform(X_test)

print(X_test_scaled.mean(axis=0))
print(X_test_scaled.std(axis=0))

请注意,测试集中的缩放特征如何无法完美地以零单位居中于零!这正是我们所期望的,
因为我们正在使用训练集而不是测试集本身的方法来转换测试集。

实际上,当我们建立交叉验证管道时,我们甚至不需要手动安装Transformer API。
相反,我们将仅声明类对象,如下所示:

pipeline = make_pipeline(preprocessing.StandardScaler(),
                         RandomForestRegressor(n_estimators=100))

这就是它的样子:建模管道,该管道首先使用StandardScaler()转换数据,然后使用
随机森林回归器拟合模型。

步骤6:声明超参数进行调整。

示例:随机森林超参数。

例如,让我们以随机森林进行回归:

在每个决策树,计算机可以凭经验决定在哪里创建基于分支或者 均方误差(MSE)或平均绝对误差(MAE)。因此,实际的分支位置是模型参数。

但是,该算法不知道应使用两个标准(MSE或MAE)中的哪一个。该算法还无法确定森林中要包含多少棵树。这些是用户必须设置的超参数示例 。

print(pipeline.get_params())
#声明要通过交叉验证进行调整的超参数。
hyperparameters = { 'randomforestregressor__max_features' : ['auto', 'sqrt', 'log2'],
                  'randomforestregressor__max_depth': [None, 5, 3, 1]}

步骤7:使用交叉验证管道调整模型。

# cv 交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
clf = GridSearchCV(pipeline, hyperparameters, cv=10)

# Fit and tune model
clf.fit(X_train, y_train)

print("使用CV找到的最佳参数集:", clf.best_params_)
# 使用CV找到的最佳参数集: {'randomforestregressor__max_depth': None, 'randomforestregressor__max_features': 'sqrt'}

随机森林允许单个决策树使用特征的最大数量。 Python为最大特征数提供了多个可选项。 下面是其中的几个:

Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。

sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。

0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。'''

步骤8:重新安装整个训练集。

使用交叉验证对超参数进行适当的调整后,通常可以通过在整个训练集上重新拟合模型来获得较小的性能提升。

方便地,来自sklearn的GridSearchCV将使用整个训练集自动使用最佳的超参数集重新拟合模型。

默认情况下,此功能为开,但是您可以确认它:
print(clf.refit) True

步骤9:根据测试数据评估模型管道。

y_pred = clf.predict(X_test)

print(r2_score(y_test, y_pred))
# 0.4559573824081362

print(mean_squared_error(y_test, y_pred))
# 0.35105624999999996

步骤10:保存模型以备将来使用。

我们可以保存训练的模型,以便您将来可以使用该模型。这样做很容易:

joblib.dump(clf, 'rf_regressor.pkl')

就是这样。当您想再次加载模型时,只需使用以下功能:

clf2 = joblib.load('rf_regressor.pkl')
 
# Predict data set using loaded model
clf2.predict(X_test)

参考文章

相关文章

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《红葡萄酒》 “石榴红色”...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《白葡萄酒》 “黄棕色”:...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《桃红葡萄酒》 “薰衣草色”:...

  • SoulStar灵魂星陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过 颜色来判断葡萄酒的品质和酒龄。 《红葡萄酒》 “深棕色”:这...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《红葡萄酒》 “紫色”:表示此款...

  • 葡萄酒的酒精度数,越高越好吗?

    经常听到有商家说,我家这款葡萄酒酒精度多高多高,这葡萄酒的品质有多好多好的,让很多人误以为,酒精度越高葡萄酒的品质...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《白葡萄酒》 “稻草黄”:此颜色...

  • 321薯仔先生[1期3班]刻意练习Day2

    {思考} 文案目的:体现葡萄酒的品质优良,让顾客相信品质并购买 方式:通过对葡萄酒原材料(葡萄)的生长地理环境,气...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《白葡萄酒》 “琥珀色”:此颜...

  • SoulStar灵魂星 陨石学院

    《葡萄酒小知识》 葡萄酒的颜色内含很多信息,可以通过颜色来判断葡萄酒的品质和酒龄。 《白葡萄酒》 “棕色”:一款白...

网友评论

      本文标题:葡萄酒品质

      本文链接:https://www.haomeiwen.com/subject/hqgipktx.html