Press "Enter" to skip to content

任何项目的机器学习库

有很多可以用于机器学习项目的库。当然,其中一些库通过多年的发展获得了相当的声誉。这些库是任何开始使用机器学习算法的新项目的首选。然而,选择正确的库(或堆栈)可能会具有一定的挑战性。

为什么选择

在本文中,我想给你一个机器学习库的总体概述,并分享一些关于使用它们的想法。如果你刚开始接触机器学习库,我的文章可以给你一些关于机器学习库的基本知识,并为学习更多提供一个更好的起点。

这里描述的库将按照它们在项目中所起的作用进行分类。

分类如下:

  1. 模型创建 – 可用于创建机器学习模型的库
  2. 数据处理 – 可用于特征工程、特征提取以及涉及特征处理的其他操作的库
  3. 超参数优化 – 用于优化模型超参数的库和工具
  4. 实验追踪 – 用于实验追踪的库和工具
  5. 问题特定库 – 用于时间序列预测、计算机视觉和处理空间数据等任务的库
  6. 实用工具 – 非严格的机器学习库,但在我的项目中发现它们非常有用

模型创建

PyTorch

由Facebook的开发人员于2017年开源,它是市场上最著名的机器学习库之一 – 基于开源的Torch包。PyTorch生态系统可用于各种类型的机器学习问题,并且有许多专门构建的库,如torchvision或torchaudio。

PyTorch的基本数据结构是Tensor对象,它用于保存我们的模型使用的多维数据。它在概念上类似于NumPy的ndarray。PyTorch还可以使用计算加速器,并支持CUDA兼容的NVIDIA GPU、ROCm、Metal API和TPU。

核心PyTorch库的最重要部分是nn模块,它包含了构建复杂模型所需的层和工具。

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

这是一个在PyTorch中具有3个线性层的简单神经网络的示例。

此外,PyTorch 2.0已经发布,使PyTorch变得更好。此外,PyTorch还被Uber、特斯拉和Facebook等许多公司使用。

PyTorch Lightning

它是PyTorch的“扩展”,旨在大大减少使用模型所需的样板代码量。

Lightning基于钩子的概念:在模型训练/评估循环的特定阶段调用的函数。这种方法允许我们在特定时间执行回调函数,比如训练步骤结束时。

PyTorch Lightning自动化了在PyTorch中需要关注的许多功能,例如循环、硬件调用或梯度清零。

下面是PyTorch(左)和PyTorch Lightning(右)的大致等效代码片段。

图片来源

TensorFlow

这是由Google Brain团队开发的库,最初于2015年以Apache 2.0许可证发布,2019年发布了2.0版本。它提供了Java、C++、Python甚至JavaScript的客户端。

与PyTorch类似,它在市场上得到广泛采用,并被Google(不出所料)、Airbnb和Intel等公司使用。TensorFlow还由Google构建了一个相当广泛的生态系统。它包含了优化工具包、TensorBoard(更多关于它的内容请参见下面的“实验追踪”部分)或推荐系统等工具和库。TensorFlow生态系统还包括一个基于Web的沙盒,用于玩弄模型的可视化。

再次,tf.nn 模块起着最关键的作用,提供了构建机器学习模型所需的所有构建块。TensorFlow使用自己的张量(流;p)对象来保存深度学习模型使用的数据。它还支持所有常见的计算加速器,如CUDA或RoCm(社区)、Metal API和TPU。

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

请注意,在TensorFlow和Keras中,我们使用Dense层而不是PyTorch中使用的Linear层。我们还使用call方法来定义模型的前向传递,而不是使用forward方法。

Keras

它是一个与PyTorch Lightning类似的库,但用于TensorFlow。它提供了对TensorFlow更高级的接口。由François Chollet于2015年开发并发布,它仅提供Python客户端。Keras还有自己的一套Python库和问题特定的库,如KerasCV或KerasNLP,用于更专门的用例。

在2.4版本之前,Keras支持的后端比仅仅是TensorFlow多,但在发布之后,TensorFlow成为唯一支持的后端。由于Keras只是TensorFlow的接口,它与其底层后端共享类似的基本概念。同样适用于支持的计算加速器。IBM、PayPal和Netflix等公司都在使用Keras。

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

请注意,在TensorFlow和Keras中,我们使用Dense层而不是PyTorch中使用的Linear层。我们还使用call方法来定义模型的前向传递,而不是使用forward方法。

PyTorch vs. TensorFlow

如果我不介绍这两者之间的一些比较,我就不会完全诚实。

正如你刚才所读到的,它们两者在提供的功能和周围生态系统方面非常相似。当然,它们在工作方式或提供的功能方面有一些细微的差异和怪癖。在我看来,这些差异或多或少都是微不足道的。

