跳过内容

预处理

顶层 preprocessing 部分指定了数据集分割(训练集、验证集、测试集)、采样比例(少数类欠采样或多数类过采样)和数据集平衡。

preprocessing:
    sample_ratio: 1.0
    sample_size: null
    oversample_minority: null
    undersample_majority: null
    global_max_sequence_length: null
    split:
        type: random
        probabilities:
        - 0.7
        - 0.1
        - 0.2

数据集分割

数据分割是机器学习中训练和评估模型的重要方面。

Ludwig 支持将数据分割为训练集、验证集和测试集,这通过 Ludwig 配置的顶层 preprocessing 部分进行配置。

关于数据如何分割没有固定的指南或指标;这可能取决于您的数据大小或问题类型。

Ludwig 使用几种不同的方法来分割数据。每种方法都在 split 子部分中指定。

Ludwig 目前支持以下分割方法:

随机分割

默认情况下,Ludwig 将根据分割概率随机将数据分割为训练集、验证集和测试集,默认概率为:[0.7, 0.1, 0.2]

split:
    type: random
    probabilities:
    - 0.7
    - 0.1
    - 0.2

但是,您可以通过设置这 3 个数据集的概率来指定不同的分割概率(使其总和为 1)。

固定分割

如果您有一个列表示预定义的分割(训练、验证和测试),并且您希望在不同实验中使用它,Ludwig 支持使用固定的数据集分割。

以下配置是使用数据集中名为 split 的列执行固定分割的示例:

split:
    type: fixed
    column: split

在数据本身中,我们将确保有一个名为 split 的列,该列中每行根据我们想要将该行映射到的分割具有以下值:

  • 0: 训练集
  • 1: 验证集
  • 2: 测试集

注意

您的数据集必须包含训练集分割。但是,建议包含验证集和测试集分割,但它们是可选的。

分层分割

有时您可能希望根据特定列的分布来分割数据,以在所有数据子集中保持该分布的相同表示。当您有多个类别且数据集不平衡时,这可能特别有用。

为了执行分层分割,您需要指定要进行分层分割的列名以及分割概率。

以下配置是为列 color 执行分层分割的示例:

split:
    type: stratify
    column: color
    probabilities:
    - 0.7
    - 0.1
    - 0.2

这有助于确保 color 列中值的分布在所有数据子集中大致相同。

日期时间分割

另一个常见用例是根据日期时间列分割数据,您可能希望数据按时间顺序分割。

这对于像回测这样的情况非常有用,用户希望确保在历史数据上训练的模型在未见过的未来数据上表现良好。

如果在这些情况下使用均匀随机分割策略,如果数据分布随时间变化,模型可能无法很好地泛化。沿时间维度将训练数据与测试数据分开,是避免这种虚假自信的一种方法,通过展示模型在未来的未见数据上的表现如何。

对于基于日期时间的分割,我们按日期(升序)对数据排序,然后根据 split_probabilties 进行分割。例如,如果 split_probabilities: [0.7, 0.1, 0.2],则最早的 70% 数据将用于训练,中间的 10% 用于验证,最后的 20% 用于测试。

以下配置展示了如何使用名为 created_ts 的日期时间列来指定这种类型的分割:

split:
    type: datetime
    column: created_ts
    probabilities:
    - 0.7
    - 0.1
    - 0.2

哈希分割

哈希分割根据提供的“键”列的哈希值确定性地将每个样本分配到一个分割中。当存在这样的键时,这是随机分割的一个有用替代方法,原因有以下几点:

  • 防止数据泄露:例如,假设您正在预测哪些用户在给定月份可能流失。如果一个用户同时出现在训练集和测试集中,那么您的模型可能看起来比实际表现得更好。在这种情况下,对用户 ID 列进行哈希处理将确保用户的每个样本都被分配到同一分割中。
  • 确保底层数据集随时间演变时样本到分割的一致分配:虽然由于使用了随机种子,随机分割在不同运行之间是确定性的,但如果底层数据集发生变化(例如,随时间添加新样本),则样本可能会移入不同的分割中。对主键进行哈希处理将确保所有现有样本在随时间添加新样本时保留其原始分割。
split:
    type: hash
    column: user_id
    probabilities:
    - 0.7
    - 0.1
    - 0.2

数据平衡

处理不平衡数据集的用户可以指定过采样或欠采样参数,这些参数将在预处理期间平衡数据。

警告

数据集平衡目前仅支持二进制输出特征。我们正在努力在未来的版本中添加对类别特征的支持。

注意

不支持同时指定过采样和欠采样参数。

过采样

在此示例中,Ludwig 将对少数类进行过采样,以在整个数据集中达到 50% 的表示。

preprocessing:
  oversample_minority: 0.5

欠采样

在此示例中,Ludwig 将对多数类进行欠采样,以在整个数据集中达到 70% 的表示。

preprocessing:
  undersample_majority: 0.7

采样比例和大小

有时用户可能希望对输入训练数据进行抽样(可能数据太多,我们只需要 20%,或者我们想在数据的一个较小子集上尝试想法)。为了实现这一点,用户可以指定 sample_ratiosample_size 来指示用于训练的数据集比例。

默认情况下,采样比例为 1.0,因此如果不指定,将使用所有数据进行训练。例如,如果您只想使用输入数据的 30%,您可以像这样指定配置:

preprocessing:
  sample_ratio: 0.3

此外,如果您想指定用于训练的确切样本数量,可以使用 sample_size 参数。例如,如果您想使用 1000 个样本进行训练,您可以像这样指定配置:

preprocessing:
  sample_size: 1000

警告

sample_size 只能在 sample_ratio 为 1.0(默认值)时使用。

全局最大序列长度

在单个 GPU 上高效微调 LLM 时,有许多因素需要考虑

控制 GPU 内存使用率的最重要参数之一是最大序列长度的选择。

Ludwig 提供了 3 个主要旋钮来控制最大序列长度。global_max_sequence_length 就是其中之一。它用于控制在训练期间馈送到 LLM 前向传播的最大长度序列。它表示数据集中每行的输入特征令牌与输出特征令牌连接后的总令牌数,这些令牌将在训练期间馈送到模型。

为了理解这个参数,这里有一个例子。假设您有一个输入文本特征,其中一行包含 20 个令牌,一个输出文本特征,其中一行包含 15 个令牌。那么:

  • 如果您将 global_max_sequence_length 设置为 35,则整个输入 + 输出序列将在训练期间传递给模型。
  • 如果您将 global_max_sequence_length 设置为大于总和的值(例如 40),它也将确保整个序列在训练期间传递给模型。
  • 如果您将 global_max_sequence_length 设置为 25,则在训练期间只会将前 20 个输入特征令牌和前 5 个输出特征令牌传递给模型。

对于具有可变长度序列的数据集(大多数实际数据集都是这种情况),这将根据训练期间的每一行进行单独调整。

您可以在此处探索控制最大序列长度的所有 3 种选项及其权衡。

注意

此参数仅影响使用 llm 模型类型训练的模型。

特征特定的预处理

要配置特征特定的预处理,请查看数据类型特定的文档