8

我正在使用“caret”库对一些树进行交叉验证。

该库提供了一个名为 的函数train,该函数接受一个命名参数“方法”。通过它的省略号,它应该让其他参数落入它调用的另一个函数。这个另一个函数 ( rpart) 接受一个同名的参数,“方法”。

因此,我想传递两个具有相同名称的参数......它显然失败了。我尝试解决如下所示的问题,但出现错误:

“train.default 中的错误(x = myx,y = myy,method = “rpart2”,preProcess = NULL,:形式参数“method”与多个实际参数匹配”

任何帮助深表感谢!谢谢!

train.wrapper = function(myx, myy, mytrControl, mytuneLenght, ...){
   result = train(
                        x=myx,
                        y=myy,
                        method="rpart2",
                        preProcess=NULL,
                        ...,
                        weights=NULL,
                        metric="Accuracy",
                        trControl=mytrControl,
                        tuneLength=mytuneLenght

                      )
   return (result)
 }
dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
                               training.matrix[,1], 
                               2, method="class")
4

2 回答 2

9

这是一个tr调用rp(rpart) 函数并传递它的 (train) 函数的问题模型...

rp <- function(method, ...) method
tr <- function(method, ...) rp(...)

# we want to pass 2 to rp:
tr(method=1, method=2) # Error
tr(1, method=2)        # 1, (wrong value!)
tr(method=1, metho=2)  # 2 (Yay!)

这是什么魔法?为什么最后一个案例真的有效?!好吧,我们需要了解参数匹配在 R 中是如何工作的。f <- function(foo, bar)据说函数具有形式参数“foo”和“bar”,而调用f(foo=3, ba=13)具有(实际)参数“foo”和“ba”。

R 首先匹配与形式参数具有完全相同名称的所有参数。这就是为什么第一个“方法”参数被传递给train. 两个相同的参数名称会导致错误。

然后,R 匹配任何部分匹配(但不匹配的)形式参数的参数名称。但是,如果两个参数名称部分匹配同一个形参,也会导致错误。此外,它只匹配之前 ...的形式参数。因此,必须使用其全名指定after 的形参。...

然后未命名的参数按位置顺序与剩余的形式参数匹配。

最后,如果形式参数包括...,则将剩余参数放入....

呸!所以在这种情况下,对tr完全匹配的调用method,然后将其余部分传递给.... 当trthen 调用rp时,metho参数部分匹配它的形参method,一切都很好!

...Still, I'd try to contact the author of train and point out this problem so he can fix it properly! Since "rpart" and "rpart2" are supposed to be supported, he must have missed this use case!

I think he should rename his method parameter to method. or similar (anything longer than "method"). This will still be backward compatible, but allows another method parameter to be passed correctly to rpart.

于 2012-05-13T21:36:24.573 回答
1

通常,包装器将在命名列表中传递它们的参数。在 的情况下train,提供控制在 trControl 参数中传递。也许你应该尝试:

dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
                           training.matrix[,1], 
              2,   # will be positionally matched, probably to 'myTuneLenght'
                           myTrControl=list(method="class") )

在您发表评论后,我再次查看了train帮助rpart页面。您认为 trControl 有不同的目的可能是正确的。我怀疑您可能需要使用公式来构建调用,因为rpart只有公式方法。如果 y 参数是一个因素,那么 method="class 将由rpart. 和 ... 运行 modelLookup:

modelLookup("rpart2")
     model parameter          label  seq forReg forClass probModel
154 rpart2  maxdepth Max Tree Depth TRUE   TRUE     TRUE      TRUE

...向我建议默认情况下也将采用“类”方法。如果您需要进一步的建议,您可能还需要编辑您的问题以包含数据示例(可能来自rpart帮助页面?)。

于 2012-05-13T21:13:13.603 回答