この質問は、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によって示されているいくつかの回避策があります。
適切な環境でコマンドを評価する場合、コードにバグがあるようです。問題は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)
}
標準の代入演算子(<-)の代わりに、特別な代入演算子<<-を使用できます。オブジェクトをグローバル環境に保存し、問題を解決できます。
@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)