R-检测到非树模型!此功能只能用于树模型

R-检测到非树模型!此功能只能用于树模型,r,xgboost,R,Xgboost,我是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.t

我是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 
require(xgboost)
要求(矩阵)
要求(数据表)
如果(!require('vcd'))安装.packages('vcd'))
a=data.frame(id=c(1,2,3,4,5),smoke=c('Yes','No','Yes','Yes','Yes','Yes','Yes','Yes','Yes','Yes'),sex=c('M','F','F','M','F'),diseased=c('Yes','No','Yes','Yes','Yes年龄=c(20,21,45,40))
d 30,“老的”、“年轻的”))]

这里似乎有两个问题

  • 数据大小不够大
  • 我的数据没有太大变化-例如,烟雾部分我有“是”和“否”。我更新了“是”、“否”和“随意” 然后我成功地运行了以下代码

    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)
    
    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),熏制=c('Yes'、'No'、'Casual'、'Casual'、'Casual'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes'、'Yes')、Yes'、Yes'、Yes'、'highIntakeSugar=c(‘是’、‘不是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、性别=c(‘M’、‘F’、‘F’、‘F’、‘F’、‘F’、‘F’、‘F’)、疾病=c(‘是’、‘否’、‘未知’、‘是’、‘未知’、‘未知’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘是’、‘未知’、‘是’、‘未知’、‘是’、‘未知’、‘未知’、‘是’、‘是’、‘是’),年龄=c(20,21,45,45,45,45,45,45,45,45)
    d您应该添加参数“tree\u method”,如:

    mdl <- xgboost(data = s, tree_method = 'gpu_hist', label = ov, max_depth = 4, eta = 1, nthread = 2, nrounds = 10,objective = "binary:logistic")
    

    mdl当模型参数是一个在所有预测变量和一个始终在0和1之间交替的目标(即0,1,0,1,0,1,0,1,0)之间具有完美共线性的数据上训练的模型时,我遇到了这个错误


    我使用的数据是为包的单元测试部分生成的测试数据。我通过使用rnorm()为预测器变量和sample()生成数据解决了这个问题对于目标变量。

    @Riley我没有研究内部工作或xgboost或xgb。重要程度足以确定,但我的直觉是:由于预测变量之间的完美共线性,以及目标变量数据的性质,模型无法学习任何东西,导致“空模型”。由于空模型不是“树模型”,因此调用xgb.importance会导致上述错误。对我来说,这是有效的,并且还可以使用
    tree\u方法='hist'
    tree\u方法='approx'
    ()