葡萄酒品质预测
葡萄酒品质预测
在不平衡的数据集上构建随机森林分类器
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 版权协议,转载请附上原文出处链接和本声明