【发布时间】:2018-02-13 08:53:48
【问题描述】:
阅读XGB vignette。
我们正在使用火车数据。如上所述,数据和标签 存储在列表中。
在稀疏矩阵中,包含 0 的单元不存储在内存中。 因此,在主要由 0 组成的数据集中,内存大小会减少。它 拥有这样的数据集是很常见的。
之后,小插图也会告诉您如何使用密集矩阵。
我有一个从文本数据派生的数据框,因此它非常稀疏,因为大多数值为零。我一直在将数据帧传递给 XGB,它需要很长时间才能运行,但也许这是意料之中的。我正在对 1M 观察、92 个变量进行训练,并且正在使用带有 15 个处理器的托管 RStudio 64gb(当我在终端中监控时,我看到 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?
【问题讨论】: