数据接口
XGBoost的Python模块能够从许多不同的数据格式中加载数据,包括CPU和GPU数据结构。有关支持的各种数据类型的完整列表,请参考支持各种XGBoost函数的数据结构。有关文本输入格式的详细说明,请访问DMatrix的文本输入格式。
输入数据存储在DMatrix
对象中。对于sklearn估计器接口,根据选择的算法和输入,将创建一个DMatrix
或QuantileDMatrix
,有关详细信息,请参阅sklearn API参考。这里将使用DMatrix
演示一些基本的输入类型。
- 将NumPy数组加载到DMatrix中:
python
import numpy as np
import xgboost as xgb
data = np.random.rand(5, 10) # 5 entities, each contains 10 features
label = np.random.randint(2, size=5) # binary target
dtrain = xgb.DMatrix(data, label=label)
- 将scipy.sparse数组加载到DMatrix中:
python
import xgboost as xgb
import scipy.sparse
dat = [1.0, 2.0, 3.0] # data
row = [0, 1, 2]
col = [0, 1, 2]
csr = scipy.sparse.csr_matrix((dat, (row, col)))
csr.toarray()
dtrain = xgb.DMatrix(csr)
# array([[1., 0., 0.],
# [0., 2., 0.],
# [0., 0., 3.]])
- 将Pandas Data frame加载到DMatrix中:
python
import xgboost as xgb
import pandas as pd
import numpy as np
# 创建一个 Pandas DataFrame
data = pd.DataFrame(np.arange(12).reshape((4, 3)), columns=['a', 'b', 'c'])
label = pd.DataFrame(np.random.randint(2, size=4))
# 使用 Pandas DataFrame 创建一个 DMatrix 对象
dtrain = xgb.DMatrix(data, label=label)
- 将 DMatrix 对象保存为 XGBoost 二进制文件:
python
dtrain.save_binary('train.buffer')
- 将缺失值替换为默认值:
python
dtrain = xgb.DMatrix(data, label=label, missing=np.NaN)
- 创建Dmartrix对象时设置权重:
python
data = np.random.rand(5, 10) # 5 entities, each contains 10 features
label = np.random.randint(2, size=5) # binary target
weights = np.random.rand(5, 1) # 随机生成权重
dtrain = xgb.DMatrix(data, label=label, missing=np.NaN, weight=weights)
执行排序任务时,权重的数量应等于组的数量。
- 从 LIBSVM 文本文件或二进制文件创建 DMatrix:
python
dtrain = xgb.DMatrix('train.svm.txt?format=libsvm')
dtest = xgb.DMatrix('train.buffer')
XGBoost中的解析器功能有限。在使用Python接口时,建议使用sklearn的load_svmlight_file
或其他类似的工具,而不是使用XGBoost内置的解析器。
- 将CSV加载到DMatrix中:
python
# label_column specifies the index of the column containing the true label
dtrain = xgb.DMatrix('train.csv?format=csv&label_column=0')
dtest = xgb.DMatrix('test.csv?format=csv&label_column=0')
XGBoost的解析器功能有限。在使用Python接口时,建议使用pandas的read_csv
或其他类似工具,而不是XGBoost内置的解析器。
各种 XGBoost 函数支持的数据结构
Markers
-
T:支持
-
F:不支持
-
NE:对于该用例来说,无效的类型。例如,
pd.Series
不能是多目标标签。 -
NPA:借助numpy数组支持
-
CPA:借助cupy数组支持
-
SciCSR:借助scipy稀疏CSR支持。转换为scipy CSR可能会成功也可能失败。如果转换失败,则引发类型错误。
-
FF:如果请求,我们期待在不久的将来支持
-
empty:待填充
表头
-
X表示预测矩阵
-
Meta info:标签、权重等
-
Multi Label:多目标的二维标签
-
Others:除了在此明确列出的任何其他内容,包括格式如lil、dia、bsr等。XGBoost将尝试将其转换为scipy csr
支持矩阵
Name | DMatrix X | QuantileDMatrix X | Sklearn X | Meta Info | Inplace prediction |
---|---|---|---|---|---|
numpy.ndarray | T | T | T | T | T |
scipy.sparse.csr | T | T | T | NE | T |
scipy.sparse.csc | T | F | T | NE | F |
scipy.sparse.coo | SciCSR | F | SciCSR | NE | F |
uri | T | F | F | F | NE |
list | NPA | NPA | NPA | NPA | NPA |
tuple | NPA | NPA | NPA | NPA | NPA |
pandas.DataFrame | NPA | NPA | NPA | NPA | NPA |
pandas.Series | NPA | NPA | NPA | NPA | NPA |
cudf.DataFrame | T | T | T | T | T |
cudf.Series | T | T | T | T | FF |
cupy.ndarray | T | T | T | T | T |
torch.Tensor | T | T | T | T | T |
dlpack | CPA | CPA | CPA | FF | |
datatable.Frame | T | FF | NPA | FF | |
datatable.Table | T | FF | NPA | FF | |
modin.DataFrame | NPA | FF | NPA | NPA | FF |
modin.Series | NPA | FF | NPA | NPA | FF |
pyarrow.Table | NPA | NPA | NPA | NPA | NPA |
array | NPA | F | NPA | NPA | H |
Others | SciCSR | F | F | F |
设置参数
XGBoost可以使用键值对列表或字典来设置参数。例如:
- Booster参数
python
param = {'max_depth': 2, 'eta': 1, 'objective': 'binary:logistic'}
param['nthread'] = 4
param['eval_metric'] = 'auc'
- 还可以指定多个评估指标
python
param['eval_metric'] = ['auc', 'ams@0']
# alternatively:
# plst = param.items()
# plst += [('eval_metric', 'ams@0')]
- 指定验证集以监控性能
python
evallist = [(dtrain, 'train'), (dtest, 'eval')]
训练
训练模型需要参数列表和数据集。
python
num_round = 10
bst = xgb.train(param, dtrain, num_round, evallist)
训练完成后,模型可以被保存。
python
bst.save_model('0001.model')
模型及其特征映射也可以转储到文本文件中。
python
# dump model
bst.dump_model('dump.raw.txt')
# dump model with feature map
bst.dump_model('dump.raw.txt', 'featmap.txt')
可以按以下方式加载保存的模型:
python
bst = xgb.Booster({'nthread': 4}) # init model
bst.load_model('model.bin') # load model
xgboost.Booster 中的 update 和 boost 方法仅设计用于内部使用。包装函数 xgboost.train 会进行一些预配置,包括设置缓存和其他参数。
Early Stopping
如果有一个验证集,可以使用提前停止来找到最佳的提升轮数。提前停止需要在evals中至少有一个集。如果有多个,它将使用最后一个。
python
train(..., evals=evals, early_stopping_rounds=10)
模型将一直训练,直到验证分数停止提高。验证误差需要每个 early_stopping_rounds
至少减少一次才能继续训练。
如果发生提前停止,模型将具有两个额外的字段:bst.best_score
、bst.best_iteration
。xgboost.train` 将返回最后一次迭代的模型,而不是最佳模型。
这适用于最小化指标(RMSE、对数损失等)和最大化指标(MAP、NDCG、AUC)。如果指定了多个评估指标,则 param['eval_metric']
中的最后一个指标用于提前停止。
绘图
可以使用绘图模块来绘制特征重要性和输出树。
要绘制特征重要性,使用xgboost.plot_importance()
函数,需安装matplotlib
python
xgb.plot_importance(bst)
要通过 matplotlib 绘制输出树,使用 xgboost.plot_tree()
,指定目标树的序数。此函数需要 graphviz
和 matplotlib
。
python
xgb.plot_tree(bst, num_trees=2)
当使用 IPython 时,可以使用 xgboost.to_graphviz()
函数,将目标树转换为 graphviz
实例。graphviz
实例将自动在 IPython 中呈现。
python
xgb.to_graphviz(bst, num_trees=2)
Scikit-Learn 接口
XGBoost 提供了一个易于使用的 scikit-learn 接口,用于一些预定义模型,包括回归、分类和排名。
python
# Use "hist" for training the model.
reg = xgb.XGBRegressor(tree_method="hist", device="cuda")
# Fit the model using predictor X and response y.
reg.fit(X, y)
# Save model into JSON format.
reg.save_model("regressor.json")
在需要时,用户仍然可以访问底层的 booster 模型:
python
booster: xgb.Booster = reg.get_booster()