web-dev-qa-db-ja.com

Rの場合:is.data.frame(data)のエラー:オブジェクト ''が見つかりません、C5.0プロット

この質問は、Stackoverflowに関する他のいくつかの質問( ここここ および ここ )と似ていますが、十分に異なるため、これらの回答を推定することはできません。私の場合。

C5.0モデルを適合させてから、モデルをプロットしようとする関数があります。

_train_d <- globald[train_ind,c(features,21)]
model <- C5.0(binclass ~ .,data=train_d,trials=10)
_

binclassは、トレーニング/テストデータの列名です(globaldは、__ind_インデックスと列c(3:12,21)で行をサブセット化するデータフレームです。列21の名前はbinclassです)。フィッティングはうまく機能します。ただし、行を追加すると

_plot(model,trial=0)
_

次に、次のエラーが発生します:Error in is.data.frame(data) : object 'train_d' not found

モデルをフィッティングするときに_train_d_が検出されて正しく使用されるのに、プロット中に_train_d_がどこにも見つからない可能性はありますか?そして、この問題を解決する方法の提案。 [r]の名前空間は私には謎のままです。

最小限の実行例は次のとおりです。

_f <- function(){
    library(C50)
    set.seed(1)
    class = c(1,2)
    d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class)
    d$binclass <- as.factor(d$binclass)
    model <- C5.0(binclass ~ ., data=d)
    plot(model)   
}
_

f()を呼び出すと、次のエラーが発生します:Error in is.data.frame(data) : object 'd' not found

編集:MrFlickからの回答によると、この問題の原因はC5.0コードのバグであるようです。 PascalとMrFlickによって示されているいくつかの回避策があります。

5
user989762

適切な環境でコマンドを評価する場合、コードにバグがあるようです。問題はC50::model.frame.C5.0関数にあるようです。私が見つけた「最もクリーンな」回避策は、モデルにtermsプロパティを追加することでした。これは、関数環境をカプセル化するのに役立ちます。

f <- function(){
    library(C50)
    set.seed(1)
    class = c(1,2)
    d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class)
    d$binclass <- as.factor(d$binclass)
    model <- C5.0(binclass ~ ., data=d)
    model$terms <- eval(model$call$formula)   #<---- Added line
    plot(model)   
}
3
MrFlick

標準の代入演算子(<-)の代わりに、特別な代入演算子<<-を使用できます。オブジェクトをグローバル環境に保存し、問題を解決できます。

1
user10854911

@MrFlickはほとんどそれを持っていましたが、完全ではありませんでした。プロットに関するこの問題は、任意のデータとターゲットフィーチャをC50メソッドに渡そうとするときに特に厄介です。 MrFlickが指摘したように、それは用語の名前変更と関係がありました。メソッド呼び出しでx項とy項の名前を変更することにより、プロット関数が混乱することはありません。

tree_model$call$x <- data_train[, -target_index]
tree_model$call$y <- data_train[[target_feature]] 

たとえば、任意のデータとターゲットフィーチャを渡して、結果をプロットできるようにする方法は次のとおりです。

boosted_trees <- function(data_train, target_feature, iter_choice) {

    target_index <- grep(target_feature, colnames(data_train))
    model_boosted <- C5.0(x = data_train[, -target_index], y = data_train[[target_feature]], trial=iter_choice)
    model_boosted$call$x <- data_train[, -target_index]
    model_boosted$call$y <- data_train[[target_feature]]
    return(model_boosted)

}

上記のメソッドによって返されるモデルオブジェクトは、通常どおりにプロットできます。

model <- boosted_trees(data_train, 'my_target', 10)
plot(model)
0
Cybernetic