web-dev-qa-db-ja.com

警告メッセージ:rpartを使用したキャレットtrain()での「リサンプリングされたパフォーマンス測定値の欠損値」

キャレットパッケージを使用して、「rpart」パッケージでモデルをトレーニングしています。

_tr = train(y ~ ., data = trainingDATA, method = "rpart")
_

データには欠損値やNAはありませんが、コマンドを実行すると警告メッセージが表示されます。

_    Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.
_

誰もがこの警告の意味を知っていますか(または答えを見つける場所を教えてくれますか)?リサンプリングされたパフォーマンス測定値に欠損値があったことを教えていることは知っていますが、それは正確に何を意味し、そのような状況はどのように発生しますか?ところで、predict()関数は近似モデルでうまく機能するので、それは私の好奇心です。

25
USER_1

より多くのデータがなければ決定的に確実ではありません。

これが回帰の場合、最も可能性の高いケースは、ツリーが適切な分割を見つけられず、結果の平均を予測子として使用したことです。それは問題ありませんが、予測の分散がゼロであるため、R ^ 2を計算できません。

分類する場合、それは言うのが難しいです。結果クラスの1つにゼロサンプルがあるリサンプルがあり、感度または特異性は未定義であり、したがってNAです。

23
topepo

問題

問題は、rpartがツリーベースのアルゴリズムを使用していることです。このアルゴリズムは、特定の機能の限られた数の要素しか処理できません。したがって、53を超えるカテゴリを持つファクターに設定された変数がある場合があります。

_> rf.1 <- randomForest(x = rf.train.2, 
+                      y = rf.label, 
+                      ntree = 1000)
Error in randomForest.default(x = rf.train.2, y = rf.label, ntree = 1000) : 
Can not handle categorical predictors with more than 53 categories.
_

問題の根底では、キャレットがその関数を実行しているため、53以上のレベルでカテゴリ変数を修正してください。

ここに私の問題がありました(郵便番号がfactorとして入ってくることに注意してください):

_# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS  #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
                      "v2",
                      "v3",
                      "v4",
                      "v5",
                      "v6",
                      "v7",
                      "v8",
                      "zipcode",
                      "price",
                      "made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
                     v2=as.factor(rf.train.2$v2),
                     v3=as.factor(rf.train.2$v3),
                     v4=as.factor(rf.train.2$v4),
                     v5=as.factor(rf.train.2$v5),
                     v6=as.factor(rf.train.2$v6),
                     v7=as.factor(rf.train.2$v7),
                     v8=as.factor(rf.train.2$v8),
                     zipcode=as.factor(rf.train.2$zipcode),
                     price=rf.train.2$price,
                     made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]
_

ソリューション

53レベルを超えるすべてのカテゴリ変数を削除

カテゴリ変数zipcodeを調整する修正済みコードを次に示します。次のような数値ラッパーでラップすることもできます。as.numeric(rf.train.2$zipcode)

_# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS  #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
                      "v2",
                      "v3",
                      "v4",
                      "v5",
                      "v6",
                      "v7",
                      "v8",
                      "zipcode",
                      "price",
                      "made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
                     v2=as.factor(rf.train.2$v2),
                     v3=as.factor(rf.train.2$v3),
                     v4=as.factor(rf.train.2$v4),
                     v5=as.factor(rf.train.2$v5),
                     v6=as.factor(rf.train.2$v6),
                     v7=as.factor(rf.train.2$v7),
                     v8=as.factor(rf.train.2$v8),
                     zipcode=rf.train.2$zipcode,
                     price=rf.train.2$price,
                     made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]
_
1
bmc

このエラーは、モデルがクロス検証フォールドで収束しなかった場合に発生し、予測の分散はゼロになります。その結果、RMSEやRsquaredなどのメトリックは計算できないため、NAになります。より良い収束のために調整できるパラメーターがある場合があります。ニューラルネットライブラリは、ほとんど常に収束につながるしきい値を上げることを提供します。それでも、rpartライブラリについてはわかりません。

これが発生するもう1つの理由は、トレーニングデータに既にNAが含まれていることです。その後、明らかな解決策は、train(data = na.omit(training.data))で渡す前にそれらを削除することです。

それが少し啓発することを願っています。

1
Agile Bean