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=csv
或 train.csv?format=libsvm
。对于外部内存输入,URI 应类似于 train.csv?format=csv#dtrain.cache
。另请参阅 数据接口 和 使用 XGBoost 外部内存版本。
对于训练或预测,XGBoost 接受以下格式的实例文件:
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
,并且应具有以下格式:
2
3
这意味着,数据集包含5个实例,前两个实例在一个组中,其余三个在另一个组中。组文件中的数字实际上表示实例文件中每个组中的实例数量。在配置时,您不必指定组文件的路径。如果实例文件名为``xxx``,XGBoost将检查同一目录中是否存在名为``xxx.group``的文件。
实例权重文件
训练数据中的实例可以被分配权重,以区分它们之间的相对重要性。例如,如果我们为示例中的 train.txt
文件提供一个实例权重文件,如下所示:
1
0.5
0.5
1
0.5
这意味着XGBoost在训练时会更强调第一个和第四个实例(即正实例)。配置类似于配置组信息。如果实例文件名为 xxx
,XGBoost将在同一目录中查找名为 xxx.weight
的文件。如果文件存在,实例权重将被提取并在训练时使用。
备注
二进制缓冲区格式和实例权重
如果你选择将训练数据保存为二进制缓冲区(使用 save_binary()
),请记住生成的二进制缓冲区文件将包含实例权重。要更新权重,请使用 set_weight()
函数。
初始保证金文件
XGBoost 支持为每个实例提供初始的边缘预测。例如,如果我们使用逻辑回归对 train.txt
文件进行初始预测,我们可以创建以下文件:
-0.4
1.0
3.4
XGBoost 会将这些值作为初始边缘预测,并从那里开始提升。关于 base_margin 的一个重要说明是,它应该是转换前的边缘预测,因此如果你在进行逻辑损失,你需要输入逻辑转换前的值。如果你正在使用 XGBoost 预测器,使用 pred_margin=1
来输出边缘值。
在 LIBSVM 文件中嵌入附加信息
本节适用于单节点和多节点设置。
查询 ID 列
这对于 排序任务 非常有用,其中实例被分组到查询组中。您可以通过在每一行中添加一个形式为 qid:xx
的标记,将查询组ID嵌入到LIBSVM文件中:
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]
,如下例所示:
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
其中负样本的权重是正样本的一半。