它们之间的真正区别来自于它们在定义和执行机器学习和深度学习模型的计算图方面的方法。

  • PyTorch使用动态计算图,这意味着图是在执行过程中即时定义的。这允许更灵活和直观的调试,因为开发人员可以在运行时修改图并轻松检查中间输出。另一方面,与静态图相比,这种方法可能不太高效,特别是对于复杂模型而言。然而,PyTorch 2.0试图通过torch.compile和FX图来解决这些问题。
  • TensorFlow使用静态计算图,在执行之前进行编译。这允许更高效的执行,因为可以针对目标硬件对图进行优化和并行化。然而,它也可能使调试更加困难,因为中间输出不容易访问。

另一个值得注意的区别是,PyTorch似乎比Keras更低级,同时比纯TensorFlow更高级。这样的设置使得PyTorch更灵活,更容易用于创建具有许多自定义的定制模型。

顺便提一下,我想补充一点,即在市场份额方面,这两个库处于平等地位。此外,尽管TensorFlow使用call方法,PyTorch使用forward方法,但这两个库都支持使用call语义作为调用model(x)的简写。

处理数据

pandas

如果你使用Python,那么你一定听说过这个库,它可能是处理任何类型数据的最著名的Python库。它最早于2008年发布,2012年发布了1.0版本。它提供了用于过滤、聚合和转换数据以及合并多个数据集的函数。

这个库的核心是一个DataFrame对象,它表示任何类型数据的多维表格。该库非常注重性能,在一些部分采用纯C编写以提高性能。

除了性能方面,pandas还提供了许多与以下相关的功能:

  • 数据清洗和预处理
    • 去除重复值
    • 填充空值或nan值。
  • 时间序列分析
    • 重采样
    • 窗口操作
    • 时间偏移

此外,它还可以执行各种输入/输出操作:

  • 从/到 .csv 或 .xlsx 文件的读取
  • 执行数据库查询
  • 从 GCP BigQuery 加载数据(借助 pandas-gbq 的帮助)

NumPy

这是另一个用于处理数据的著名库 – 主要用于数值数据科学。NumPy 最著名的部分是 ndarray – 一种表示多维数字数组的结构。

除了 ndarray,NumPy 还提供了许多高级数学函数和数学运算,用于处理这些数据。它可能是这个集合中最古老的库,因为第一个版本发布于2005年。它是由 Travis Oliphant 实现的,基于一个更早的库 numeric(1996年发布)。

NumPy 非常注重性能,贡献者们努力不断优化目前已实现的算法,以进一步减少 NumPy 函数的执行时间。

当然,与这里描述的所有库一样,NumPy 也是开源的,使用 BSD 许可。

SciPy

这是一个专注于支持科学计算的库。它比 NumPy 还要早(2005年),在2001年发布。它是建立在 NumPy 之上的,ndarray 是 SciPy 中使用的基本数据结构。除此之外,该库还添加了用于优化、线性代数、信号处理、插值和稀疏矩阵支持等功能。总体而言,它比 NumPy 更高级,因此可以提供更复杂的函数。

超参数优化

Ray Tune

它是 Ray 工具集的一部分,是一组用于构建分布式应用程序的相关库,重点关注机器学习和 Python。ML 库中的 Tune 部分专注于提供超参数优化功能,通过提供各种搜索算法,例如网格搜索、超带宽或贝叶斯优化。

Ray Tune 可以与市场上可用的大多数编程语言和库中创建的模型一起使用。Ray Tune 支持上述描述的所有库。

Ray Tune 的关键概念包括:

  • Trainables – 传递给 Tune 运行的对象;它们是我们要为其优化参数的模型
  • Search space – 包含我们要在当前试验中检查的超参数值
  • Tuner – 负责执行运行的对象,调用 tuner.fit() 开始搜索最佳超参数集的过程。至少需要传递一个 trainable 对象和搜索空间
  • Trial– 每个试验表示可调参数集合中的一个特定运行。试验由 Ray Tune Tuner 生成。作为运行调谐器的输出,Trial 包含大量信息,例如:
    • 用于特定试验的配置
    • 试验 ID
    • 许多其他信息
  • Search algorithms – 用于特定 Tuner.fit 执行的算法;如果未提供,则 Ray Tune 将使用随机搜索作为默认算法
  • Schedulers – 这些对象负责管理运行。它们可以暂停、停止和运行试验,从而提高效率并减少运行时间。如果未选择任何调度器,则 Tune 将选择 FIFO 作为默认选项 – 运行将按照经典队列的方式依次执行。
  • Run analyses – ResultGrid 对象形式的 Tuner.fit 执行结果。它包含与运行相关的所有数据,如所有试验中的最佳结果或所有试验的数据。

BoTorch

