来自数据帧的XGB稀疏矩阵

时间:2017-09-05 06:45:46

标签: r r-caret xgboost

阅读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?

1 个答案:

答案 0 :(得分:1)

Matrix包具有以下函数来创建稀疏矩阵sparse.model.matrix()。如果在创建稀疏矩阵之前从数据中删除NA,可能会有所帮助,以确保从属变量y在进入xgboost函数时与稀疏矩阵的长度相同。

我还倾向于记录我的训练数据中的因子水平,以便在预测未见的测试数据集时,我可以确保测试数据具有与训练数据相同的因子水平。这样可以确保测试数据矩阵与训练矩阵具有相同的维度。

来自mtcars的例子:

f<-mpg~hp+as.factor(cyl)
trainMatrix<-sparse.model.matrix(f,mtcars)