建立高性能模型作为数据科学家(项目)
#python #datascience #machinelearning #statistics

你好!欢迎来到我的下一个数据科学项目,该项目在一个无休止的可能性,葡萄酒行业为数据科学家展示其技能的引人入胜的游乐场。在这篇文章中,我们将研究一个简单而迷人的项目。但是坚持;这仅仅是个开始!我们将介绍一系列激动人心的项目和案例研究,这些项目和案例研究可以揭示各个行业中数据驱动的见解的无限潜力。因此,抓一杯您喜欢的酒并加入我!

这里有一些令人着迷的案例研究,但不限于:
1。质量预测模型:开发一个预测模型,该模型可以准确预测基于生产过程中收集的传感器读数的葡萄酒瓶质量,以确保质量一致和早期识别潜在问题。

2。葡萄收获优化:通过分析天气数据,土壤特征和葡萄园条件来优化葡萄收获的时机,以在其峰值成熟度上收获葡萄,以获得最佳风味和质量。

3。葡萄酒推荐引擎:建立一个推荐系统,根据客户的喜好和先前的评分向客户建议葡萄酒,提供个性化建议,以提高客户满意度并提高销售额。

4。葡萄园疾病检测:使用图像处理技术开发一种算法来检测葡萄园图像中的疾病和害虫,从而实现早期检测和及时干预以保护葡萄园的健康。

5。衰老潜在评估:创建一个模型,该模型根据葡萄酒的特征来估算葡萄酒的衰老潜力,以帮助酿酒师确定不同葡萄酒的最佳衰老期,以确保它们达到高峰成熟。

6。葡萄酒定价优化:通过分析市场趋势,历史销售数据和葡萄酒特征来开发定价优化模型,以确定平衡市场需求,生产成本和最大化盈利能力的价值的最佳价格。

猜猜是什么?我们将在这里谈论第一个点,哪个是建立质量预测模型。

在这个项目结束时,我们将看到传统模型如何在不使用任何复杂模型的情况下表现出色,我们无法向利益相关者解释。

正如他们所说,简单永远是最好的。

项目理解

您曾被一个著名的葡萄酒生产商参与其中,以开发一个预测模型,该模型准确地确定了基于生产过程中收集的传感器读数的新生产葡萄酒瓶的质量。每年生产超过200,000瓶的红酒和白葡萄酒,该公司必须通过确定错误并确保其产品的质量保持较高的声誉。

成功标准

对于预测模型而言,重要的是,通过A 最大偏差为0.5点,与真实质量得分0.5点。 这对于公司准确至关重要将其优质葡萄酒分开向投资者和订阅客户分发。

通过设定严格的偏差阈值,该葡萄酒公司旨在最大程度地降低错误分类或歪曲葡萄酒质量的风险。这样可以确保仅确定最高质量的葡萄酒并分开向投资者和订阅客户分发。 0.5点偏差极限是该模型准确评估葡萄酒质量的有效性的基准,降低了假阳性或负面因素的机会。

通过遵守此统计标准,葡萄酒公司可以对预测模型可靠地识别和区分其最好的葡萄酒的能力充满信心,维护其声誉并保持对敏锐客户的满意。

有关数据集的信息

该公司提供了一个数据集,其中包括1,500多个随机抽样的葡萄酒瓶的平均质量得分,由五个不同的专家以1到10的比例评级,以及相关的传感器读数,用于酒精含量,pH,pH ,柠檬酸含量和其他相关指标。

Dataset Preview
Project link
遵循

数据探索

收集和理解数据后,数据分析项目中的第一件事正在探索它。

了解有关它的更多信息。
这可以通过探索来完成。

所以让我们进入它。
导入该项目将使用的库。

  1. 熊猫 - 用于数据操作
  2. numpy-用于数学操作
  3. seaborn-可视化
  4. 功能引擎 - 用于功能工程任务
  5. Scikit -learn-用于机器学习建模
  6. StatsModels-用于统计建模
  7. YellowBrick-用于视觉分析和诊断工具,旨在用Scikit -Learn促进机器学习

