【发布时间】:2017-08-17 15:28:47
【问题描述】:
我正在制作一个闪亮的应用程序,它确定决策树模型,然后根据用户输入进行预测。
模型是这样开发的:
tr<-prune.tree(tree(Y ~ ., dataset,split="gini"),best=4)
一共有20个变量,树中实际使用的只有5个。所以,我想创建我的应用程序,这样用户只需要输入这 5 个变量,而不是全部。这是我尝试过的(仅显示重要代码):
在 server.r 中:
output$treepred<-renderText({
predict(tr,data.frame(PREVIOUS=input$numeric6,NR_EMPLOYED=input$numeric1,CAMPAIGN=input$numeric7,EMP_VAR_RATE=input$numeric8,CONS_PRICE_IDX=input$numeric9),type="class")
})
在 ui.r 中:
box(textOutput("treepred"))
简单地运行它会返回一个错误“找不到对象'AGE'”(其中 AGE 是一个未使用变量)。如果我只使用被发现相关的变量来重建树,我会得到一个完全不同(而且更糟)的树。 (我也尝试过包含那些不相关的变量,但将它们设置为 NULL 或 NA,但这也不起作用。)
本质上,问题在于 r 希望用户输入所有数据,而他们确实不需要。有谁知道如何解决这个问题?
编辑:
一个小例子:
dir <- "Your directory"
dataset <- read.csv(paste(dir, "Data.csv",sep = ""))
dataset[, c(1, 11:13)] <- lapply(dataset[, c(1, 11:13)],as.integer)
dataset[, c(2:10, 14, 20)] <- lapply(dataset[, c(2:10,14,20)], as.factor)
dataset[, c(15:19)] <- lapply(dataset[, c(15:19)],as.numeric)
dataset$PDAYS[dataset$PDAYS == 999] <- NA #this is NA by the definition of the data
library(tree)
tree<-prune.tree(tree(Y ~ ., dataset,split="gini"),best=4)
plot(tree, type="uniform")
text(tree, pretty=0)
predict(tree,newdata=dataset,type="class")
#The above all works perfectly.
summary(tree)
#This tells us which variables are relevant
predict(tree,newdata=data.frame(PREVIOUS=1,CAMPAIGN=1,EMP_VAR_RATE=50,CONS_PRICE_IDX=100,NR_EMPLOYED=5000))
#returns error: object 'AGE' not found.
#Retraining the tree with only relevant variables:
tree2<-prune.tree(tree(Y ~ PREVIOUS+NR_EMPLOYED+CAMPAIGN+EMP_VAR_RATE+CONS_PRICE_IDX, dataset,split="gini"),best=4)
plot(tree2, type="uniform")
text(tree2, pretty=0)
#This tree is completely different and only ever predicts "no"
这是数据:
【问题讨论】:
-
我现在不能尝试,但是尝试将
textOutput替换为verbatimTextOutuput,并将renderText替换为renderPrint。 -
@Smich7 谢谢,但不幸的是,这会导致同样的错误。
-
非常抱歉,
dataset中有变量“AGE”吗?因为如果它是真的,你不会在predict函数的测试数据框中给出任何“AGE”变量。tree和predict中的数据框应具有相同数量的具有相同名称的变量。那么你在训练你的树时不应该使用Y ~ .,而应该使用Y ~ PREVIOUS+NR_EMPLOYED+CAMPAIGN+EMP_VAR_RATE+CONS_PRICE_IDX。 -
@Smich7 数据集中确实有一个 AGE 变量,但树模型实际上并没有使用该变量(如果您键入 summary(tr) 可以看到)。我也尝试使用您建议的方法训练树,但不幸的是,这会产生完全不同(并且基本上无法使用)的树。
-
一直在看,挺有意思的。很快就会有答案。我认为这只是“复杂”,并且您的数据具有高度的“随机性”,即您拥有的变量无法可靠地预测结果。这会导致“不稳定的树木”。
标签: r tree shiny decision-tree