【问题标题】:R - Getting Non-tree model detected! This function can only be used with tree modelsR - 检测到非树模型!此功能只能与树模型一起使用
【发布时间】:2017-07-28 22:39:36
【问题描述】:

我是 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 

【问题讨论】:

    标签: r xgboost


    【解决方案1】:

    这里似乎有 2 个问题。

    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)
    

    【讨论】:

      【解决方案2】:

      您应该添加参数“tree_method”,例如:

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

      【讨论】:

      【解决方案3】:

      当模型参数是在所有预测变量之间具有完美共线性的数据训练的模型和始终在 0 和 1 之间交替的目标(即 0,1,0,1,0,1, 0,1,0)。

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

      【讨论】:

      • @Riley 我没有研究过内部工作原理或 xgboost 也没有 xgb.importance 足以确定,但我的直觉是:由于预测变量之间的完美共线性,以及由于性质目标变量数据,模型无法学习任何东西,导致“NULL模型”。由于 NULL 模型不是“树模型”,因此调用 xgb.importance 会导致上述错误。
      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2021-04-14
      • 2016-08-30
      • 1970-01-01
      • 2013-04-15
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多