DMatrix 的文本输入格式

这里我们将简要描述XGBoost的文本输入格式。然而,对于那些可以使用Python或R等支持语言环境的用户,建议使用该生态系统中的数据解析器。例如,sklearn.datasets.load_svmlight_file()

基本输入格式

XGBoost 目前支持两种文本格式用于数据输入:LIBSVM 和 CSV。本文档的其余部分将描述 LIBSVM 格式。(有关 CSV 格式的描述,请参阅 这个维基百科文章。)请注意,XGBoost 理解文件扩展名,也不会尝试猜测文件格式,因为没有关于 LIBSVM 或 CSV 文件扩展名的普遍共识。相反,它使用 URI 格式来指定精确的输入文件类型。例如,如果您提供一个 csv 文件 ./data.train.csv 作为输入,XGBoost 将盲目使用默认的 LIBSVM 解析器来处理它并生成解析错误。相反,用户需要提供一个 URI 形式的 train.csv?format=csvtrain.csv?format=libsvm。对于外部内存输入,URI 应类似于 train.csv?format=csv#dtrain.cache。另请参阅 数据接口使用 XGBoost 外部内存版本

对于训练或预测,XGBoost 接受以下格式的实例文件:

train.txt
1 101:1.2 102:0.03
0 1:2.1 10001:300 10002:400
0 0:1.3 1:0.3
1 0:0.01 1:0.3
0 0:0.2 1:0.3

每行代表一个单独的实例,在第一行中,’1’ 是实例标签,’101’ 和 ‘102’ 是特征索引,’1.2’ 和 ‘0.03’ 是特征值。在二分类情况下,’1’ 用于表示正样本,’0’ 用于表示负样本。我们还支持在 [0,1] 范围内的概率值作为标签,以表示实例为正的概率。

附加信息的辅助文件

注意:以下所有信息仅适用于单节点版本的软件包。 如果您想使用多个节点进行分布式训练,请跳至 在LIBSVM文件中嵌入附加信息 部分。

Group Input Format

对于 排序任务,XGBoost 支持组输入格式。在排序任务中,实例在现实场景中被分类为 查询组。例如,在学习排序网页的场景中,网页实例按其查询进行分组。XGBoost 需要一个指示组信息的文件。例如,如果实例文件是上述的 train.txt,那么组文件应命名为 train.txt.group,并且应具有以下格式:

train.txt.group
2
3

这意味着,数据集包含5个实例,前两个实例在一个组中,其余三个在另一个组中。组文件中的数字实际上表示实例文件中每个组中的实例数量。在配置时,您不必指定组文件的路径。如果实例文件名为``xxx``,XGBoost将检查同一目录中是否存在名为``xxx.group``的文件。

实例权重文件

训练数据中的实例可以被分配权重,以区分它们之间的相对重要性。例如,如果我们为示例中的 train.txt 文件提供一个实例权重文件,如下所示:

train.txt.weight
1
0.5
0.5
1
0.5

这意味着XGBoost在训练时会更强调第一个和第四个实例(即正实例)。配置类似于配置组信息。如果实例文件名为 xxx,XGBoost将在同一目录中查找名为 xxx.weight 的文件。如果文件存在,实例权重将被提取并在训练时使用。

备注

二进制缓冲区格式和实例权重

如果你选择将训练数据保存为二进制缓冲区(使用 save_binary()),请记住生成的二进制缓冲区文件将包含实例权重。要更新权重,请使用 set_weight() 函数。

初始保证金文件

XGBoost 支持为每个实例提供初始的边缘预测。例如,如果我们使用逻辑回归对 train.txt 文件进行初始预测,我们可以创建以下文件:

train.txt.base_margin
-0.4
1.0
3.4

XGBoost 会将这些值作为初始边缘预测,并从那里开始提升。关于 base_margin 的一个重要说明是,它应该是转换前的边缘预测,因此如果你在进行逻辑损失,你需要输入逻辑转换前的值。如果你正在使用 XGBoost 预测器,使用 pred_margin=1 来输出边缘值。

在 LIBSVM 文件中嵌入附加信息

本节适用于单节点和多节点设置。

查询 ID 列

这对于 排序任务 非常有用,其中实例被分组到查询组中。您可以通过在每一行中添加一个形式为 qid:xx 的标记,将查询组ID嵌入到LIBSVM文件中:

train.txt
1 qid:1 101:1.2 102:0.03
0 qid:1 1:2.1 10001:300 10002:400
0 qid:2 0:1.3 1:0.3
1 qid:2 0:0.01 1:0.3
0 qid:3 0:0.2 1:0.3
1 qid:3 3:-0.1 10:-0.3
0 qid:3 6:0.2 10:0.15

请记住以下限制:

  • 你不能为某些实例指定查询ID,而对其他实例不指定。要么每一行都被分配查询ID,要么一个都没有。

  • 行必须按查询ID的升序排序。因此,例如,您不能有一行的查询ID大于任何后续行。

实例权重

您可以在 LIBSVM 文件中通过在每个实例标签后附加相应的权重来指定实例权重,格式为 [label]:[weight],如下例所示:

train.txt
1:1.0 101:1.2 102:0.03
0:0.5 1:2.1 10001:300 10002:400
0:0.5 0:1.3 1:0.3
1:1.0 0:0.01 1:0.3
0:0.5 0:0.2 1:0.3

其中负样本的权重是正样本的一半。