Bootstrap

【pyspark学习从入门到精通13】准备建模数据_4

目录

相关性

可视化

直方图

特征之间的交互


相关性

另一个衡量特征之间相互关系的非常有用的方法是相关性。你的模型通常只包括与目标高度相关的特征。然而,检查特征之间的相关性几乎同样重要;包括高度相关的特征(即,共线性的)可能会导致你的模型行为不可预测,或者可能会不必要地使它复杂化。

在 PySpark 中,一旦你的数据以 DataFrame 形式存在,计算相关性就非常容易。唯一的困难是 .corr(...) 方法目前支持皮尔逊相关系数,并且它只能计算成对的相关性,例如以下情况:

fraud_df.corr('balance', 'numTrans')

为了创建相关性矩阵,你可以使用以下脚本:

n_numerical = len(numerical)
corr = []
for i in range(0, n_numerical):
 temp = [None] * i
 
 for j in range(i, n_numerical):
 temp.append(fraud_df.corr(numerical[i], numerical[j]))
 corr.append(temp)

前面的代码将创建以下输出:

如你所见,在信用卡欺诈数据集中,数值特征之间的相关性几乎不存在。因此,如果这些特征在统计上能够合理解释我们的目标,它们就可以用在我们的模型中。

检查了相关性之后,我们现在可以继续直观地检查我们的数据。

可视化

有多种可视化包,但在本节中我们将专门使用 matplotlib 和 Bokeh,为你提供最好的工具。

这两个包都预装在 Anaconda 中。首先,让我们加载模块并设置它们:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
import bokeh.charts as chrt
from bokeh.io import output_notebook
output_notebook()

%matplotlib inline 和 output_notebook() 命令将使使用 matplotlib 或 Bokeh 生成的每个图表在笔记本中显示,而不是作为一个单独的窗口。

直方图

直方图到目前为止是直观评估你的特征分布的最简单方法。在 PySpark(或 Jupyter 笔记本)中有三种方法可以生成直方图:

- 在工作节点中聚合数据,并返回聚合的直方图每个箱的列表和计数到驱动程序
- 将所有数据点返回到驱动程序,并允许绘图库的方法为你完成工作
- 对数据进行抽样,然后返回它们到驱动程序进行绘图。

如果你的数据集的行数以十亿计,那么第二个选项可能无法实现。因此,你需要先聚合数据:

hists = fraud_df.select('balance').rdd.flatMap(
 lambda row: row
).histogram(20)

要绘制直方图,你可以简单地调用 matplotlib,如下所示的代码:

data = {
 'bins': hists[0][:-1],
 'freq': hists[1]
}
plt.bar(data['bins'], data['freq'], width=2000)
plt.title('Histogram of \'balance\'')

这将生成以下图表:

以类似的方式,可以使用 Bokeh 创建直方图:

b_hist = chrt.Bar(
 data, 
 values='freq', label='bins', 
 title='Histogram of \'balance\'')
chrt.show(b_hist)

由于 Bokeh 在后台使用 D3.js,生成的图表是交互式的:

如果你的数据足够小,可以适应驱动程序(尽管我们认为通常使用前一种方法会更快),你可以获取数据并使用 .hist(...)(来自 matplotlib)或 .Histogram(...)(来自 Bokeh)方法:

data_driver = {
 'obs': fraud_df.select('balance').rdd.flatMap(
 lambda row: row
 ).collect()
}
plt.hist(data_driver['obs'], bins=20)
plt.title('Histogram of \'balance\' using .hist()')
b_hist_driver = chrt.Histogram(
 data_driver, values='obs', 
 title='Histogram of \'balance\' using .Histogram()', 
 bins=20
)
chrt.show(b_hist_driver)

这将为 matplotlib 生成以下图表:

对于 Bokeh,将生成以下图表:

特征之间的交互

散点图允许我们一次性可视化最多三个变量之间的交互(尽管本节我们只展示二维交互)。
由于 PySpark 没有在服务器端提供任何可视化模块,并且尝试同时绘制数十亿次观测值会非常不切实际,在本节中我们将对数据集进行 0.02% 的抽样(大约 2,000 个观测值)。

在这个例子中,我们将在给定 'gender' 作为分层的情况下,对我们的欺诈数据集进行 0.02% 的抽样:

data_sample = fraud_df.sampleBy(
 'gender', {1: 0.0002, 2: 0.0002}
).select(numerical)

为了一次性放入多个二维图表,你可以使用以下代码:

data_multi = dict([
 (elem, data_sample.select(elem).rdd \
 .flatMap(lambda row: row).collect()) 
 for elem in numerical
])
sctr = chrt.Scatter(data_multi, x='balance', y='numTrans')
chrt.show(sctr)

前面的代码将生成以下图表:

如你所见,有很多欺诈交易的余额为 0,但许多交易——即,一张新卡和交易的大峰值。然而,除了在 1,000 美元间隔处发生的一些条纹模式外,没有显示出特定的模式。
 

;