,使用此库,我们无法导入不合适的完整软件包。 我们称我们需要的东西

eg:from sklearn.linear_model导入linearregression

了解我们的过程和工作流程是这里最重要的事情。此库只是为了使工作更轻松。

eg:from funeration_engine.outliers导入winsorizer 是库中用于使用变量的最大值和最小值删除异常值的函数,在this article < /p>

导入我们需要的库后。

阅读数据集,我们使用熊猫读取数据集并操纵数据

之类的方法

df.info()
df.describe () 

和其他人有助于我们的探索,以很好地了解我们的数据

data describe

从上表中,像'total_sulfur_dioxide','density'clearly这样的功能显示了数据中的一些偏斜和离群值,但是我们不能在不证明它的情况下做出任何假设

我需要在箱形图上绘制此变量以获取其概述。

outliers

关于total_sulfur_dioxidecolumn中某些异常值的假设已确认。

可能还有其他具有相同和相似问题的列。

distribution
从上图:

可以看出,大多数数据是偏斜的,并且不是正态分布

将这些数据送入模型中,它将影响模型性能和预测。

需要在此数据集上进行更改,以使其非常适合模型理解功能及其如何影响葡萄酒质量。

为什么我们关心正常分布和偏度?
在统计中,在统计和机器学习模型中首选正态分布的数据,因为它简化了解释并与假设保持一致。

偏斜或非正态分布数据可以引入偏见并影响预测,违反了诸如均匀性的假设,这意味着目标变量的可变性应在预测变量的不同级别上保持一致。

keep

需要执行功能工程以对数据进行更改,因为我将使用将异常值视为模型性能的威胁。

和离群值可以使回归线在预测其他数据方面的准确性降低。

哦,我提到了回归模型,是的!

在此项目中,我们将使用回归模型,特别是线性回归。

为什么要回归模型?
在任何数据科学项目中,您都必须知道要解决的问题以及必须提供的解决方案,并且有两种主要类型的机器学习模型。机器学习分类(响应属于一组或类别的响应)和机器学习回归(响应是连续的)。

statistics memes

根据我们的问题声明,我们将预测葡萄酒质量分数,这是连续数据。
假设我们必须预测葡萄酒的类型,无论是红酒还是白葡萄酒。这是分类的地方。

Break

nb:在现实生活中,您必须深入研究数据并探索(了解oultiers,特征,相关等)

这只是概述;

让我们进入功能工程

因此,功能工程是获取原始数据并将其转换为可用于创建性能良好的预测模型

的功能的过程

在数据处理步骤中,我们必须在功能工程之前始终将原始数据分为培训和测试集。

这种反对data leakage的守卫,其中训练数据中的信息通过转换泄漏到测试数据中(例如缩放数字变量 - 更多信息)

#splitting of datasets to train and test
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    df.drop(columns=['quality_score']),  #drop the quality score column
    df['quality_score'],
    train_size=0.8,
    random_state=42,
)

代码片段使用train_test_split功能将葡萄酒数据集拆分为培训和测试集。功能(不包括'Quality_score'列)存储在X_trainX_test中,而相应的目标变量'Quality_score'存储在y_trainy_test中。这种分裂使我们能够在数据的一部分上训练回归模型,并使用测试数据在看不见的数据上评估其性能。

和80%的数据进行了培训,其他20%进行了测试。

我们完成了分裂。

我将创建一个包含数字功能和分类功能的列表。

这将允许相应地完成功能工程过程

#creating list for numeric features
numeric_features = (
    X_train
    .select_dtypes('number')
    .columns
    .to_list()

)

#list for categorical features
categorical_features =(
    X_train
    .select_dtypes('object')
    .columns
    .to_list()
)

