我是R的新手。当我尝试运行xgb.importance
时,我得到了这个
"Error in xgb.model.dt.tree(feature_names = feature_names, text = text) :
Non-tree model detected! This function can only be used with tree models".
非常感谢任何帮助。
require(xgboost)
require(Matrix)
require(data.table)
if (!require('vcd')) install.packages('vcd')
a = data.frame(id=c(1,2,3,4,5), smoke=c('Yes','No','Yes', 'Yes', 'Yes'), sugar=c('Yes','No','Yes', 'Yes','Yes'), sex=c('M','F','F', 'M','F'), diseased=c('Yes','No','Yes', 'Yes','Yes'), age=c(20,21,45, 45, 40))
d <- data.table(a, keep.rownames = F)
head(d[,AgeDiscret := as.factor(round(age/10,0))])
head(d[,AgeCat:= as.factor(ifelse(age > 30, "Old", "Young"))])
s <- sparse.model.matrix(age~.-1, data = d)
ov = d[,diseased] == 'Yes'
mdl <- xgboost(data = s, label = ov, max_depth = 4, eta = 1, nthread = 2, nrounds = 10,objective = "binary:logistic")
importance <- xgb.importance(feature_names = colnames(s), model = mdl) #<-- error message
答案 0 :(得分:1)
这里似乎有2个问题。
然后我成功运行了以下代码。
a = data.frame(id=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 18, 19,20), smoked=c('Yes','No','Casual', 'Casual', 'Casual','Yes', 'Yes', 'Yes','Yes', 'Yes', 'Yes','Yes', 'Yes', 'Yes','Yes','Yes','Yes', 'Yes', 'Casual','Casual'), highIntakeSugar=c('Yes','No','Yes', 'Yes','Yes', 'Yes', 'Yes','Yes','Yes', 'Yes','Yes','Yes', 'Yes','Yes','Yes', 'Yes','Yes', 'Yes', 'Yes','Yes'), sex=c('M','F','F', 'M','F','F', 'M','F','F', 'M','F','F', 'M','F','F','F','F', 'M','F','F'), disease=c('Yes','No','Unknown','Unknown','Yes','Unknown', 'Unknown','Yes','Yes', 'Yes','Yes','Yes', 'Yes', 'Yes','Yes', 'Yes','Yes', 'Yes', 'Yes','Yes'), age=c(20,21,45, 45, 40,45, 35, 40,45, 45, 40,45, 45,40,45,40,45,45,40,45))
d <- data.table(a, keep.rownames = F)
d[,id:=NULL]
s <- sparse.model.matrix(age~.-1, data = d)
ov = d[,disease] == 'Yes'
mdl <- xgboost(data = s, label = ov, max_depth = 4, eta = 1, nthread = 2, nrounds = 10,objective = "binary:logistic")
xgb.importance(feature_names = colnames(s), model = mdl)
答案 1 :(得分:1)
当模型参数是一个模型训练的模型时,我遇到了这个错误,该模型的数据在所有预测变量和目标之间始终具有完美的共线性,并且目标始终介于0和1之间(即0、1、0、1、0、1, 0,1,0)。
我使用的数据是为了对包的一部分进行单元测试而生成的测试数据。我通过使用rnorm()作为预测变量和sample()作为目标变量来生成数据来解决了这个问题。
答案 2 :(得分:0)
您应该添加参数“ tree_method”,例如:
mdl <- xgboost(data = s, tree_method = 'gpu_hist', label = ov, max_depth = 4, eta = 1, nthread = 2, nrounds = 10,objective = "binary:logistic")