使用Pandas分析和Scikit-learn管道进行机器学习
Pandas剖析是一个Python库,可以执行自动探索性数据分析。它可以自动生成一份数据集剖析报告,提供有价值的见解。例如,我们可以通过剖析报告知道哪些变量可以使用,哪些变量可以放弃。
机器学习管道被用来自动化机器学习的开发阶段。这些阶段是数据集摄取、数据集预处理、特征工程、模型训练、模型评估、做出预测和模型部署。
一个机器学习管道是由多个初始化步骤组成的。它使用这些步骤来实现机器学习开发阶段的自动化。这些步骤是按顺序初始化的,所以一个步骤的输出被用作下一个步骤的输入。因此,为了更快地实现模型,管道步骤需要被很好地组织起来。
许多库支持机器学习管道的实施。我们将重点讨论Scikit-Learn库。该库提供了一个管道类,可以自动进行机器学习。我们将使用Pandas Profiling和Scikit-learn Pipeline建立一个客户流失模型。
前提条件
要跟上这篇文章,读者应该。
- 知道如何建立一个[机器学习模型]
- 知道如何实现[Scikit-learn算法]
- 理解[机器学习的工作流程]
- 理解[数据集预处理的步骤]
Scikit-learn管道如何工作
Scikit-learn Pipeline是一个强大的工具,它能使机器开发阶段自动化。它有一连串的转换方法,然后是一个模型估计函数,作为一个单一的过程组装和执行,以产生一个最终模型。
Scikit-learn Pipeline的步骤分为两类。
- 变换器。
- 估算器。
变换器
这个步骤包含所有执行数据转换的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
输出

现在让我们开始使用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 。剖析报告将有以下部分。
概述
概述部分产生以下输出。

从生成的报告来看,该数据集有21个变量和7043个观测值/数据点。该数据集没有缺失值和重复行。图片还显示了变量类型,即分类(13)、布尔(6)和数字(2)。
变量
这一部分显示了所有的数据集变量。此外,它还提供了关于这些变量的有用特征和信息。
下面的输出显示了一些重要的变量。
customerID和性别

SeniorCitizen和伴侣

受扶养人和任期

互联网服务和在线安全

月费和总费用

相互作用
互动部分的输出如下。

交互部分使用散点图显示两个变量之间的关系。例如,上面的图片显示了tenure 和monthly charges 之间的关系。
相关性
相关性部分使用Seaborn的热图显示了数据集变量之间的关系。Pandas Profiling允许在四个主要的相关图之间进行切换。
这些图是Phik(φk),Kendall's τ,Spearman's ρ,和Pearson's r。
相关性部分产生以下输出。

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

图片显示了每个变量的数据点的数量。所有的变量都有相同数量的数据点(7043)。这表明在数据集中没有缺失值。
样本
本节显示了我们的数据集的前10行和最后10行。
前10行

最后10行

这标志着使用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)
它将模型拟合到训练集上。它产生以下输出。

输出显示drop_transformer 添加到Pipeline 类中。下一步是使用transform 方法来删除未使用的列。
transformed_train=pipeline.transform(X_train)
要看到转换后的数据集,请使用这段代码。
transformed_train
输出结果如下所示。

数值变换器
数字变换器将进行数据的归纳和标准化。
要初始化这些转化器,请使用这段代码。
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)
它产生了以下输出。

上面的图片显示了所有添加的转化器。下一步是使用transform 方法,将变压器应用到列中。
应用变换器
transformed_train=pipeline.transform(X_train)
要查看转换后的数据集,请使用此代码。
pd.DataFrame(transformed_train)

将变换器应用于测试数据集
使用这段代码。
pipeline.transform(X_test)
要查看转换后的测试数据集,请使用这段代码。

添加最终估算器
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的转化器方法和类来实现我们的转化器。然后,我们将这些转化器堆叠在一起,另一个是添加了一个最终的估计器。最后,我们使用电信数据集来训练客户流失模型。