矩阵错误(unlist(out),ncol = times):创建数据分区时数据太长

Error in matrix(unlist(out), ncol = times) : data is too long when create data partition

我想训练一个xgboost模型,但是当我创建数据分区时,它有错误:

library(data.table)
library(caret)
library(xgboost)
digit <- fread("train.csv",header=T)
index <- createDataPartition(digit$label,0.75,list=F)

矩阵错误(unlist(out),ncol = times):数据太长

我用另一种方法创建数据分区,但又出现了一个问题:

dim(digit)
[1] 42000   785
n <- 42000*0.7
index <- sample(1:42000,n)
train <- digit[index]
test <- digit[-index]
xgmat <- xgb.DMatrix(train[,-1],label=train[,1])

xgb.DMatrix(train[ -1], label = train[ 1]) 错误: xgb.DMatrix: 不支持从列表构造 另外: 警告信息: 在 if (class(data) == "dgCMatrix") { 中: 条件的长度 > 1 且仅使用第一个元素

OK,我先把data.frame转换成矩阵:

train <- as.matrix(train)
xgmat <- xgb.DMatrix(train[,-1],label=train[,1])

xgb.DMatrix(train[ -1], label = train[ 1]) 错误: REAL() 只能应用于 'numeric',不能应用于 'integer'

这到底是怎么回事?谁能帮帮我?

您必须使用 index <- createDataPartition(digit$label, p=0.75,list=F),否则 0.75 将被视为 times=0.75 参数。例如,matrix(1:16, ncol=0.75) 导致相同的 'data is too long' 错误。

至于 "REAL() can only be applied to a 'numeric', not a 'integer'" 错误,看起来你的矩阵是一个整数矩阵,而 xgb.DMatrix 期望它是一个数字矩阵。我们将在下一个版本中添加一个修复程序,以便它也接受整数矩阵。同时,作为一种解决方法,您可以简单地将矩阵输入强制为数字:

train <- as.matrix(train) * 1
xgmat <- xgb.DMatrix(train[,-1],label=train[,1])