葡萄酒品质预测

葡萄酒品质预测

在不平衡的数据集上构建随机森林分类器

Photo by 马克西姆·卡哈雷茨基 on 不飞溅

在本文中,我将解释如何使用随机森林算法构建葡萄酒质量预测模型。获取数据集 这里 .事不宜迟,让我们开始吧!

导入库

 将 numpy 导入为 np  
 将熊猫导入为 pd  
 将 seaborn 导入为 sns  
 从 sklearn.svm 导入 SVC  
 将 matplotlib.pyplot 导入为 plt  
 从 sklearn.linear_model 导入 SGDClassifier  
 从 sklearn.preprocessing 导入 LabelEncoder  
 从 sklearn.model_selection 导入 GridSearchCV  
 从 sklearn.ensemble 导入 RandomForestClassifier  
 从 sklearn.metrics 导入  
 分类报告、混淆矩阵、准确度分数

读取数据集

 wine = pd.read_csv('winequality-red.csv')  
 酒头()

描述数据

 wine.describe()

 wine.info()

正如我们在这里看到的,我们总共有 12 列(或特征),这些列包含“1599 个非空”值。我们在上面看到,当我们使用 描述 方法,我们总共有 1599 个观察值,因此这意味着我们的数据中没有缺失值。此外,所有列都具有浮点作为数据类型,除了 质量 这是一个 64 位整数。

大牌公司对学生和初创企业有什么建议?我们问他们! R 阅读或观看我们的行业问答,了解斯坦福、谷歌和 HuggingFace 团队的建议 .

绘制数据

下面我们绘制我们的目标变量 质量 针对每个单独的(独立的)特征,寻找相关性的任何迹象。

 fig = plt.figure(figsize=(15,10)) plt.subplot(3,4,1)  
 sns.barplot(x='质量',y='固定酸度',data=wine) plt.subplot(3,4,2)  
 sns.barplot(x='质量',y='挥发性酸度',data=酒) plt.subplot(3,4,3)  
 sns.barplot(x='质量',y='柠檬酸',data=酒) plt.subplot(3,4,4)  
 sns.barplot(x='质量',y='残糖',data=wine) plt.subplot(3,4,5)  
 sns.barplot(x='质量',y='氯化物',数据=酒) plt.subplot(3,4,6)  
 sns.barplot(x='质量',y='游离硫  
 二氧化碳',数据=酒) plt.subplot(3,4,7)  
 sns.barplot(x='质量',y='总硫  
 二氧化碳',数据=酒) plt.subplot(3,4,8)  
 sns.barplot(x='质量',y='密度',数据=酒) plt.subplot(3,4,9)  
 sns.barplot(x='质量',y='pH',数据=酒) plt.subplot(3,4,10)  
 sns.barplot(x='质量',y='硫酸盐',数据=酒) plt.subplot(3,4,11)  
 sns.barplot(x='质量',y='酒精',数据=酒) plt.tight_layout()
  • 从下面的图中我们可以说:
    - 挥发性酸度低时质量高。
    - 柠檬酸高时质量高。
    - 氯化物含量低时质量高。
    - 硫酸盐含量高时质量高。
    - 酒精含量越高,质量越高。

计算每个类的实例数

 葡萄酒['质量'].value_counts()
  • 目前,我们可以看到我们有六个不同的质量等级:3、4、5、6、7、8。让我们将其更改为二元分类问题。
  • 我们将从 3 到 6 的每个评分标记为 坏的 和 7 或 8 的评级为 好的 .

制作两类:坏的和好的

 范围 = (2,6.5,8)  
 组= ['坏','好']  
 wine['quality'] = pd.cut(wine['quality'],bins=ranges,labels=groups)

在这里,我们正在切割垃圾箱,使用 pd.cut() 在 2 类 2–6.5 中 坏的 和 6.5–8 为 好的 .请注意,由于所有质量值都是整数,因此这会将所有 6(低于 6.5)的质量得分移至 坏的 类别,同时保持所有质量得分为 7 好的 类别。

将 0 分配给不良,将 1 分配给良好

我们需要机器可以理解的标签,而不是人类。因此,在这一步中,我们将:

  • 代替 坏的 0。
  • 代替 好的 由 1。
  • 作为参考,请参见下图中的质量列:

labels encoded to 0 and 1

再次检查计数

 葡萄酒['质量'].value_counts()

  • 现在我们只有 2 个类,0 和 1,或者 坏的 好的 .

将数据拆分为训练和测试

 从 sklearn.model_selection 导入 train_test_split  
 X = wine.drop('质量', axis=1)  
 y = 酒['质量']  
 X_train, X_test, y_train, y_test= train_test_split(X, y,  
 test_size=0.3,  
 随机状态=101)
  • 我们可以看到数据高度不平衡,所以我们将在下一步平衡它。

平衡班级

  • 我们将使用平衡类 学习 的(不平衡学习的) 随机过采样 班级:

    从 imblearn.over_sampling 导入 RandomOverSampler
    over = RandomOverSampler(random_state=42)
    X_train_over, y_train_over = over.fit_resample(X_train, y_train)
    X_train_over.shape

注意:在单独对训练集执行平衡技术之前,始终先将数据拆分为测试集和训练集。

最后训练我们的葡萄酒质量预测模型

 参数 = {  
 'n_estimators': np.arange(100, 1001, 100)  
 } grid_rf= GridSearchCV(RandomForestClassifier(),  
 参数,评分='准确性',cv=10,) grid_rf.fit(X_train, y_train)print('最佳参数 --> ', grid_rf.best_params_) # 酒质预测  
 pred = grid_rf.predict(X_test)  
 打印(混淆矩阵(y_test,pred))  
 打印('\n')  
 打印(分类报告(y_test,pred))  
 打印('\n')  
 打印(accuracy_score(y_test,pred))

我还使用了一些其他算法,如 SVM(支持向量机)和 SGD(随机梯度下降)分类器,但随机森林一如既往地脱颖而出。在这里,我使用 GridSearchCV 和随机森林来找到 n_estimators 范围。最后,我们最终得到了 88.5% 的准确率,这对于这个小数据集来说非常好。

这就是本文的全部内容,感谢阅读!

编者注: 心跳 是一个贡献者驱动的在线出版物和社区,致力于为数据科学、机器学习和深度学习从业者提供一流的教育资源。我们致力于支持和激励各行各业的开发人员和工程师。

编辑独立,心跳由赞助和出版 彗星, 一个 MLOps 平台,使数据科学家和 ML 团队能够跟踪、比较、解释和优化他们的实验。我们付钱给我们的贡献者,我们不卖广告。

如果您愿意贡献,请前往我们的 征集贡献者 .您还可以注册接收我们的每周通讯( 深度学习周刊 ),查看 彗星博客 ,加入我们 __松弛 ,然后跟随彗星 推特 领英 获取资源、事件等,以帮助您更快地构建更好的 ML 模型。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38806/29232311

posted @ 2022-09-23 11:29  哈哈哈来了啊啊啊  阅读(493)  评论(0编辑  收藏  举报