如何使用Pandas分析和Scikit-learn管道的机器学习

231 阅读12分钟

使用Pandas分析和Scikit-learn管道进行机器学习

Pandas剖析是一个Python库,可以执行自动探索性数据分析。它可以自动生成一份数据集剖析报告,提供有价值的见解。例如,我们可以通过剖析报告知道哪些变量可以使用,哪些变量可以放弃。

机器学习管道被用来自动化机器学习的开发阶段。这些阶段是数据集摄取、数据集预处理、特征工程、模型训练、模型评估、做出预测和模型部署。

一个机器学习管道是由多个初始化步骤组成的。它使用这些步骤来实现机器学习开发阶段的自动化。这些步骤是按顺序初始化的,所以一个步骤的输出被用作下一个步骤的输入。因此,为了更快地实现模型,管道步骤需要被很好地组织起来。

许多库支持机器学习管道的实施。我们将重点讨论Scikit-Learn库。该库提供了一个管道类,可以自动进行机器学习。我们将使用Pandas Profiling和Scikit-learn Pipeline建立一个客户流失模型。

前提条件

要跟上这篇文章,读者应该。

  • 知道如何建立一个[机器学习模型]
  • 知道如何实现[Scikit-learn算法]
  • 理解[机器学习的工作流程]
  • 理解[数据集预处理的步骤]

Scikit-learn管道如何工作

Scikit-learn Pipeline是一个强大的工具,它能使机器开发阶段自动化。它有一连串的转换方法,然后是一个模型估计函数,作为一个单一的过程组装和执行,以产生一个最终模型。

Scikit-learn Pipeline的步骤分为两类。

  1. 变换器。
  2. 估算器。

变换器

这个步骤包含所有执行数据转换的Scikit-Learn方法和类。数据转换是机器学习的一个重要阶段。

它将原始数据集转换为模型可以理解和容易使用的格式。此外,数据转换还执行特征工程和数据集预处理。

特征工程从称为特征的数据集中获得相关和独特的属性。然后,模型在训练中使用这些特征作为输入。数据集预处理包括清理、格式化和去除数据集的噪音。

数据集预处理中涉及的一些最常见的活动如下。

  • 去除离群值。离群值是指偏离数据集中其他观测值的数据点。它确保我们有符合数据集预期行为的数据点。

  • 补足缺失值。数据集代入是用一些生成的值来替代数据集中的缺失值。它确保我们在将数据集送入模型之前有一个完整的数据集。

  • 数据集标准化。数据集标准化将数据集转换为符合特定范围/尺度的数据集。例如,你可以将数据集缩放到0-1或-1-1的范围内。它将确保我们的数据集数值的单位方差为1,平均值为0。

  • 处理分类变量。在处理分类值时,我们将分类数据转换成整数值。一热编码是执行这一过程的方法之一。

估算器

估算器将处理后的数据集作为输入,并将模型拟合到数据集中。然后,估算器对模型进行训练,该模型将被用来进行预测。

估算器是执行分类、回归和聚类的Scikit-learn算法。常见的估计器有Logistic回归、决策树分类器、K-NN聚类算法、Naive Bayes算法和随机森林分类器。

使用Scikit-learn管道的好处

  • 通过自动化实现更快的模型。
  • 它产生的模型具有非常高的准确度。
  • 模型调试,以消除模型训练期间的错误。
  • 产生一个更稳健和可扩展的模型。

使用的数据集

我们将使用包含其客户信息的电信数据集。这个数据集将训练一个客户流失模型。

下载数据集后,我们用Pandas加载数据集。要导入Pandas,请使用这个代码。

import pandas as pd

我们可以使用Pandas来加载数据集。

df=pd.read_csv("customer-churn-dataset")

我们将使用这个命令查看加载的数据集。

df

输出

Customer churn dataset

现在让我们开始使用Pandas剖析进行自动探索性数据分析。

使用Pandas Profiling进行自动探索性数据分析

要安装Pandas Profiling库,使用这个命令。

!pip install -U pandas-profiling

我们将使用Pandas Profiling来生成一个分析报告。该报告将给出数据集概述和数据集变量。

我们用这段代码生成剖析报告。

profile = ProfileReport(df, title='Churn Data Report', explorative=True)
profile.to_notebook_iframe()

生成的报告的标题将是Churn Data Report 。剖析报告将有以下部分。

概述

概述部分产生以下输出。

Dataset overview

从生成的报告来看,该数据集有21个变量和7043个观测值/数据点。该数据集没有缺失值和重复行。图片还显示了变量类型,即分类(13)、布尔(6)和数字(2)。

变量

