2016-08-08 3 views
2

私はbstTreeメソッドを使用してモデルをトレーニングし、混乱マトリクスをプリントアウトしようとしています。 adverse_effectsは私のクラス属性です。bstTree予測の混同行列、エラー: 'データには参照と重複するいくつかのレベルが含まれている必要があります。'

set.seed(1234) 
splitIndex <- createDataPartition(attended_num_new_bstTree$adverse_effects, p = .80, list = FALSE, times = 1) 
trainSplit <- attended_num_new_bstTree[ splitIndex,] 
testSplit <- attended_num_new_bstTree[-splitIndex,] 

ctrl <- trainControl(method = "cv", number = 5) 
model_bstTree <- train(adverse_effects ~ ., data = trainSplit, method = "bstTree", trControl = ctrl) 


predictors <- names(trainSplit)[names(trainSplit) != 'adverse_effects'] 
pred_bstTree <- predict(model_bstTree$finalModel, testSplit[,predictors]) 


plot.roc(auc_bstTree) 

conf_bstTree= confusionMatrix(pred_bstTree,testSplit$adverse_effects) 

しかし、私は 'confusionMatrix.defaultでエラーが発生しました(pred_bstTree、testSplit $ adverse_effects): データ参照を重複し、いくつかのレベルが含まれている必要があります。' というエラーが表示されます

max(pred_bstTree) 
[1] 1.03385 
min(pred_bstTree) 
[1] 1.011738 

> unique(trainSplit$adverse_effects) 
[1] 0 1 
Levels: 0 1 

どうすればこの問題を解決できますか?

> head(trainSplit) 
    type New_missed Therapytypename New_Diesease gender adverse_effects change_in_exposure other_reasons other_medication 
5  2   1    14   13  2    0     0    0    0 
7  2   0    14   13  2    0     0    0    0 
8  2   0    14   13  2    0     0    0    0 
9  2   0    14   13  2    1     0    0    0 
11 2   1    14   13  2    0     0    0    0 
12 2   0    14   13  2    0     0    0    0 
    uvb_puva_type missed_prev_dose skintypeA skintypeB Age DoseB DoseA 
5    5    1   1   1 22 3.000  0 
7    5    0   1   1 22 4.320  0 
8    5    0   1   1 22 4.752  0 
9    5    0   1   1 22 5.000  0 
11    5    1   1   1 22 5.000  0 
12    5    0   1   1 22 5.000  0 
+0

回帰を予測していないように見えます。あなたのデータの要素としてadverse_effectsが設定されているかどうかを確認してください。 – phiver

+0

はい、それは0と1を含む因子phiverです。数値に変換した後に予測しても、同じエラーが発生します – SaikiHanee

+0

データのサンプルを追加してみてください。問題がどこにあるかは分かりません。 – phiver

答えて

0

max(pred_bstTree) [1] 1.03385
min(pred_bstTree) [1] 1.011738

とエラーがそれをすべて伝えます。 ROCをプロットすることは、単に異なる閾値点の効果をチェックすることである。閾値丸めに基づいて、例えば、 0.7は1(TRUEクラス)に変換され、0.3は0(FALSEクラス)に変換されます。しきい値が0.5の場合しきい値は(0,1)の範囲にあります

しきい値にかかわらず、最低限の予測でも1より大きいため、常にすべての観測値をTRUEクラスに取得します。分類の代わりに回帰)。予測にゼロがなければ、adverse_effectsのゼロレベルと一致し、したがってこのエラーは「予測」のレベルがありません。

PS:それはあなたのデータ

私はこのエラーを指し、同様の問題を、持っていた
+0

abhiieor、データセットには40000近くのレコードが含まれていますが、データの88%はクラス0に属し、残りはクラス1に属します。 – SaikiHanee

+0

あなたが指定したデータは複製するには少なすぎます。私はあなたが 'model_bstTree < - train(as.factor(adverse_effects)〜、data = trainSplit、method =" bstTree "、trControl = ctrl)'またはそれ以外の 'attended_num_new_bstTree $ adverse_effects < as.factor(attended_num_new_bstTree $ adverse_effects) 'となります。もしそうなら、ロジスティック回帰、ランダムフォレスト、GBMなど他の分類方法を試してみて、あなたが同じ行動をしているかどうかを確認することをお勧めします。理想的には同じ動作をしません。 – abhiieor

3

を掲示せず、エラーの根本的な原因を伝えるために困難になります。私のような物事のカップルにチェックError in confusionMatrix.default(actual, predicted, cutoff = 0.5) : The data must contain some levels that overlap the reference.

:私は、次のエラーを得た

confusionMatrix(actual, predicted, cutoff = 0.5)

アン:私は機能confusionMatrixを使用 - >数値

class(predicted) -

class(actual)>整数を

unique(actual) - >たくさんの値、それは確率が

unique(predicted)あるので、 - > 2つのレベル:0と1

私は機能の遮断部分を適用すると問題があると、結論付けたので、私はで前にそれをやった:

predicted<-ifelse(predicted> 0.5,1,0)

とうまく動作するようになりましたconfusionMatrix機能、実行します。

cm<- confusionMatrix(actual, predicted) cm$table

正しい結果が得られました。あなたは、コードの作業を行うと、解釈が向上する可能性がありますあなたのケースのための

つお持ち帰り、: あなたのご混同行列のための混在入力値(confusionMatrixパッケージdocumetationあたりなど)、代わりに:

conf_bstTree= confusionMatrix(pred_bstTree,testSplit$adverse_effects)

ます書かれている必要があります。

conf_bstTree= confusionMatrix(testSplit$adverse_effects,pred_bstTree)

としては、それが最も可能性の高いあなたfigurたら、あなたは混同行列の解釈に役立つと述べましたそれを機能させる方法を外してください。

希望します。

関連する問題