output

由于我们的数据已分类,让我们构建一个功能工程管道。

构建一条管道,该管道通过以下步骤处理葡萄酒数据中的数字特征:

  • Yeo-Johnson删除偏度
  • scaling标准化数据
  • 使用IQR方法的上限离层
  • 删除相关功能
#Checking if there is multicollinearity among the features

sns.heatmap(X_train[numeric_features].corr(),annot=True)

corr

功能还可以,尤其没有多重共线性,但是我将研究density and alcohol列的相关系数为0.67

功能工程管道

#numeric pipeline
numeric_pipeline = Pipeline(
    [
        ('skewness',YeoJohnsonTransformer()),
        ('remove_outliers', Winsorizer(capping_method='iqr',tail='both', fold=1.5)),
        ('scaling',StandardScaler()),
        ('remove_corr', DropCorrelatedFeatures(threshold=0.6)),


    ]    
)

#categorical pipeline
categorical_pipeline = Pipeline(
    [
    ('dummy encoding',OneHotEncoder(drop_last=True))
    ]
)

该代码定义了两个用于预处理葡萄酒数据的管道。 numeric_pipeline应用转换来使用Yeo-Johnson变换来处理偏斜,使用Winsorization删除异常值,使用标准标准缩放特征,并根据阈值降低相关的功能。 categorical_pipeline使用onehotencoder对分类变量进行编码,从而删除了最后一个类别,以避免多重共线性。这些管道可确保适当地为随后的建模步骤准备数据。

让我们成为一个

#apply all pipeline
feature_eng_pipeline = ColumnTransformer(
    [
        ('numeric_eng', numeric_pipeline, numeric_features),
        ('categorical_eng', categorical_pipeline, categorical_features)
    ],
    verbose_feature_names_out=False
)

feature_eng_pipeline是一个ColumnTransformer,将numeric_pipeline应用于数字特征,cancorical_pipeline将其应用于葡萄酒数据的分类特征。它在每种功能类型上执行指定的转换,在将数据馈送到后续建模步骤之前,可以进行全面的功能工程和预处理。

功能工程管道准备就绪。

relax

让我们使用管道

适合我们的培训数据

train1

transoform

fit()函数计算这些参数的值。转换函数应用数据上的参数值并给出归一化值

我们可以看到density column已被删除
安装我们的管道后。
数据看起来不错

拟合功能工程管道后的培训数据的描述性统计

des

xxx

数据进行缩放,并显示出一个类似的分布,我认为这比以前更好。

型号 +管道

让我们谈谈我们将使用的模型以及如何工作(线性回归)

model

是的!。 Linear regression是一种统计技术,它使用自变量来预测因变量。它假设变量之间存在线性关系,旨在找到最小的拟合线,以最大程度地减少观察到的数据点和预测值之间的差异。

我可以给出的简单示例是,
假设您是一名高中老师,正在研究学生花在学习的时间数量与他们的最终考试成绩之间的关系。通过使用简单的线性回归,您可以分析数据并建立一条线,该线路表示研究小时对考试成绩的平均效果。这使您可以根据他们学习的小时数来预测学生的预期成绩,从而提供对学习时间对学业表现重要性的宝贵见解。

因此,在这种情况下,因变量是考试得分(目标变量),自变量是小时数

考试得分是取决于的小时数

,在我们的情况下,因变量或目标变量为 Quality_score ,独立变量是我们在 x_train dataframe中拥有的功能

#adding models to pipeline
linear_reg_workflow = Pipeline(
    [
        ('feature_engineering', feature_eng_pipeline),
        ('linear_regression', LinearRegression()),

    ]
)

此管道包含我们的功能工程过程和在这种情况下将使用的模型。

Image model

拟合数据,我们可以看到训练数据通过特征工程管道并移至模型。

# Now we can use our workflow to get predictions
train_predict= linear_reg_workflow.predict(X_train)

