大家好!在本教程中,我们将学习如何在Python编程语言中根据各种特征对葡萄酒进行分类。
葡萄酒分类简介
在这个世界上有许多葡萄酒,包括甜酒、起泡酒、开胃酒、流行酒、餐酒和陈年葡萄酒。
你可能会想,如何知道哪种酒是好的,哪种是不好的。这个问题的答案是机器学习!
目前有许多葡萄酒分类方法。这里列出了其中的几个:
- CART
- 逻辑回归
- 随机森林
- 纳伊夫贝叶斯
- 感知
- 检验检疫局
- KNN
在Python中实现葡萄酒分类
现在让我们进入一个非常基本的Python中的葡萄酒分类器的实现。这将给你一个起点,让你了解分类器是如何工作的,以及你如何在Python中为各种真实世界的场景实现它们。
1.导入模块
第一步是将所有必要的模块/库导入程序。分类所需的模块是一些基本的模块,如:
- Numpy
- Pandas
- Matplotlib
下一步是将所有的模型导入到sklearn库下的程序中。我们还将包括sklearn库中的一些其他功能。
所加载的模型列举如下
- SVM
- Logistic Regression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
from sklearn.preprocessing import normalize
2.数据集准备
接下来,我们需要准备我们的数据集。让我先介绍一下数据集,然后将其导入我们的应用程序中。
2.1 数据集的介绍
在这个数据集中,我们有6497个观察值,总共有12个特征。在任何变量中都没有NAN值。 你可以在这里轻松下载数据。
这12个特征的名称和描述如下:
- 固定酸度。葡萄酒中的酸度数量
- 挥发性酸度。葡萄酒中存在的醋酸量
- 柠檬酸。葡萄酒中柠檬酸的数量
- 残余糖分。发酵后的含糖量
- 氯化物。葡萄酒中存在的盐分的数量
- 游离二氧化硫。游离形式的二氧化硫的数量
- 总二氧化硫。游离和结合形式的S02的数量
- 密度。葡萄酒的密度(质量/体积)。
- pH值:葡萄酒的pH值,范围为0-14
- 硫酸盐。葡萄酒中的二氧化硫气体(S02)含量的数量
- 酒精。葡萄酒中存在的酒精量
- 质量。所述葡萄酒的最终质量
2.2 加载数据集
在read_csv 函数的帮助下,数据集被加载到程序中,并使用head 函数显示数据集的前五行。
data=pd.read_csv("./wine_dataset.csv")
data.head()

葡萄酒分类数据的第一行5
2.3 清理数据
数据集的清理包括在下面提到的代码的帮助下,删除不必要的列和NaN值。
data=data.drop('Unnamed: 0',axis=1)
data.dropna()
2.4 数据的可视化
一个重要的步骤是在进一步处理数据之前首先将其可视化。可视化有两种形式,即:
- 直方图
- 海波图
绘制直方图
plt.style.use('dark_background')
colors=['blue','green','red','cyan','magenta','yellow','blue','green','red','magenta','cyan','yellow']
plt.figure(figsize=(20,50))
for i in range(1,13):
plt.subplot(6,6,i)
plt.hist(data[data.columns[i-1]],color=colors[i-1])
plt.xlabel(data.columns[i-1])
plt.show()
我们将为每个特征分别绘制直方图。输出显示如下:

葡萄酒分类直方图图谱
绘制Seaborn图
import seaborn as sns
plt.figure(figsize=(10,10))
correlations = data[data.columns].corr(method='pearson')
sns.heatmap(correlations, annot = True)
plt.show()
Seaborn图用于显示数据集中不同特征之间的关系。

葡萄酒分类Seaborn图
2.5 训练-测试分割和数据归一化
要把数据分成训练和测试数据,没有最佳的分割比例。
但其中一个公平的分割规则是80/20规则,即80%的数据用于训练数据,其余20%用于测试数据。
这一步还涉及到对数据集的规范化。
split=int(0.8*data.shape[0])
print("Split of data is at: ",split)
print("\n-------AFTER SPLITTING-------")
train_data=data[:split]
test_data=data[split:]
print('Shape of train data:',train_data.shape)
print('Shape of train data:',test_data.shape)
print("\n----CREATING X AND Y TRAINING TESTING DATA----")
y_train=train_data['quality']
y_test=test_data['quality']
x_train=train_data.drop('quality',axis=1)
x_test=test_data.drop('quality',axis=1)
print('Shape of x train data:',x_train.shape)
print('Shape of y train data:',y_train.shape)
print('Shape of x test data:',x_test.shape)
print('Shape of y test data:',y_test.shape)
nor_train=normalize(x_train)
nor_test=normalize(x_test)
3.葡萄酒分类模型
在这个程序中,我们使用了两种算法,即SVM和Logistic Regression。
3.1 支持向量机(SVM)算法
clf = svm.SVC(kernel='linear')
clf.fit(nor_train, y_train)
y_pred_svm = clf.predict(nor_test)
print("Accuracy (SVM) :",metrics.accuracy_score(y_test, y_pred_svm)*100)
该模型的准确性变成了大约50% 。
3.2 Logistic回归算法
logmodel = LogisticRegression()
logmodel.fit(nor_train, y_train)
y_pred_LR= logmodel.predict(nor_test)
print('Mean Absolute Error(Logistic Regression):', metrics.mean_absolute_error(y_test, y_pred_LR)*100)
在这种情况下,准确率也变成了大约50% 。其主要原因是我们所使用/创建的模型。先进的模型,如tensorflow可用的模型是
结论
为了获得更高的准确率,你也可以检查一下tensorflow模型!
学习愉快!😇
请继续关注更多此类教程!谢谢您的阅读!