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

Posted

技术标签:

【中文标题】关于数值变量和标签的 xgboost 错误消息【英文标题】:xgboost error message about numerical variable and label 【发布时间】:2017-12-14 23:36:00 【问题描述】:

我在 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")

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

但是,由于只能使用连续变量的错误提示,所有变量都被识别为连续变量,但错误提示又出现了。

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

【问题讨论】:

“因为只能使用连续变量的错误提示,所有的变量都被识别为连续的,但是错误提示又出现了”是不正确的。这就是发生的情况:因为你有非连续变量,你会得到一个错误,告诉你只使用连续变量。这会停止程序。 错误信息非常好:它告诉你不能有非连续变量。将分类变量编码为数字的解决方案。最常见的方法称为“one-hot encoding”或“dummy variables”。 model.matrix() 是一个可以帮助您执行此操作的函数 - 您可以在 Stack Overflow 上搜索“[r] 虚拟变量”或在 ?model.matrix 的帮助中找到许多示例。 @Gregor 哦,谢谢。但是我必须将其更改为虚拟变量吗?如果我通过将因子类型变量识别为int类型来强制执行它,是否会出现问题? xgboost 使用决策树,在连续数据中寻找切点。如果您的因子是有序的,即 A @Gregor 谢谢你的好信息:)。祝你有美好的一天! 【参考方案1】:

因此,如果您有以数字表示的分类变量,则它不是理想的表示。但是如果树木足够深,您就可以摆脱它。树木最终会将其分割。我不喜欢这种方法,但它可以让你的列最小化,并且在正确的设置下可以成功。

注意xgboostnumeric 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")

【讨论】:

总之,我可以将分类变量更改为数字吗?有问题吗?提升的最大优势之一是分类变量始终可用。所以 gbm 也能够使用因子类型变量。 Xgboost 在这方面似乎有一个缺点。对吗? 是的——xgboost 只处理数字数据。你可以离开你的。分类为数字,可能得到好的结果,或者对它们进行虚拟编码。根据数据,结果会有所不同。 模型运行良好。那么如何使用测试数据来衡量准确性呢? 如果您觉得上面的答案有帮助,请接受这个答案——如果您愿意,可以提出一个新问题!很高兴为您提供帮助 仅供参考:github.com/dmlc/xgboost/pull/2237 中的修复允许直接使用整数矩阵作为 xgb.DMatrix 输入。但是,它还没有在 CRAN 中。

以上是关于关于数值变量和标签的 xgboost 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 分类变量:虚拟化与编码

通过C学Python关于语言数值类型和变量

Python Xgboost GridSearchCV 被杀,如何修复?

为啥 Xgboost 中的功能不匹配错误

XGBoost/CatBoost中具有大量类别的分类变量

XGBoost/CatBoost中具有大量类别的分类变量