这一部分显示了所有的数据集变量。此外,它还提供了关于这些变量的有用特征和信息。

下面的输出显示了一些重要的变量。

customerID和性别

CustomerID and Gender

SeniorCitizen和伴侣

SeniorCitizen and partner

受扶养人和任期

Dependents and tenure

互联网服务和在线安全

InternetService and OnlineSecurity

月费和总费用

Dependents and tenure

相互作用

互动部分的输出如下。

Interaction section

交互部分使用散点图显示两个变量之间的关系。例如,上面的图片显示了tenuremonthly charges 之间的关系。

相关性

相关性部分使用Seaborn的热图显示了数据集变量之间的关系。Pandas Profiling允许在四个主要的相关图之间进行切换。

这些图是Phik(φk)Kendall's τSpearman's ρ,和Pearson's r

相关性部分产生以下输出。

Correlations section

上面的图片显示了Phik (φk) 相关图。我们可以很容易地在四个主要的相关图之间进行切换来查看这些图。通过点击Toggle correlations descriptions 按钮,我们将查看每个相关图的详细描述。

缺失值

这一部分显示了数据集中是否有缺失值。

Misssing values

图片显示了每个变量的数据点的数量。所有的变量都有相同数量的数据点(7043)。这表明在数据集中没有缺失值。

样本

本节显示了我们的数据集的前10行和最后10行。

前10行

First 10 rows

最后10行

Last 10 rows

这标志着使用Pandas Profiling的自动探索性数据分析的结束。该库对我们的数据集进行了描述性分析,并更好地理解了流失率数据集。现在让我们指定我们数据集的X和Y变量。

X和y变量

X变量代表数据集中的所有独立变量,是模型的输入。y变量是因果关系,也就是模型的输出。

要添加X和y变量,请使用这段代码。

X = df.drop(columns=['Churn'])
y = df['Churn']

从上面的代码来看,Churn 变量是y 变量,其余的变量是X 变量。

数据集拆分

让我们导入用于数据集拆分的方法。

from sklearn.model_selection import train_test_split

我们将使用下面的代码把数据集分成两组。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=124)

我们使用上面代码中的test_size=0.30 ,这是拆分比例。70%的数据集将用于模型训练,30%用于模型测试。

变量类型

使用Pandas Profiling,我们能够看到数据集有三种变量类型。这些变量类型是:分类型(13),布尔型(6)和数字型(2)。

我们需要指定属于这些变量类型的列。我们使用下面的代码。

numeric_features = ['tenure', 'TotalCharges']
categorical_features = ['SeniorCitizen', 'Partner', 'Dependents', 'PhoneService', 'InternetService','OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','StreamingTV','StreamingMovies','Contract']

该代码选择了具有分类和数字值的列。

选择未使用的列

我们使用下面的代码选择所有未使用的列。

drop_feat= ['customerID','gender','PhoneService','MultipleLines', 'PaperlessBilling','PaymentMethod']

我们将从我们的数据集中删除被选中的列。为了删除这个列,我们将使用Scikit-learn管道转化器的方法之一。让我们首先导入所有的转换器方法和类。

导入转化器方法和类

如前所述,Scikit-learn Pipeline步骤有两个类别。变换器和估算器。管道将有一连串的转化器,然后是最后的估算器。

我们使用各种Sckit-learn方法和类来创建转化器,这些方法和类进行数据转化。让我们导入所有我们将在本教程中使用的转化器方法和类。

from sklearn.compose import ColumnTransformer 
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

从上面的代码中,我们已经导入了以下转化器方法。

  • ColumnTransformer:它是一个Scikit-learn类,将转换器应用于我们的列。它还将各种转化器合并为一个转化器。
  • SimpleImputer:它是一个Scikit-learn类,用来计算缺失值。它将用一些生成的值替换数据集中的缺失值。
  • StandardScaler:它执行数据集的标准化。它将确保我们的数据集数值的单位方差为1,平均值为0。

OneHotEncoder:它执行分类编码。该方法使用one-hot方案将分类数据转换为整数值。

现在让我们使用这些方法创建我们的第一个转换器。

丢弃列变换器

第一个转化器将删除未使用的列。

drop_transformer = ColumnTransformer(transformers=[('drop_columns', 'drop', drop_feat)], remainder='passthrough')

这些未使用的列在drop_feat 变量中。remainder='passthrough' 将使模型能够使用数据集中的剩余列。

然后我们将把drop_transformer 添加到Pipeline 类中。然而,首先,让我们从Scikit-learn导入Pipeline 类。

导入 "管道 "类

我们导入Pipeline 类,如下所示。

from sklearn.pipeline import Pipeline