预测存储在 train_predict 变量中。

模型估值

judgement
是时候绘制我们的预测及其拟合线的时间

# Expand the plot size
plt.figure(figsize=(8,8))

# Create Prediction Error Plot
linear_wf_train_error = PredictionError(linear_reg_workflow, is_fitted=True, bestfit=False, alpha=0.3)

linear_wf_train_error.score(X_train, y_train)

linear_wf_train_error.show();

error

哇!预测数据非常适合。如果有过度拟合的问题,我会变得可疑。因为我们的R平方值为0.987,这意味着所研究的因变量的差异的98%是由自变量的方差解释的。
它基本上告诉我们98%的数据适合模型。

表示平方错误
mse

MSE:它测量了预测值和实际值之间的平均平方差。

在这种情况下, MSE为0.12357037181356899 意味着,平均而言,预测值和实际值之间的平方差为0.12357037181356899。 MSE值越低,模型的性能越好,因为它表明预测更接近实际值。

,但请记住在我们的成功标准中:它指出最大偏差应为 0.5分与真实质量得分。

Scared

在我对模型变得太自信之前,让我们用test_data
的看不见数据测试模型

# Expand the plot size
plt.figure(figsize=(4,6))

# Create Prediction Error Plot
linear_wf_test_error = PredictionError(linear_reg_workflow, is_fitted=True, bestfit=False, alpha=0.3)

linear_wf_test_error.score(X_test, y_test)

linear_wf_test_error.show();

test

它也很好地概括了我们的测试数据。
您可能以为我是个天才,是的,我是

项目成功完成。

当我们接近末尾,我很乐意谈论交叉验证模型意义

简单的术语Cross-validation 类似像一个可靠的朋友团队一样,通过评估其对不同数据子集的预测来严格测试您的模型的性能。

cv

使用简历创建了10个数据集,平均得分为0.987,从上面的图片中,我们可以看到该模型在火车和测试数据上的准确性和错误率方面的性能。

done

另一方面,

Model significance通过评估诸如p值之类的统计措施来确定模型的信誉,表明该模型的预测是统计上可靠的还是仅仅是运气。

stat

上面的代码调用统计模型以适合数据, Note
我与该模型一起拟合的数据没有在其上执行的功能工程(原始数据),如果您对著名的统计编程语言熟悉 r 。上面的代码就像一个老朋友

您将看到传统统计OLS如何解释模型。

model significance

stat meme

是时候解释模型了。

COEF和STD ERR COEF列代表每个自变量的系数以及截距值。 std err 是所有数据点中相应变量系数的标准偏差。
我们可以看到,功能的所有错误都是可以的,除了density与规范完全不同。在我们以前的功能工程流行音乐中,它在过程中被退出。

调整后的R Square
调整后的R平方对于分析模型上的多个因变量疗效很重要。线性回归具有您的模型R平方值永远不会与其他变量相同或更高的变量下降的质量。因此,即使您的贡献不佳,您的模型也可以使用多个变量看起来更准确。调整后的R平方基于变量数量惩罚R平方公式,因此,调整后的分数较低,可能告诉您某些变量没有适当地构成您的型号。

在这种情况下,它是0.968,很棒

p值模型显着性测试中的p值有助于评估自变量变量与回归模型中因变量之间关系的统计意义。低p值表明有重大影响,这表明观察到的关系不太可能仅由于机会。高P值表明该变量可能没有显着影响。考虑p值有助于选择相关变量并解释其对因变量的影响。

变量在模型中具有重要作用。

在我们的摘要表中,我们所拥有的值小于0.05,它显示了特征的重要性

我将在这里结束(我认为这已经足够)。

通过采用交叉验证并评估模型意义,我们可以确信该模型在做出准确的预测方面是可靠且值得信赖的。

Project link

end

如果您发现此内容丰富的休假或对项目的评论,您将希望我下一步做。

谢谢。