Press "Enter" to skip to content

从Python到Julia:基本数据操作和探索性数据分析

作者提供的图片

作为统计计算领域的新兴编程语言,Julia 近年来变得越来越受关注。有两个特点使得 Julia 比其他编程语言更为优越。

  • Julia 像 Python 一样是一种高级语言。因此,它易于学习和使用。
  • Julia 是一种编译语言,旨在与 C/C++ 一样快。

当我第一次了解 Julia 时,我被它的计算速度所吸引。因此,我决定尝试使用 Julia,并看看我是否可以在我的日常工作中实际使用它。

作为一名数据科学从业者,我使用 Python 为各种目的开发原型 ML 模型。为了快速学习 Julia,我将模仿使用 Python 和 Julia 构建简单 ML 模型的常规流程。通过并排比较 Python 和 Julia 代码,我可以轻松捕捉两种语言的语法差异。这就是本文接下来的安排。

安装

在开始之前,我们需要在我们的工作站上安装 Julia。Julia 的安装需要以下两个步骤。

  • 从官方网站下载安装文件。
  • 解压安装文件并创建指向 Julia 二进制文件的符号链接。

以下博客提供了安装 Julia 的详细指南。

在 Ubuntu 上安装 Julia

在 Ubuntu 上安装 Julia 并将内核添加到 Jupyter 的快速教程

小猪AI.com

数据集

我将使用从 Kaggle 获取的信用卡欺诈检测数据集。该数据集包含 284,807 笔交易中的 492 笔欺诈。总共有 30 个特征,包括交易时间、金额和使用 PCA 获得的 28 个主要组件。交易的“类”是要预测的目标变量,它表示交易是否为欺诈。

与 Python 类似,Julia 社区开发了各种包来支持 Julia 用户的需求。这些包可以使用 Julia 的软件包管理器 Pkg 安装,它相当于 Python 的 pip

我使用的欺诈检测数据是典型的 .csv 格式。要将 csv 数据加载为 Julia 中的 dataframe,需要导入 CSVDataFrame 包。DataFrame 包可以视为 Julia 中的 Pandas 等价物。

将结构化数据加载为 dataframe — Julia 实现

以下是导入的数据的样子。

作者提供的图片

在 Jupyter 中,加载的数据集可以显示为上面的图像。如果您想查看更多列,则可以快速设置环境变量 ENV["COLUMNS"] 。否则,只会显示少于 10 列。

等效的 Python 实现如下。

将结构化数据加载为 dataframe — Python 实现(作者提供的图片)

探索性数据分析(EDA)

探索性分析允许我们检查数据质量并发现特征之间的模式,这对于特征工程和训练 ML 模型非常有用。

基本统计

我们可以从计算一些特征的简单统计信息开始,比如均值、标准差。与 Python 中的 Pandas 类似,Julia 的 DataFrame 包提供了一个 describe 函数用于此目的。

使用 Julia 的 describe 函数生成基本统计信息(作者提供的图像)

通过 describe 函数,我们可以生成 12 种基本统计信息。通过更改 :all 参数,例如 describe(df, :mean, :std),我们可以选择要生成哪种统计信息。有点烦人的是,即使设置了可显示列的上限,describe 函数也会不断省略统计信息的显示,除非我们指定 :all。这是 Julia 社区未来可以解决的问题。

Julia 省略打印指定的统计信息 :-/(作者提供的图像)

分类平衡

欺诈检测数据集通常会受到极端类别不平衡的问题影响。因此,我们想要了解两类数据之间的分布情况。在 Julia 中,可以通过应用“split-apply-combine”函数来完成,这相当于 Python 中 Pandas 的“groupby-aggregate”函数。

检查类别分布 — Julia 实现(作者提供的图像)

在 Python 中,我们可以使用 value_counts() 函数来实现相同的目的。

检查类别分布 — Python 实现(作者提供的图像)

单变量分析

接下来,让我们使用直方图来了解特征的分布情况。特别是我们以交易金额和时间为例,因为它们是数据集中唯一可以解释的特征。

在 Julia 中,有一个方便的库叫做 StatsPlots,它允许我们绘制各种常用的统计图形,包括直方图、条形图、箱形图等等。

以下代码在两个子图中绘制了交易金额和时间的直方图。可以发现,交易金额高度偏斜。对于大多数交易,交易金额都在 100 美元以下。交易时间遵循双峰分布。

绘制交易时间和交易金额的分布 — Julia 实现

绘制交易时间和交易金额的分布 — Julia 实现(作者提供的图像)

在 Python 中,我们可以使用 matplotlib 和 seaborn 创建相同的图表。

绘制交易时间和交易金额的分布 — Python 实现(作者提供的图像)

双变量分析

虽然上述单变量分析向我们展示了交易金额和时间的一般模式,但它并没有告诉我们它们与待预测的欺诈标志之间的关系。为了快速概述特征和目标变量之间的关系,我们可以创建一个相关矩阵,并使用热图可视化它。

在创建相关矩阵之前,我们需要注意到我们的数据高度不平衡。为了更好地捕捉相关性,需要对数据进行下采样,以便特征的影响不会因为数据不平衡而被“稀释”。这个练习需要对数据框进行切片和连接。以下代码演示了在Julia中实现下采样的方法。

在Julia中对数据进行下采样(作者提供的图像)

上述代码计算欺诈交易的数量,并将欺诈交易与相同数量的非欺诈交易合并。接下来,我们可以创建热力图来可视化相关矩阵。

绘制热力图以可视化相关矩阵——Julia实现

生成的热力图如下所示。

由Julia绘制的特征相关热力图(作者提供的图像)

下面是在Python中实现下采样和绘制热力图的等效实现。

在Python中进行下采样和绘制相关热力图的实现(作者提供的图像)

在对特征相关性有了概览后,我们希望深入研究与目标变量(在此情况下为“Class”)具有显著相关性的特征。从热力图中可以观察到,以下PCA转换特征与“Class”呈正相关关系:V2、V4、V11、V19,而带有负相关关系的特征包括V10、V12、V14、V17。我们可以使用箱线图来检查这些突出特征对目标变量的影响。

在Julia中,可以使用前面提到的StatsPlots包创建箱线图。这里,我使用与“Class”呈正相关的4个特征作为示例,说明如何创建箱线图。

创建箱线图以可视化特征对“Class”的影响——Julia实现

这里的@df作为一个宏,表示在目标数据集(即balanced_df)上创建一个箱线图。生成的图如下所示。

呈正相关的特征的箱线图(作者提供的图像)

下面的代码可用于在Python中创建相同的箱线图。

创建箱线图以可视化特征对“Class”的影响——Python实现(作者提供的图像)

中场休息

我将在此暂停,并快速评论一下我对Julia的“用户体验”。在语言语法方面,Julia似乎处于Python和R之间。有一些Julia包可以提供全面的数据操纵和EDA支持。但是,由于Julia的开发仍处于早期阶段,因此该编程语言仍然缺乏资源和社区支持。搜索某些数据操纵练习的Julia实现,例如展开类似列表的数据框列,可能需要花费很多时间。此外,Julia的语法与Python 3的稳定化还有很长的路要走。在这一点上,我不会说Julia是大型企业和企业的好编程语言选择。

我们还没有完成欺诈检测模型的构建。我会在下一篇博客中继续介绍。敬请关注!

可以在Github上找到Jupyter笔记本。

参考资料

  • ULB(布鲁塞尔自由大学)机器学习小组。 (无日期)。 信用卡欺诈检测[数据集]。 https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud
Leave a Reply

Your email address will not be published. Required fields are marked *