从零开始的回归分析——葡萄酒品质预测
在之前的文章中,我们介绍了机器学习的基础知识和回归类型。在本文中,我们将完成第一个机器学习项目。这将帮助我们了解如何在不同的数据集上实现回归。设置、理解和编写代码只需一个小时。那么,让我们开始吧!😃
本任务是根据一组特征作为输入,预测红酒的品质(评分范围为 0-10)。我使用线性回归将其转化为一个回归问题来解决。
本文使用的数据集是来自 UCI 机器学习库的葡萄酒质量数据集。您可以在这里查看该数据集。
输入变量包括固定酸度、挥发性酸度、柠檬酸、残糖、氯化物、游离二氧化硫、总二氧化硫、密度、pH值、硫酸盐和酒精。输出变量(基于感官数据)为质量(评分介于0到10之间)。以下是数据集前5行的截图。
依赖关系
代码是用Python编写的。除此之外,请使用pip安装以下库。
- Pandas:pip install pandas
- matplotlib:pip 安装 matplotlib
- numpy:pip 安装 numpy
- scikit-learn:pip 安装 scikit-learn
好了!你已经完成一半了😄。接下来,按照以下步骤操作,即可快速构建线性回归模型!
方法
创建一个新的 IPython Notebook,并将以下代码插入其中以导入必要的模块。如果出现任何错误,请使用 pip 安装必要的软件包。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
使用 pandas 将数据读取到数据框中。要查看数据集的前 5 行,请使用df.head()
df = pd.read_csv('winequality-red.csv')
df.head()
使用以下方法查找数据集中每个属性之间的相关性corr()
# there are no categorical variables. each feature is a number. Regression problem.
# Given the set of values for features, we have to predict the quality of wine.
# finding correlation of each feature with our target variable - quality
correlations = df.corr()['quality'].drop('quality')
print(correlations)
要绘制热图并获得详细的相关性图表,请插入以下代码。
sns.heatmap(df.corr())
plt.show()
定义一个函数get_features(),该函数仅输出相关性高于阈值(作为函数的输入参数)的特征。
def get_features(correlation_threshold):
abs_corrs = correlations.abs()
high_correlations = abs_corrs
[abs_corrs > correlation_threshold].index.values.tolist()
return high_correlations
创建两个向量,x分别包含输入特征和y质量变量。在向量中x,我们得到除残糖以外的所有特征。如果需要,可以提高阈值。
# taking features with correlation more than 0.05 as input x and quality as target variable y
features = get_features(0.05)
print(features)
x = df[features]
y = df['quality']
使用以下命令创建训练集和测试集train_test_split:25% 的数据用于测试,75% 的数据用于训练。您可以使用以下命令检查数据集的大小:x_train.shape
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=3)
创建好训练集和测试集后,就可以构建线性回归模型了。您可以直接使用内置函数创建模型,然后将其拟合到训练数据。训练完成后,coef_该函数会给出每个特征的系数值。
# fitting linear regression to training data
regressor = LinearRegression()
regressor.fit(x_train,y_train)
# this gives the coefficients of the 10 features selected above.
print(regressor.coef_)
要使用此模型预测葡萄酒的品质,请使用predict()。
train_pred = regressor.predict(x_train)
print(train_pred)
test_pred = regressor.predict(x_test)
print(test_pred)
计算训练集和测试集的均方根误差。均方根误差 (RMSE) 是衡量模型预测值(样本值和总体值)与实际观测值之间差异的常用指标。如果模型拟合良好,训练集和测试集的 RMSE 应该非常接近。如果测试集的 RMSE 远高于训练集,则很可能模型过度拟合了数据。
# calculating rmse
train_rmse = mean_squared_error(train_pred, y_train) ** 0.5
print(train_rmse)
test_rmse = mean_squared_error(test_pred, y_test) ** 0.5
print(test_rmse)
# rounding off the predicted values for test set
predicted_data = np.round_(test_pred)
print(predicted_data)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, test_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, test_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, test_pred)))
# displaying coefficients of each feature
coeffecients = pd.DataFrame(regressor.coef_,features) coeffecients.columns = ['Coeffecient']
print(coeffecients)
这些数据表明,在其他所有特征保持不变的情况下,硫酸盐含量每增加1个单位,葡萄酒的品质就会提高0.8,其他特征也类似。
同样,在其他所有特征保持不变的情况下,挥发性酸度每增加1个单位,葡萄酒的品质就会下降0.99,其他特征也类似。
因此,我们仅用几行代码就构建了一个线性回归模型,用于预测葡萄酒的品质,训练集和测试集的均方根误差 (RMSE)分别为 0.65 和 0.63。这只是一个帮助您入门回归的思路。您可以尝试调整阈值、其他回归模型,还可以尝试特征工程 😍。
要获取完整代码,请点击此链接访问我的代码仓库。数据集也已上传 :) 克隆代码仓库并运行 notebook 即可查看结果。
接下来的文章将介绍分类以及一个相关的小项目。敬请期待!祝您学习愉快😸
文章来源:https://dev.to/apoorvadave/regression-from-scratch---wine-quality-prediction-3245




