Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何创建自定义模型(使用插入符号中的循环/子模型技巧)_R_Machine Learning_R Caret_Gbm - Fatal编程技术网

R 如何创建自定义模型(使用插入符号中的循环/子模型技巧)

R 如何创建自定义模型(使用插入符号中的循环/子模型技巧),r,machine-learning,r-caret,gbm,R,Machine Learning,R Caret,Gbm,我为这个问题争论了很长时间,令人尴尬。我觉得自己像个十足的白痴,因为答案可能显而易见,但我找不到一条线索来解释如何做到这一点 关于自定义模型创建的文档部分让我感觉很像。我觉得在我的教育过程中,我错过了一些非常具体的课程,每个人现在都记得,但我,因为我发现“是的,只是创建一个自定义模型,然后完成” 实际问题如下: 我想在caret中获得对gbm每次迭代的预测。在gbm中,我可以在predict(…,n.trees=1:100)中使用n.trees,例如,它就完成了 在插入符号中显然因为我需要使用一

我为这个问题争论了很长时间,令人尴尬。我觉得自己像个十足的白痴,因为答案可能显而易见,但我找不到一条线索来解释如何做到这一点

关于自定义模型创建的文档部分让我感觉很像。我觉得在我的教育过程中,我错过了一些非常具体的课程,每个人现在都记得,但我,因为我发现“是的,只是创建一个自定义模型,然后完成”

实际问题如下: 我想在
caret
中获得对
gbm
每次迭代的预测。在
gbm
中,我可以在
predict(…,n.trees=1:100)
中使用
n.trees
,例如,它就完成了

插入符号中
显然因为我需要使用一种叫做子模型的技巧,这意味着——如果我理解正确的话——我必须创建自己的自定义模型

但是我可以在
getModelInfo('gbm')
中看到,有某种循环函数

$gbm$loop
function (grid) 
{
    loop <- plyr::ddply(grid, c("shrinkage", "interaction.depth", 
        "n.minobsinnode"), function(x) c(n.trees = max(x$n.trees)))
    submodels <- vector(mode = "list", length = nrow(loop))
    for (i in seq(along = loop$n.trees)) {
        index <- which(grid$interaction.depth == loop$interaction.depth[i] & 
            grid$shrinkage == loop$shrinkage[i] & grid$n.minobsinnode == 
            loop$n.minobsinnode[i])
        trees <- grid[index, "n.trees"]
        submodels[[i]] <- data.frame(n.trees = trees[trees != 
            loop$n.trees[i]])
    }
    list(loop = loop, submodels = submodels)
$gbm$loop
功能(网格)
{

loop下面是一个关于如何为每个树的测试数据提取所需预测的示例:

library(caret)
library(mlbench) #for the data set
data(Sonar) #some data set I always use on stack overflow

res <- train(Class~.,
             data = Sonar,
             method = "gbm",
             trControl = trainControl(method = "cv", #some evaluations scheme
                                      number = 5,
                                      savePredictions = "all"), #tell caret you would like to save all,
             tuneGrid = expand.grid(shrinkage = 0.01,
                                    interaction.depth = 2, 
                                    n.minobsinnode = 10,
                                    n.trees = 1:100)) #some random values and all the trees

res$pred #results are stored in here


您也可以选择不
savePredictions=“all”
因为这会导致一个内存不足的train对象。而是使用
res$results
来计算所有所需的指标。

所以您希望对每个树的训练数据进行预测?这有什么意义?如果您希望对每个树进行交叉验证/引导预测,我可能会提供帮助没有创建自定义模型的每一棵树。据我所知,插入符号不便于为任何模型提取训练预测,因为它们的意义很小。@这一点非常重要,但我希望为每一棵树获取训练和测试数据的预测,以便稍后创建用于演示目的的学习曲线。我希望拥有完全的控制权在参数方面,我希望尽可能减少所有黑盒类型的元素,因此到目前为止,我对交叉验证选项不感兴趣。我也不明白为什么插入符号使这一点很难实现。在我看来,这一功能对于每次演示上比较不同算法的性能非常重要。algorithm性能无法根据列车数据进行估计,这很可能是caret的作者选择不提供列车数据预测的方便访问的原因。@missuse I specified我也希望(主要是)拉取测试数据的预测。这看起来很像我希望获得的结果。但在没有交叉验证的情况下也可以这样做吗?(trainControl(method=“none”)。很抱歉,我在手机上,这里的编辑非常有限。因为当我这样做时,than caret告诉我不能为参数指定一个值范围。不幸的是,没有,因为使用
method=“none”
不提供预测,您可以只指定一个超参数组合。这是不允许的,这真的很奇怪。我想我唯一的选择似乎是创建自定义模型?感谢您的帮助。您可以使用
mlr
库提取训练和测试预测。请检查我的回答:
library(ggplot2)

ggplot(res$results)+
  geom_line(aes(x = n.trees, y = Accuracy))