xgboost 关于数值变量和标签的错误消息

问题描述 投票:0回答:2

我在 R 中使用

xgboost
函数,收到以下错误消息

bst <- xgboost(data = germanvar, label = train$Creditability, max.depth = 2, eta = 1,nround = 2, objective = "binary:logistic")

Error in xgb.get.DMatrix(data, label, missing, weight) : 
  xgboost only support numerical matrix input,
           use 'data.matrix' to transform the data.
In addition: Warning message:
In xgb.get.DMatrix(data, label, missing, weight) :
  xgboost: label will be ignored.

以下是我的完整代码。

credit<-read.csv("http://freakonometrics.free.fr/german_credit.csv", header=TRUE)
library(caret)
set.seed(1000)
intrain<-createDataPartition(y=credit$Creditability, p=0.7, list=FALSE) 
train<-credit[intrain, ]
test<-credit[-intrain, ]


germanvar<-train[,2:21]
str(germanvar)
bst <- xgboost(data = germanvar, label = train$Creditability, max.depth = 2, eta = 1,
               nround = 2, objective = "binary:logistic")

数据混合了连续变量和分类变量。

但是,由于错误消息只能使用连续变量,所以所有变量都被识别为连续的,但错误消息再次出现。

我该如何解决这个问题???

r xgboost gbm
2个回答
6
投票

因此,如果您有以数字表示的分类变量,那么它不是理想的表示形式。但只要树足够深,你就可以逃脱惩罚。树木最终会把它分开。我不喜欢这种方法,但它可以使您的列最少,并且在正确的设置下可以成功。

注意,

xgboost
numeric matrix
作为数据,
numeric
向量作为
label

不是整数:)

以下代码将使用正确的输入进行训练

credit<-read.csv("http://freakonometrics.free.fr/german_credit.csv", header=TRUE)
library(caret)
set.seed(1000)
intrain<-createDataPartition(y=credit$Creditability, p=0.7, list=FALSE) 
train<-credit[intrain, ]
test<-credit[-intrain, ]


germanvar<-train[,2:21]
label <- as.numeric(train$Creditability) ## make it a numeric NOT integer
data <-  as.matrix(germanvar)  # to matrix
mode(data) <- 'double'  # to numeric i.e double precision


bst <- xgboost(data = data, label = label, max.depth = 2, eta = 1,
               nround = 2, objective = "binary:logistic")

0
投票

我收到以下错误消息: #xgb.DMatrix(as.matrix(trainX), label = trainY$myvar) 中的错误: #REAL() 只能应用于“数字”,而不是“逻辑”

事实证明,在创建 DMatrix 的步骤中,我的数据框意外地有 0 行。

因此,在创建 DMatrix 之前检查数据框中的行数是值得的。

© www.soinside.com 2019 - 2024. All rights reserved.