8

「キャレット」ライブラリを使用して、いくつかのツリーで相互検証を行っています。

ライブラリはtrain、名前付き引数「メソッド」を受け取る という関数を提供します。その省略記号を介して、他の引数をそれが呼び出す別の関数にフォールスルーさせることになっています。この別の関数 ( rpart) は、同じ名前の「メソッド」の引数を取ります。

したがって、同じ名前の 2 つの引数を渡したいのですが、明らかに失敗しています。以下に示すように回避しようとしましたが、エラーが発生します。

「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

(rpart)関数trを呼び出して渡す(train)関数を使用した問題のモックアップを次に示します。rp...

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です。同一の引数名が 2 つあると、エラーが発生します。

次に、R は、(まだ一致していない) 仮パラメーターに部分的に一致する任意の引数名に一致します。ただし、2 つの引数名が同じ仮パラメーターと部分的に一致する場合も、エラーが発生します。また、 の前 の仮パラメータのみに一致します...。そのため、正式なパラメータは完全な名前を使用 ...て指定する必要があります。

次に、名前のない引数は、位置の順序で残りの仮引数と照合されます。

最後に、仮引数に が含まれ...ている場合、残りの引数は に入れられます...

ふぅ!したがって、この場合、 への呼び出しは にtr完全に一致methodし、残りを に渡し...ます。trthen を呼び出すとrpmetho引数はその仮パラメータmethodと部分的に一致し、すべて問題ありません!

...それでも、作者に連絡trainしてこの問題を指摘して、彼が適切に修正できるようにします! 「rpart」と「rpart2」がサポートされているはずなので、彼はこのユースケースを見逃していたに違いありません!

method彼は自分のパラメーターの名前をに変更する必要があると思いますmethod.(「メソッド」よりも長いもの)。これには下位互換性がありますが、別のmethodパラメータを に正しく渡すことができます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") )

あなたのコメントの後、私はtrainrpartヘルプ ページを再度見直しました。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 に答える