我正在尝试将稀疏矩阵传递给使用xgb训练的插入符号。显然,这可以做到,例如。
library(tidyverse)
library(caret)
library(Matrix)
miris <- select(iris, -Species) %>% as.matrix
sparse_miris <- as(miris, "dgCMatrix")
# sparse matrix
xgb_sparse <- train(x = sparse_miris, y = iris$Species,
method = "xgbTree",
trControl = trainControl(method = "cv", classProbs = TRUE))
这会计算并返回一个模型xgb_sparse。
当我在我的真实数据上尝试这个时,我在每个nround上都会出现重复错误:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
我的真实数据超过1M记录,而且我基于可共享的较小数据样本重新创建失败。我希望我尽可能地描述我的数据,并且有人可能会认识到这个错误。
# make a sparse matrix for xgb
predictors_sparse <- select(training_data, -c(id, cad, cluster)) %>% as.matrix %>% as("dgCMatrix")
> str(predictors_sparse)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:1474634] 47 51 268 360 561 902 1007 1258 1391 1402 ...
..@ p : int [1:96] 0 8044 19465 68596 90202 135268 177588 199513 208843 236602 ...
..@ Dim : int [1:2] 1000000 95
..@ Dimnames:List of 2
.. ..$ : chr [1:1000000] "846520" "2320473" "1203874" "2599268" ...
.. ..$ : chr [1:95] "patrol" "investig" "assault" "alarm" ...
..@ x : num [1:1474634] 1 1 1 1 1 1 1 2 1 1 ...
..@ factors : list()
> str(training_data$cluster)
Factor w/ 64 levels "cluster1","cluster10",..: 23 23 23 43 23 23 38 15 23 13 ...
> length(training_data$cluster)
[1] 1000000
所以我通过训练一个稀疏矩阵,其中包含1M观测值为x和y训练_data $ cluster,这是一个长度为1M的因子变量。
mod_xgb <- train(
x = predictors_sparse, y = training_data$cluster,
method = "xgbTree",
trControl = train_control,
na.action = na.pass,
tuneGrid = xgb_grid,
summaryFunction = "Kappa"
)
我认为没有必要粘贴我的train_control或tuneGrid对象但请告诉我如果被问到我可以将它们粘贴在这里。
我真的想要共享示例数据,但无法在示例上进行复制,只能在1M的完整数据上进行复制。
我很确定我传递的数据是完整的,没有NA值,我在创建变量predictors_sparse
之前检查过。
在插入符号模型的上下文中,任何人都会看到错误吗?
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'