我目前正在Coursera上学习“实用机器学习”课程,遇到了一些关于predict函数的奇怪行为。问题要求训练一棵树然后进行一些预测。为了不在这里公布答案,我更改了问题中使用的数据集。代码如下:
rm(list = ls())library(rattle)data(mtcars)mtcars$vs = as.factor(mtcars$vs)set.seed(125)model = train(am ~ ., method = 'rpart', data = mtcars)print(model)fancyRpartPlot(model$finalModel)sampleData = mtcars[1,]sampleData[1,names(sampleData)] = rep(NA, length(names(sampleData)))sampleData[1, c('wt')] = c(4)predict(model, sampleData[1,], verbose = TRUE)
在上面的代码中,有两个主要部分。第一部分构建树,第二部分(从sampleData
开始)创建一个小样本数据集来应用模型。为了确保我拥有与原始数据完全相同的结构,我简单地复制了训练数据集的第一行,然后将所有列设置为NA
。然后我只在决策树需要的列中填入数据(在本例中是wt
变量)。
当我执行上述代码时,我得到以下结果:
Number of training samples: 32 Number of test samples: 0 rpart : 0 unknown predictions were addednumeric(0)
作为参考,以下是树的结构:
fancyRpartPlot(model$finalModel)
能有人帮我理解为什么predict
函数没有为我提供的sampleData
返回预测值吗?
回答:
不幸的是,尽管rpart
只在分支中使用了wt
变量,但预测仍然需要其他变量存在。使用具有相同列的完整数据集:
> predict(model, mtcars[1,])[1] 0.8571429
Max