【问题标题】:How to plot final c50 decision tree model (library C50) from caret::train object如何从 caret::train 对象绘制最终的 c50 决策树模型(库 C50)
【发布时间】:2020-07-18 12:50:20
【问题描述】:

我使用 caret 库中的 train 函数训练了 Decision Tree 模型:

gr = expand.grid(trials = c(1, 10, 20), model = c("tree", "rules"), winnow = c(TRUE, FALSE))
dt = train(y ~ ., data = train, method = "C5.0", trControl = trainControl(method = 'cv', number = 10), tuneGrid = gr)

现在我想为最终模型绘制决策树。但是这个命令不起作用:

plot(dt$finalModel)

Error in data.frame(eval(parse(text = paste(obj$call)[xspot])), eval(parse(text = paste(obj$call)[yspot])),  : 
  arguments imply differing number of rows: 4160, 208, 0

这里已经有人问过了:topic

建议的解决方案是使用拟合的 train 对象中的 bestTune 手动定义相关的 c5.0 模型。然后正常绘制 c5.0 模型

c5model = C5.0(x = x, y = y, trials = dt$bestTune$trials, rules = dt$bestTune$model == "rules", control = C5.0Control(winnow = dt$bestTune$winnow))
plot(c5model)

我试图这样做。是的,它可以绘制 c5.0 模型BUTtrain 对象预测概率并手动重新创建 c5.0 模型 不匹配。

所以,我的问题是:是否可以从 caret::train 对象中提取最终的 c5.0 模型 并绘制此 决策树?

【问题讨论】:

    标签: r decision-tree r-caret c5.0


    【解决方案1】:

    预测的概率应该是一样的,见下:

    library(MASS)
    library(caret)
    library(C50)
    library(partykit)
    
    traindata = Pima.tr
    testdata = Pima.te
    
    gr = expand.grid(trials = c(1, 2), 
    model = c("tree"), winnow = c(TRUE, FALSE))
    
    dt = train(x = traindata[,-ncol(testdata)], y = traindata[,ncol(testdata)], 
    method = "C5.0",trControl = trainControl(method = 'cv', number=3),tuneGrid=gr)
    
    c5model = C5.0.default(x = traindata[,-ncol(testdata)], y = traindata[,ncol(testdata)], 
    trials = dt$bestTune$trials, rules = dt$bestTune$model == "rules", 
    control = C5.0Control(winnow = dt$bestTune$winnow))
    
    all.equal(predict(c5model,testdata[,-ncol(testdata)],type="prob"),
    predict(dt$finalModel,testdata[,-ncol(testdata)],type="prob"))
    [1] TRUE
    

    所以我建议你仔细检查预测是否相同。

    您看到从插入符号绘制最终模型的错误来自存储在 $call 下的内容,这很奇怪,我们可以将其替换为适用于绘图的调用:

    plot(c5model)
    

    finalMod = dt$finalModel
    finalMod$call = c5model$call
    plot(finalMod)
    

    或者您可以像使用训练结果一样重写它,但您可以看到表达式有点复杂(或者至少我不太擅长):

    newcall = substitute(C5.0.default(x = X, y = Y, trials = ntrials, rules = RULES, control = C5.0Control(winnow = WINNOW)),
    list(
    X = quote(traindata[, -ncol(traindata)]),
    Y = quote(traindata[, ncol(traindata)]),
    RULES = dt$bestTune$model == "rules",
    ntrials = dt$bestTune$trials,
    WINNOW = dt$bestTune$winnow)
    )
    
    finalMod = dt$finalModel
    finalMod$call = newcall
    

    【讨论】:

    • 感谢您的帮助,它有效!我认为我找到了概率不匹配的原因。当我这样定义训练函数时: train(data[,-10], data[,10]) 概率与 c5 模型的概率匹配。但是当我使用这种语法时: train(y ~., data=data) 概率不匹配。在您的示例中,两种语法都可以正常工作,我不知道为什么。
    • 我找到了关于定义变量的两种方法的信息:“当使用公式方法时,因子和其他类被保留(即虚拟变量不会自动创建)。这个特定的模型处理非数字数据某些类型(例如字符、因子和有序数据)。” (topepo.github.io/C5.0/reference/C5.0.html)。
    • 我明白了.. 是的,我看到在通话中再次写入了这个因素。感谢分享链接。希望现在一切都适合您?
    猜你喜欢
    • 2019-08-25
    • 2014-02-11
    • 2014-05-13
    • 2018-09-24
    • 2020-08-19
    • 2014-09-13
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多