BoTorch是建立在PyTorch之上的库,是PyTorch生态系统的一部分。它专注于使用贝叶斯优化提供超参数优化。

作为此部分中唯一一个设计用于与特定模型库一起使用的库,BoTorch可能在与PyTorch以外的库一起使用时存在问题。此外,由于它是唯一的库,目前处于测试版且正在积极开发中,因此可能会出现一些意外问题。

BoTorch的关键特点是其与PyTorch的集成,这极大地影响了两者之间的交互便利性。

实验跟踪

Neptune.ai

它是一个基于Web的工具,既可以用作实验跟踪,又可以用作模型注册表。该工具基于经典的SaaS模型提供云端服务,但如果你足够决心,也有可能使用自托管的变体。

它提供了一个仪表板,您可以在其中查看和比较训练模型的结果。您还可以使用它来存储特定运行所使用的参数。此外,您可以轻松地对用于特定运行的数据集进行版本控制,以及所有您认为可能有用的元数据。

此外,它还为您的模型提供了便捷的版本控制。显然,该工具不受库的限制,可以托管使用任何库创建的模型。为了实现集成,Neptune提供了自己的REST风格API,并提供了相应的客户端。客户端可以通过pip或任何其他Python依赖工具下载和安装。该API有相当好的文档说明,很容易理解。

该工具是付费的,并有一个简单的定价计划分为三个类别。但是,如果您只需要用于个人项目,或者您是研究或学术单位,则可以申请免费使用该工具。

Neptune.ai是一个新工具,因此可能没有其他实验跟踪工具具备的某些功能。尽管如此,Neptune.ai的支持团队热衷于回应用户的反馈并实现缺失的功能 – 至少在我们使用Neptune.ai的Codos项目中是这样。

Weights & Biases

也被称为WandB或W&B,这是一个基于Web的工具,提供了作为实验跟踪工具和模型注册表所需的所有功能。它提供了与neptune.ai基本相似的一套功能。

然而,Weights & Biases似乎具有更好的可视化效果,并且总体上是比Neptune更成熟的工具。此外,WandB似乎更专注于个人项目和研究人员,较少强调协作。

它也有一个简单的定价计划,分为3个类别,其中包含一个用于私人使用的免费层。但是,W&B对于研究人员和学术单位与Neptune的做法相同 – 他们始终可以免费使用Weights & Biases。

Weights & Biases还提供了类似REST的API,以便简化集成过程。与Neptune.ai相比,它似乎有更好的文档,并提供了比Neptune.ai更多的功能。有趣的是,他们提供了使用Java编写的客户端库 – 如果由于某种原因,您将机器学习模型编写为Java而不是Python。

TensorBoard

它是TensorFlow生态系统的专用可视化工具包。它主要用作实验跟踪工具,重点关注度量指标的可视化。尽管是一个专用的TensorFlow工具,但它也可以与Keras(不出所料)和PyTorch一起使用。

此外,它是这三个工具中唯一的免费工具。在这里,您可以托管和跟踪您的实验。然而,TensorBoard缺少负责模型注册的功能,这可能会带来一些问题,并迫使您使用一些第三方工具来弥补这个缺失的功能。无论如何,在TensorFlow生态系统中肯定有一个工具可以解决这个问题。

作为TensorFlow生态系统的一部分,它与Keras或TensorFlow的集成比前两个工具更加顺畅。

特定问题的库

tsaug

tsaug是一些时序增强库之一,它是由一个名为nick tailaiw的人在GitHub上创建和维护的开源库,于2019年发布,目前处于0.2.1版本。它提供了一套9种增强技术,包括裁剪、添加噪声和时间拉伸等。对于这样的项目来说,该库的文档相当完善,用户使用起来也很容易。

不幸的是,出于未知原因(至少对我来说),该库似乎已经停止更新3年了。虽然有很多未解决的问题,但它们没有得到任何关注。在我看来,这种情况相当令人沮丧,因为没有太多其他为时间序列数据提供增强的库。

然而,如果您正在寻找一个用于数据挖掘或增强的时间序列,并且想使用一个更加更新的库,Tsfresh可能是一个不错的选择。

OpenCV

它是一个专注于提供图像处理和计算机视觉功能的库。由Intel开发,现在基于Apache 2许可证开源。

OpenCV提供了一组与图像和视频处理、图像分类数据分析和跟踪相关的函数,以及用于处理图像和视频的现成机器学习模型。

如果您想了解更多关于OpenCV的信息,我的同事Kamil Rzechowski写了一篇非常详细描述这个主题的文章。

GeoPandas

它是构建在pandas之上的一个库,旨在提供处理空间和数据结构的功能。它允许轻松读取和写入GeJSON、shapefile格式的数据,或从PostGIS系统中读取数据。除了pandas,它还依赖于其他许多空间数据库,如PyGEOS、GeoPy或Shapely。

