11)再次获取数据集的列名,具体实现代码如下所示。

Index(['Address', 'FLAG', 'Avg min between sent tnx', 'Avg min between received tnx', 'Time Diff between first and last (Mins)', 'Sent tnx', 'Received Tnx', 'Number of Created Contracts', 'Unique Received From Addresses', 'Unique Sent To Addresses', 'min value received', 'max value received ', 'avg val received', 'min val sent', 'max val sent', 'avg val sent', 'min value sent to contract', 'max val sent to contract', 'avg value sent to contract', 'total transactions (including tnx to create contract', 'total Ether sent', 'total ether received', 'total ether sent contracts', 'total ether balance', ' Total ERC20 tnxs', ' ERC20 total Ether received', ' ERC20 total ether sent', ' ERC20 total Ether sent contract', ' ERC20 uniq sent addr', ' ERC20 uniq rec addr', ' ERC20 uniq sent addr.1', ' ERC20 uniq rec contract addr', ' ERC20 min val rec', ' ERC20 max val rec', ' ERC20 avg val rec', ' ERC20 min val sent', ' ERC20 max val sent', ' ERC20 avg val sent', ' ERC20 uniq sent token name', ' ERC20 uniq rec token name'],dtype='object')

12)根据指定的相关性阈值(0.7),选择相关性超过阈值的列,并将这些列的名称存储在 to_drop 列表中。最后,打印输出需要删除的列数。具体实现代码如下所示。

# 阈值设置为0.7threshold = 0.7# 选择相关性超过阈值的列to_drop = [column for column in upper.columns if (any(upper[column] > threshold) or any(upper[column] < -(threshold)))]# 打印要删除的列数print('有 %d 列需要删除。' % (len(to_drop)))

执行后会输出:

There are 13 columns to remove.

13)列表to_drop 包含了根据相关性阈值需要删除的列的名称,可以通过输出 to_drop 列表来查看这些列的名称。具体实现代码如下所示。

to_drop

执行后将输出显示需要删除的列的名称;

['avg value sent to contract', 'total transactions (including tnx to create contract', 'total ether received', 'total ether sent contracts', ' ERC20 uniq sent addr', ' ERC20 uniq rec addr', ' ERC20 max val rec', ' ERC20 avg val rec', ' ERC20 min val sent', ' ERC20 max val sent', ' ERC20 avg val sent', ' ERC20 uniq sent token name', ' ERC20 uniq rec token name']

(14)创建数值的热图,以可视化数据集中各个数值列之间的相关性。热图使用不同的颜色表示相关性的强度,正相关和负相关分别以不同的颜色显示,并在热图上标注相关性系数的数值。具体实现代码如下所示。

# 创建数值值的热图# 创建一个与相关性矩阵相同大小的全零矩阵,并在上三角部分设置为True,以遮盖下三角部分mask = np.zeros_like(corr)mask[np.triu_indices_from(mask)] = True# 使用白色背景风格创建图形with sns.axes_style('white'):# 创建图形和轴对象fig, ax = plt.subplots(figsize=(30, 20))# 生成热图,显示相关性矩阵,使用RdYlGn颜色图,以0为中心,方形显示,标注数值sns.heatmap(corr, mask=mask, annot=True, cmap='RdYlGn', center=0, square=True, fmt='.2g')

执行后会绘制相关性矩阵的热图(heatmap),如图11-3所示。这种图以矩阵的形式展示各个数值列之间的相关性,使用不同颜色表示相关性的强度,正相关和负相关分别以不同的颜色显示。这种图表有助于可视化数据集中各个数值属性之间的关系,特别是相关性的强弱和方向。通过热图,可以快速识别哪些属性之间存在强相关性,从而帮助进一步的数据分析和建模工作。

11-3 相关性矩阵的热图

(15)根据 to_drop 列表删除指定的列,并通过输出 dataset.columns 来显示删除列后的列名,被删除的列将不再包含在数据集中。具体实现代码如下所示。

# 要删除的列drop = ['total transactions (including tnx to create contract','max val sent to contract',' ERC20 avg val rec',' ERC20 max val rec', ' ERC20 avg val sent', ' ERC20 min val sent', ' ERC20 max val sent',' ERC20 uniq sent token name',' ERC20 uniq sent token name',' ERC20 uniq rec token name','max val sent to contract','avg value sent to contract']# 删除指定的列dataset.drop(to_drop, axis=1, inplace=True)# 显示删除列后的列名dataset.columns

执行后会输出:

Index(['Address', 'FLAG', 'Avg min between sent tnx','Avg min between received tnx','Time Diff between first and last (Mins)', 'Sent tnx', 'Received Tnx','Number of Created Contracts', 'Unique Received From Addresses','Unique Sent To Addresses', 'min value received', 'max value received ','avg val received', 'min val sent', 'max val sent', 'avg val sent','min value sent to contract', 'max val sent to contract','total Ether sent', 'total ether balance', ' Total ERC20 tnxs',' ERC20 total Ether received', ' ERC20 total ether sent',' ERC20 total Ether sent contract', ' ERC20 uniq sent addr.1',' ERC20 uniq rec contract addr', ' ERC20 min val rec'],dtype='object')

