一、问题描述
葡萄酒质量数据集最早由 Paulo Cortez 和他的研究团队于 2009 年发布。数据集包含了红葡萄酒和白葡萄酒的各种化学属性以及其对应的质量评分。关于这两个数据集的更多详情,请咨询:http://www.vinhoverde.pt/en/ 。由于隐私和物流问题,只有化学属性physicochemical作为输入变量和感官sensory质量评分作为输出变量可用(例如,没有关于葡萄类型、葡萄酒品牌、葡萄酒销售价格等的数据)。
这个公共数据集适合解决什么问题?
这是一个多类分类问题,但也可以被定义为回归问题。它的分类数据是不均衡的(例如,正常葡萄酒的数量比优质或差的葡萄酒多得多),很适合针对不均衡数据集的分类练习。除此之外,数据集中所有特征并不都是相关的,因此也可以拿来练习特征工程和特征选择。
本文根据葡萄酒质量数据集,使用线性回归模型来预测白葡萄酒的质量,并计算模型的平均绝对误差(MAE-Mean Absolute Error)。MAE是衡量回归模型预测性能的一个指标,表示预测值与实际观测值之间平均绝对差异的大小。MAE越小,说明模型的预测准确性越高。
二、数据集内容
winequality-white.csv
和winequality-red.csv
数据集包含了葡萄酒的各种化学属性以及其对应的质量评分。
数据结构
葡萄酒质量数据集的数据结构可以理解为一张表格,其中每一行代表一款葡萄酒,每一列代表该葡萄酒的某一化学属性或其评分。以下是每个字段的定义:
- fixed acidity (固定酸度)
- 描述: 主要由酒石酸组成的酸,属于非挥发性酸,不易蒸发。
- 单位: g/dm³
- 备注: 酸度在葡萄酒的口感中起着重要作用,影响其酸涩感和新鲜度。
- volatile acidity (挥发性酸度)
- 描述: 主要是由乙酸组成的酸,属于容易挥发的酸。挥发性酸过高时会产生酸醋味。
- 单位: g/dm³
- 备注: 挥发性酸度过高会影响葡萄酒的风味,并可能被视为缺陷。
- citric acid (柠檬酸)
- 描述: 葡萄酒中的天然酸,柠檬酸可以增加葡萄酒的清新度。
- 单位: g/dm³
- 备注: 在葡萄酒酿造中通常不会添加,但它在葡萄汁中天然存在。
- residual sugar (残留糖分)
- 描述: 发酵过程中未转化为酒精的糖分,影响葡萄酒的甜度。
- 单位: g/dm³
- 备注: 残留糖分的高低决定了葡萄酒是干型、半干型还是甜型。
- chlorides (氯化物)
- 描述: 氯化物(主要是氯化钠),代表盐的含量,影响葡萄酒的风味。
- 单位: g/dm³
- 备注: 过多的氯化物可能会导致葡萄酒口感不佳。
- free sulfur dioxide (游离二氧化硫)
- 描述: 未与葡萄酒中的其他物质结合的二氧化硫,具有抗菌和抗氧化作用。
- 单位: mg/dm³
- 备注: 游离二氧化硫是葡萄酒的防腐剂,但过高的含量会影响葡萄酒的口感。
- total sulfur dioxide (总二氧化硫)
- 描述: 游离二氧化硫和与葡萄酒中的其他物质结合的二氧化硫之和。
- 单位: mg/dm³
- 备注: 总二氧化硫的量在葡萄酒质量控制中非常重要,影响葡萄酒的保质期和风味。
- density (密度)
- 描述: 葡萄酒的密度,通常与其酒精含量和残留糖分成正比。
- 单位: g/cm³
- 备注: 密度可以帮助推测酒精含量,特别是在发酵过程中。
- pH
- 描述: 酸碱度,表示葡萄酒的酸性或碱性。
- 单位: 无单位(pH值)
- 备注: pH值越低,葡萄酒越酸;较高的 pH 值可能会让葡萄酒更易腐坏。
- sulphates (硫酸盐)
- 描述: 硫酸盐在葡萄酒中作为一种防腐剂,也对葡萄酒的风味有影响。
- 单位: g/dm³
- 备注: 硫酸盐的适量使用能增强葡萄酒的抗氧化能力,但过多会产生负面影响。
- alcohol (酒精度)
- 描述: 葡萄酒中的酒精含量。
- 单位: %(按体积计)
- 备注: 酒精是发酵的主要产物,影响葡萄酒的结构和口感。
- quality (质量评分) :该字段为输出变量。
- 描述: 根据感官评估打分,通常是 0 到 10 的整数评分。
- 单位: 无单位(整数评分)
- 备注: 评分基于葡萄酒的整体质量,包括口感、风味、结构等。
数据样例:winequality-white.csv
fixed acidity | volatile acidity | citric acid | residual sugar | chlorides | free sulfur dioxide | total sulfur dioxide | density | pH | sulphates | alcohol | quality |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 0.27 | 0.36 | 20.7 | 0.045 | 45 | 170 | 1.001 | 3 | 0.45 | 8.8 | 6 |
6.3 | 0.3 | 0.34 | 1.6 | 0.049 | 14 | 132 | 0.994 | 3.3 | 0.49 | 9.5 | 6 |
8.1 | 0.28 | 0.4 | 6.9 | 0.05 | 30 | 97 | 0.9951 | 3.26 | 0.44 | 10.1 | 6 |
7.2 | 0.23 | 0.32 | 8.5 | 0.058 | 47 | 186 | 0.9956 | 3.19 | 0.4 | 9.9 | 6 |
7.2 | 0.23 | 0.32 | 8.5 | 0.058 | 47 | 186 | 0.9956 | 3.19 | 0.4 | 9.9 | 6 |
8.1 | 0.28 | 0.4 | 6.9 | 0.05 | 30 | 97 | 0.9951 | 3.26 | 0.44 | 10.1 | 6 |
6.2 | 0.32 | 0.16 | 7 | 0.045 | 30 | 136 | 0.9949 | 3.18 | 0.47 | 9.6 | 6 |
数据样例:winequality-red.csv
fixed acidity | volatile acidity | citric acid | residual sugar | chlorides | free sulfur dioxide | total sulfur dioxide | density | pH | sulphates | alcohol | quality |
---|---|---|---|---|---|---|---|---|---|---|---|
7.4 | 0.7 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.2 | 0.68 | 9.8 | 5 |
7.8 | 0.76 | 0.04 | 2.3 | 0.092 | 15 | 54 | 0.997 | 3.26 | 0.65 | 9.8 | 5 |
11.2 | 0.28 | 0.56 | 1.9 | 0.075 | 17 | 60 | 0.998 | 3.16 | 0.58 | 9.8 | 6 |
7.4 | 0.7 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
数据集使用许可协议
该数据集采用Creative Commons Attribution 4.0 International(CC BY 4.0)许可证授权。这允许在任何目的下共享和调整数据集。
法律文本 – 署名 4.0 协议国际版 – Creative Commons
三、线性回归算法
线性回归是一种基本的统计学习方法,主要用于解决回归问题。它试图通过建立自变量(特征)和因变量(目标)之间的线性关系来预测未知数据。线性回归算法的目标是找到一条直线(在二维空间中)或一个超平面(在多维空间中),使得所有数据点到这条直线或超平面的垂直距离之和最小。
以下这段代码展示了如何使用线性回归模型来预测葡萄酒的质量,并通过计算 MAE(平均绝对误差)、MSE(均方误差)和R²(决定系数) 来评估模型的性能。数据标准化有助于提高模型的稳定性和性能。
导入必要的库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
- 新增了
StandardScaler
用于数据标准化。 - 新增了
mean_squared_error
和r2_score
用于计算均方误差和决定系数。
加载数据
df = pd.read_csv('winequality-white.csv', delimiter = ',')
- 使用
pandas
的read_csv
函数加载名为winequality-white.csv
的数据集,数据集的分隔符是逗号,
。
数据预处理
y = np.array(df['quality'])
X = df.drop(['quality'], axis = 1)
y
是目标变量,即葡萄酒的质量评分。X
是特征变量,即除了质量评分之外的所有列。
分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
- 将数据集分割成训练集和测试集,测试集占 30%,并设置随机种子以确保结果的可重复性。
数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
- 使用
StandardScaler
对数据进行标准化处理,使每个特征的均值为0,方差为1。 fit_transform
用于训练集,transform
用于测试集。
训练模型
reg = LinearRegression().fit(X_train, y_train)
- 创建一个线性回归模型并使用训练数据进行拟合。
进行预测
pred = reg.predict(X_test)
- 使用训练好的模型对测试集进行预测。
计算评估指标
mae = np.sum(np.abs(pred - y_test)) / len(y_test)
mse = mean_squared_error(y_test, pred)
r2 = r2_score(y_test, pred)
print('线性回归模型的MAE为:', mae)
print('线性回归模型的MSE为:', mse)
print('线性回归模型的R²值为:', r2)
- 计算预测值与实际值之间的平均绝对误差(MAE)。
- 计算预测值与实际值之间的均方误差(MSE)。
- 计算决定系数(R²),表示模型解释的变异占总变异的比例。
- 打印出 MAE、MSE 和 R² 的值。
执行
python linear-regression.py
线性回归模型的MAE为: 0.6085017231859932
线性回归模型的MSE为: 0.6080380633651824
线性回归模型的R²值为: 0.24815662587559595