该库的基本结构是:

  • GeoSeries – 一列地理空间数据,如一系列点、线或多边形
  • GeoDataFrame – 包含一组GeoSeries的表格结构

Utils

Matplotlib

顾名思义,它是一个用于创建各种类型图表的库。除了基本的线条或直方图等图表,matplotlib还允许我们创建更复杂的图表:3D形状或极坐标图。当然,它还允许我们自定义颜色图或标签等内容。

尽管它有些年头了(发布于2003年,所以在撰写本文时已经20年了),但它仍在积极维护和开发。在GitHub上有大约17k个星星,它有相当庞大的社区,可能是任何需要数据可视化工具的人的第二选择。

它有很好的文档,并且对于新手来说相对易于理解。另外值得注意的是,matplotlib被用作更高级可视化库的基础。

Seaborn

说到这一点,我们有Seaborn作为这样一个库的例子。因此,Seaborn提供的功能集与Matplotlib提供的功能集类似。

然而,其API更高级,需要更少的样板代码来实现类似的结果。至于其他细微差别,Seaborn提供的调色板更柔和,图表的设计更现代和美观。此外,Seaborn最容易与pandas集成,这可能是一个重要的优势。

以下是用于在Matplotlib和Seaborn中创建热力图的代码,以及它们的输出图表。导入部分是共同的。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data = np.random.rand(5, 5)

fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)

ax.set_xticklabels(np.arange(1, data.shape[0]+1), minor=False)
ax.set_yticklabels(np.arange(1, data.shape[1]+1), minor=False)

plt.title("热力图")
plt.xlabel("X轴")
plt.ylabel("Y轴")

cbar = plt.colorbar(heatmap)

plt.show()

sns.heatmap(data, cmap="Blues", annot=True)
# 设置图表标题和坐标轴标签
plt.title("热力图")
plt.xlabel("X轴")
plt.ylabel("Y轴")
# 显示图表
plt.show()

Hydra

在每个项目中,迟早都需要使某些东西成为可配置的值。当然,如果您使用的是像Jupyter这样的工具,那么问题就很简单了。您只需将所需的值移到.env文件中 – et voila,它就是可配置的。

然而,如果您正在构建一个更标准的应用程序,情况就不那么简单了。在这种情况下,Hydra展示了它丑陋但非常有用的一面。它是一个用于管理和运行基于Python的应用程序配置的开源工具。

它基于OmegaConf库,引用他们主页上的话:“关键功能是通过组合动态创建分层配置,并通过配置文件和命令行进行覆盖。”

对我而言,上面引用的能力被证明非常有用:分层配置。在我的情况下,它运行得非常好,并允许更清晰地分离配置文件。

coolname

为您的污染运行设置一个唯一的标识符总是一个好主意。如果出于各种原因您不喜欢UUID,或者只是希望您的ID能够被人理解,那么coolname就是您的答案。它生成由2至4个单词组成的唯一字母词汇标识符。

至于组合数量,大致如下:

  • 4个单词长度的标识符有1010种组合
  • 3个单词长度的标识符有108种组合
  • 2个单词长度的标识符有105种组合

这个数字比UUID的情况要低得多,因此碰撞的概率也更高。然而,比较这两者并不是本文的重点。

词汇是由创作者精心挑选的。然而他们将其描述为积极和中性的(在这里了解更多),所以您不会看到像you-ugly-unwise-human-being这样的标识符。当然,这个库是完全开源的。

tqdm

该库为您的应用程序提供一个进度条功能。尽管显示此类信息可能不是您最需要的东西,但它仍然很好看,并可以在执行重要任务期间查看应用程序的进度。

tqdm还使用复杂的算法来估计特定任务的剩余时间,这可能是一个改变游戏规则的因素,并帮助您合理安排时间。此外,tqdm声称它几乎没有察觉到的性能开销 – 以纳秒为单位。

更重要的是,它是完全独立的,只需要Python来运行。因此,它不会将一半的互联网下载到您的磁盘上。

Jupyter Notebook(+ JupyterLab)

笔记本是共享结果和工作在项目上的好方法。通过单元格的概念,很容易将代码的不同片段和责任分开。

此外,单个笔记本文件可以包含代码、图像和复杂的文本输出(表格),这一事实只增加了它现有优势的价值。

此外,笔记本允许在单元格内运行pip install并使用.env文件进行配置。这种方法将许多软件工程复杂性转移到一边。

总结

这些是我想为您描述的各种机器学习库。我旨在提供对所有库的概述,以及它们的可能用例,并附带我自己使用它们的快速注释。我希望我的目标已经实现,这篇文章将加深您对机器学习库领域的了解。

Leave a Reply

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