目录
相关性
另一个衡量特征之间相互关系的非常有用的方法是相关性。你的模型通常只包括与目标高度相关的特征。然而,检查特征之间的相关性几乎同样重要;包括高度相关的特征(即,共线性的)可能会导致你的模型行为不可预测,或者可能会不必要地使它复杂化。
在 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 美元间隔处发生的一些条纹模式外,没有显示出特定的模式。