首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中的XGBoost错误("'data‘有类'character’和length...")

R中的XGBoost错误("'data‘有类'character’和length...")
EN

Stack Overflow用户
提问于 2018-09-14 03:24:58
回答 2查看 5.7K关注 0票数 3

我在将我的数据拟合到xgboost分类器模型时遇到了困难。当我运行以下命令时:

代码语言:javascript
复制
classifier = xgboost(data = as.matrix(training_set[c(4:15, 17:18,20:28)]), 
  label = training_set$posted_ind, nrounds = 10)

R Studio告诉我:

代码语言:javascript
复制
Error in xgb.DMatrix(data, label = label, missing = missing) : 
'data' has class 'character' and length 1472000.
'data' accepts either a numeric matrix or a single filename. 

训练集数据既有连续数据也有分类数据,但所有分类数据都是这样编码的(并且相同的数据适合随机森林和朴素贝叶斯模型)。为了在xgboost模型中使用这些数据,我需要完成一些额外的步骤吗?

EN

回答 2

Stack Overflow用户

发布于 2019-05-02 22:37:26

确保您的"training_set“没有任何作为因子的列。如果您将分类变量编码为数字,但将它们转换为因子,则会出现此错误。

票数 5
EN

Stack Overflow用户

发布于 2020-04-28 08:40:37

我遇到了同样的问题,并找到了一个完整的解决方案。你必须使用:

代码语言:javascript
复制
sparse_matrix <- sparse.model.matrix(label_y ~ ., data = df)[,-1]
X_train_dmat = xgb.DMatrix(sparse_matrix, label = df$label)

这会将分类数据转换为虚拟变量。存在几种编码方法,例如,一次性编码是一种常见方法。上面的是虚拟对比度编码,它很受欢迎,因为它产生了“满秩”编码(也请参阅Max Kuhn的这篇博客文章)。

其目的是将每个分类特征的每个值转换为二进制特征{0,1}。

例如,列Treatment将替换为两列:TreatmentPlaceboTreatmentTreated。它们中的每一个都是二进制的。因此,转换前在列Treatment中值为Placebo的观察值在转换后将具有新列TreatmentPlacebo中的值1和新列TreatmentTreated中的值0。列TreatmentPlacebo将在对比度编码期间消失,因为它将被吸收到公共常数截距列中。

来源:https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#conversion-from-categorical-to-numeric-variables

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52320502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档