16)在删除指定的列后,数据集中的列数将发生变化,接下来可以使用以下代码来获取删除列后的列数:

len(dataset.columns)

执行后会输出:

27

17)绘制相关性矩阵的热图,用不同颜色表示不同属性之间的相关性强度。正相关和负相关分别以不同颜色显示,而且相关系数的数值也被标注在热图上,以帮助更好地理解数据属性之间的关系。具体实现代码如下所示。

# 计算数值列之间的相关性矩阵corr = dataset.corr()# 创建一个与相关性矩阵相同大小的全零矩阵,并在上三角部分设置为True,以遮盖下三角部分mask = np.zeros_like(corr)mask[np.triu_indices_from(mask)] = True# 使用白色背景风格创建图形with sns.axes_style('white'):# 创建图形和轴对象fig, ax = plt.subplots(figsize=(30, 20))# 生成热图,显示相关性矩阵,使用RdYlGn颜色图,以0为中心,方形显示,标注数值sns.heatmap(corr, mask=mask, annot=True, cmap='RdYlGn', center=0, square=True, fmt='.2g')

执行后会绘制数值属性相关性热图,如图11-4所示,

11-4 数值属性相关性热图

(18)绘制箱线图,可以分别绘制变量的箱线图以及带有 FLAG 对比的变量的箱线图。函数中的参数 variable 是要绘制箱线图的变量名称。此外,通过 columns 变量获取了数据集的列名。最后,获取数据集中从第三列开始(索引为2)的所有列名。具体实现代码如下所示。

# 绘制变量的箱线图def box_plot(variable):plt.figure(figsize=(6,4))sns.boxplot(y=dataset[variable])plt.title("Boxplot for {}".format(variable))plt.show()# 绘制带有 FLAG 对比的变量的箱线图def box_plot_y(variable):plt.figure(figsize=(6,4))sns.boxplot(y=dataset[variable], x=dataset['FLAG'])plt.title("Boxplot for {} wrt Flag".format(variable))plt.show()# 获取数据集的列名columns = dataset.columnscolumnscolumns[2:]

执行后会输出:

Index(['Address', 'FLAG', 'Avg min between sent tnx', 'Avg min between received tnx', 'Time Diff between first and last (Mins)', 'Sent tnx', 'Received Tnx', 'Number of Created Contracts', 'Unique Received From Addresses', 'Unique Sent To Addresses', 'min value received', 'max value received ', 'avg val received', 'min val sent', 'max val sent', 'avg val sent', 'min value sent to contract', 'max val sent to contract', 'total Ether sent', 'total ether balance', ' Total ERC20 tnxs', ' ERC20 total Ether received', ' ERC20 total ether sent', ' ERC20 total Ether sent contract', ' ERC20 uniq sent addr.1', ' ERC20 uniq rec contract addr', ' ERC20 min val rec'],dtype='object')

19)针对数据集中每个数值列的箱线图绘制,进行了单变量分析。具体实现代码如下所示。

# 单变量分析 - 绘制每个数值列的箱线图for col in columns[2:]:box_plot(col)

上述代码通过循环遍历数据集中从第三列开始的每个数值列,并为每个列绘制了一个箱线图,例如列“Sent_tnx”的箱线图效果如图11-5所示。箱线图有助于显示数据的分布、中位数、上下四分位数以及异常值的情况,从而帮助了解每个变量的统计特性。

11-5 列“Sent_tnx”的箱线图

20)执行了带有 FLAG 对比的箱线图绘制,为数据集中从第三列开始的每个数值列绘制了箱线图。具体实现代码如下所示。

for col in columns[2:]:box_plot_y(col)

执行后会绘制与数据集中每个数值列相关的箱线图,并将它们与 FLAG 列进行了对比。具体绘制了多少个箱线图取决于数据集中数值列的数量,例如列“Sent_tnx”的带有 FLAG 对比的箱线图效果如图11-6所示。这些箱线图可以帮助您了解每个数值列在欺诈和非欺诈交易之间的分布情况和差异。

11-6 列“Sent_tnx”的带有 FLAG 对比的箱线图

(21)计算训练数据集中 “FLAG” 列值为 1 的占比,即欺诈交易的百分比。具体计算方式是将 “FLAG” 列中值为 1 的行数除以总行数,然后将结果乘以 100,得到百分比。具体实现代码如下所示。

fraud = (sum(dataset['FLAG'])/len(dataset['FLAG'].index))*100fraud

在上述代码中,将计算的结果存储在变量fraud,然后使用第2行代码查看欺诈交易的百分比。执行后会输出:

22.14205873386851

未完待续