Pipeline 组装了所有初始化的变换器和最终的估计器。然后,它将它们作为一个单一的过程来执行,产生一个最终的模型。

要添加drop_transformer ,请使用这段代码。

pipeline = Pipeline([('drop_column', drop_transformer)])

接下来,我们拟合管道。

pipeline.fit(X_train)

它将模型拟合到训练集上。它产生以下输出。

ColumnTransformer

输出显示drop_transformer 添加到Pipeline 类中。下一步是使用transform 方法来删除未使用的列。

transformed_train=pipeline.transform(X_train)

要看到转换后的数据集,请使用这段代码。

transformed_train

输出结果如下所示。

Dropped columns

数值变换器

数字变换器将进行数据的归纳和标准化。

要初始化这些转化器,请使用这段代码。

numeric_transformer = Pipeline(steps=[
                                     ('meanimputer', SimpleImputer(strategy='mean')),
                                     ('stdscaler', StandardScaler())
                                     ])

从上面的代码中,SimpleImputer 将执行数据归类。strategy='mean' 使用每一列中生成的平均值来替换缺失值。StandardScaler() 方法执行数据标准化。

分类转化器

它将处理数据集中的分类值。然后,我们将使用OneHotEncoder 方法将分类数据转换成整数值。

categorical_transformer = Pipeline(steps=[
                                         ('onehotenc', OneHotEncoder(handle_unknown='ignore'))
                                         ])

然后,我们将这些初始化的变换器结合起来。

合并初始化的变换器

我们使用下面的代码。

col_transformer = ColumnTransformer(transformers=[('drop_columns', 'drop', drop_feat),
                                                   ('numeric_processing',numeric_transformer, numeric_features),
                                                    ('categorical_processing', categorical_transformer, categorical_features)
                                                  ], remainder='drop')

我们使用ColumnTransformer 来组合所有的初始化变换器。numeric_processing 转化为numeric_features ,而categorical_processing 转化为categorical_features 。我们将最后的变换器保存在col_transformer 变量中。

让我们把它添加到Pipeline 类中。

添加'col_transformer'变换器

要将col_transformer添加到Pipeline 类中,请使用此代码。

pipeline = Pipeline([('transform_column', col_transformer)])

接下来,我们将管道拟合到训练集上。

pipeline.fit(X_train)

它产生了以下输出。

Added transfomers

上面的图片显示了所有添加的转化器。下一步是使用transform 方法,将变压器应用到列中。

应用变换器

transformed_train=pipeline.transform(X_train)

要查看转换后的数据集,请使用此代码。

pd.DataFrame(transformed_train)

Transformed dataset

将变换器应用于测试数据集

使用这段代码。

pipeline.transform(X_test)

要查看转换后的测试数据集,请使用这段代码。

Transformed test dataset

添加最终估算器

Scikit-learn管线的最后一步是添加一个估计器。估计器是一种训练机器学习模型的算法。我们将使用LogisticRegression 作为估计器。

from sklearn.linear_model import LogisticRegression

要在Pipeline 类中添加估计器,请使用这段代码。

pipeline = Pipeline([
                     ('transform_column', col_transformer),
                     ('logistics', LogisticRegression())
                    ])

从上面的图片来看,Pipeline 类有所有的转化器(col_transformer)和最后的估计器(LogisticRegression)。

让我们将模型拟合到数据集中。

拟合管道

要拟合管道,请使用这段代码。

pipeline.fit(X_train, y_train)

该管道将识别训练集中的模式。

获取训练集上的准确度分数

为了得到准确率分数,使用下面的代码。

pipeline.score(X_train, y_train)

输出如下所示。

0.7953346855983773

这是一个很好的准确性分数,表明该模型有79.533%的机会做出正确的预测。

让我们使用测试集来评估该模型。

在测试集上获得准确率得分

我们用下面的代码得到准确率分数。

pipeline.score(X_test, y_test)

输出如下所示。

0.8078561287269286

当我们比较这两个准确性分数时,测试集上的准确性分数更好。这表明该模型在使用测试集时仍然表现良好,这对该模型来说是新的。

总结

在本教程中,我们学习了如何使用Pandas Profiling和Scikit-learn Pipeline建立一个机器学习模型。该教程解释了Scikit-learn管道如何工作以及关键的管道步骤。Pandas Profiling生成了一份概况报告,显示了数据集的概况。

在这个过程之后,我们使用Scikit-learn的转化器方法和类来实现我们的转化器。然后,我们将这些转化器堆叠在一起,另一个是添加了一个最终的估计器。最后,我们使用电信数据集来训练客户流失模型。