用于数据挖掘的化整为零策略(Split-Apply-Combine)

小皮飞 2018-10-26

在典型的探索性数据分析中,我们通过在某个粒度级别上划分数据集,然后在该粒度上聚合数据,以了解集中趋势,从而解决这个问题。同样,Hadley Wickham撰写的著名(必读)论文将Split-Apply-Combine策略概述为数据分析中最常见的策略之一。无论是营销细分还是任何行为研究,我们在分析过程中都会使用这种技术。

本文试图说明Split-Apply-Combine策略,其中我们将一个大问题分解为小的可管理部分(Split),独立操作每个部分(Apply)然后将所有部分重新组合在一起(Combine)。通过在SQL和Python中使用GroupBy函数,在Tableau中使用LOD,以及在R中使用plyr函数,许多现有工具都可以使用Split-Apply-Combine。在本文中,我们将不仅仅讨论这种策略的实现,还将看到这种策略在机器学习特征工程中的一些相关应用。

在Python中,我们使用GroupBy执行此操作,它涉及Split-Apply-Combine策略的三个步骤中的一个或多个步骤。让我们从定义以下三个步骤开始:

用于数据挖掘的化整为零策略(Split-Apply-Combine)

使用聚合函数显示Split-Apply-Combine

  1. Split:根据某些条件将数据拆分为组,从而创建GroupBy对象。(我们可以使用列或列的组合将数据拆分成组)
  2. Apply:分别对每个组应用一个函数。(在此步骤中聚合、transform或过滤数据)
  3. Combine:将结果组合成数据结构(Pandas系列,Pandas DataFrame)

示例数据

为了更深入,让我们创建一个虚拟数据作为示例。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

以具有键值对的字典形式创建示例数据集。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

用于数据挖掘的化整为零策略(Split-Apply-Combine)

data_sales

为了总结整个数据,我们将使用seaborn库来创建可视化。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

用于数据挖掘的化整为零策略(Split-Apply-Combine)

可视化数据摘要

在创建和汇总数据之后,作为第一步,我们将继续进行Split-Apply-Combine的第一部分。

Split :

在此步骤中,我们将通过基于“颜色”列进行分组,从dataframe “data_sales”创建组。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

一旦我们在dataframe上应用groupby()函数,它就会创建groupby对象。我们可以将这个对象看作是每个组的一个单独的dataframe。每个组都是基于分组列中的类别创建的(在我们的例子中,从dataframe的“colour”列中创建4个组,分别是 ‘Black’, ‘Blue’, ‘Red’, ’Yellow’ )。

GroupBy对象以键值对的形式存储各个组的数据,如dictionary中所示。要知道组名,我们可以使用attribute ' keys '或使用GroupBy对象的' groups '属性。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

为了进一步明确组及其内容,我们可以运行循环并打印键值对。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

通过上面的例子,我希望我们已经对GroupBy对象以及它的一些属性和方法进行了一些清晰的说明。有了这个,现在让我们继续前进到下一个阶段,即APPLY。

Apply:

Apply步骤可以通过三种方式执行:聚合,transform和过滤。

聚合:

在由多列创建的组中聚合:

通过选择多列来创建组,我们可以增加聚合的粒度。例如,在Split时,我们根据“colour”列创建了4个组,其中有4个颜色类别,因此我们有4个组。现在,如果包含'product'列,有2个类别('type A'和'type B'),以及'colour'列,那么我们将有8个类别(例如'type A-Blue', 'A-Black'..总共(4 x 2)。从下面提到的代码中可以更清楚地看出这一点。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

上面的代码使用sum(),因此我们得到销售和事务的总和到由'product'和'color'列组合定义的粒度级别。

需要注意的是,我们使用了参数'as_index = True',因此我们可以看到'product'和'color'列作为索引。相反,如果我们采用与False相同的参数,那么在我们的输出中,我们不会将'product'和'color'列作为索引而是作为列。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

自定义聚合按多列分组

在上面的例子中,我们只对所有列使用了单一类型的聚合函数; 但是,如果我们想要聚合具有不同聚合函数的不同列,那么我们可以使用聚合函数的自定义聚合函数。为此,我们可以将字典传递给聚合函数,将列名称称为“键”,将函数名称称为“值”。有趣的是,我们也可以将多个聚合函数传递给列。让我们看一下下面的示例代码,以便更清晰。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

真实世界的聚合函数应用:

在这个例子中,我们试图找到“哪一种产品及其颜色组合的变异最小”。我们已经这样做了,根据乘积和颜色列对dataframe进行分组,然后计算每组的变异系数。下面的Python代码将使它更清晰。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

transform:

变换函数在机器学习的特征工程中具有很高的潜在效用。它是与GroupBy对象一起使用的函数/方法。如果有人使用了Tableau LOD(固定)函数,那么他们将更容易理解变换函数。下图说明了使用变换函数的Split-Apply-Combine。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

Split-Transform-Combine

聚合过程中我们看到的形状输入dataframe得到减少(减少)的行数;但是,需要注意的是,在使用transform方法时,产生的输出dataframe在输出中的行数与在输入中的行数相同。输出保留了dataframe的长度,它分两个阶段进行。首先,在Apply阶段,应用了变换函数(sum();如图所示),并且在此阶段减少了行数。其次,在combine阶段,将Apply阶段的结果广播到原始粒度级别,从而产生具有与输入阶段中的dataframe的长度相同的长度的dataframe。

为了更清楚,我们可以使用我们在本文中使用的相同虚构数据集的示例代码。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

从现在开始我们对转换函数有了一些了解,现在让我们谈谈它在机器学习数据清理和机器学习特征工程中的实用性。

我们可以定义一个自定义函数并使用它来转换列。例如,我们可以通过变换函数使用基于组类别的列标准化的常见示例。需要注意的是,此标准化不是直接应用于整个列,而是基于组应用于列(平均值是组平均值,std dev是组的std dev)。下面的例子将更多地阐述这个概念。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

在上面的代码中,我们使用了lambda函数,在lambda函数中,我们在dataframe的每一行使用了两个方法mean和standard deviation(std)。这里可能会产生一种混淆,即“当它意图进行分组计算时,变换函数如何进行行计算?”。看下Python的示例代码。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

我希望从上面的代码中可以清楚地看到转换操作。我们现在应该转到Apply部分的Filter操作。

过滤:

从名称本身可以看出,它用于从dataframe中过滤组。下面提到的Python代码说明了操作。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

过滤很容易理解操作,SPLIT-APPLY-COMBINE的 APPLY部分即将结束。现在,我们将转到最后一部分,即COMBINE。

COMBINE:

在上述讨论中,联合部分已经涵盖; 但是,有一点很重要,我想分享一下。

用于数据挖掘的化整为零策略(Split-Apply-Combine)

聚合并不总是导致dataframe的创建。它主要取决于参数'as_index',如果此参数的值为'True',则它取决于我们应用聚合函数的列数。

我希望这些代码和相关讨论不仅可以帮助读者更好地直观地理解Split-Apply-Combine策略,还可以帮助读者在数据挖掘中应用这种技术。

相关推荐