阅读XGB vignette。
我们正在使用火车数据。如上所述,数据和标签 存储在列表中。
在稀疏矩阵中,包含0的单元格不存储在内存中。 因此,在主要由0构成的数据集中,存储器大小减小。它 通常有这样的数据集。
之后,小插图会告诉您如何使用密集矩阵。
我有一个从文本数据派生的数据框,因此它非常稀疏,因为大多数值都是零。我已经将数据框传递给了XGB,并且需要花费很长时间才能运行,但这可能是预期的。我正在训练1M观察,92个变量,并使用托管的RStudio 64gb和15个处理器(当我在终端中监视时,我也看到了使用所有可用处理器的XGB)。
我的问题是,我是否必须对我的数据框进行某种转换才能使其成为稀疏矩阵?
library(tidyverse)
library(caret)
library(xgboost)
## xgboost
# set up parameter search
xgb_grid = expand.grid( # stopped using differing permutations of parameters because training was taking so long
nrounds = 150,
eta = 0.3, # default 0.3; previously verified 0.3 was best model with 100k sample
max_depth = 6, # default 6; previously verified 6 was best model with 100k sample
gamma = 0, #default = 0
colsample_bytree = 1, # default = 1
min_child_weight = 1, # default = 1
subsample = 1 # default = 1
)
# fit a xgboost model
print("begin xgb")
mod_xgb <- train(
cluster ~.,
data = select(training_data, -id),
method = "xgbTree",
trControl = train_control,
na.action = na.pass,
tuneGrid = xgb_grid,
metric = "Kappa"
)
> str(training_data)
'data.frame': 1000000 obs. of 92 variables:
$ violat : num 0 0 0 0 0 0 0 0 0 0 ...
$ found : num 0 0 0 0 0 0 0 0 0 0 ...
$ person : num 0 0 0 0 0 0 0 0 0 0 ...
$ theft : num 0 0 0 1 0 0 0 0 0 0 ...
$ theft_from : num 0 0 0 0 0 0 0 0 0 0 ...
我问,因为我想知道我是否以某种方式将我的数据帧training_data更改为XGB的稀疏矩阵,也许模型会更快地训练?会吗?
如何将training_data作为稀疏矩阵传递给XGBoost?
答案 0 :(得分:1)
Matrix
包具有以下函数来创建稀疏矩阵sparse.model.matrix()
。如果在创建稀疏矩阵之前从数据中删除NA,可能会有所帮助,以确保从属变量y在进入xgboost函数时与稀疏矩阵的长度相同。
我还倾向于记录我的训练数据中的因子水平,以便在预测未见的测试数据集时,我可以确保测试数据具有与训练数据相同的因子水平。这样可以确保测试数据矩阵与训练矩阵具有相同的维度。
来自mtcars的例子:
f<-mpg~hp+as.factor(cyl)
trainMatrix<-sparse.model.matrix(f,mtcars)