2017-05-10 8 views
1

ローズライブラリで測定値を計算すると、リコール、精度、およびF1の測定値が得られます。しかし、私がそれらを手動で計算すると、リコールと精度の測定値は異なります。どうして?ROSEパッケージの潜在的なバグ:Rの精度、リコール、精度の差

install.packages("ROSE") 
library(ROSE) 
library(rpart) 


s = sample(957,200) 
training = data[-s,] 
test = data[s,] 

### Rose 
treeimb <- rpart(Riskdrinker ~ ., data = training) 
pred.treeimb <- predict(treeimb, newdata = test) 
accuracy.meas(test$Riskdrinker, pred.treeimb[,2]) 

出力

コール:accuracy.meas(応答=試験の$ Riskdrinker、= pred.treeimb予測[2 ])

例は、場合陽性と標識されています予測が0.5より大きい。

精度:0.919再呼び出し:0.943F:0.465

しかし、このような対策を計算すると、精度とリコールに関する他の結果が得られます。

treeimb <- rpart(Riskdrinker ~ ., data = training) 
pred.treeimb <- predict(treeimb, newdata = test) 
pred <- predict(treeimb, newdata = test, type="class") 
confMat <- table(test$Riskdrinker, pred) 

#Precision 
message("Precision: ", specify_decimal(confMat[1,1]/(confMat[1,1] + confMat[2,1])*100, 1), " %") 


#Recall 
message("Recall: ", specify_decimal(confMat[1]/(confMat[1] + confMat[1,2])*100, 1), " %") 

#Accuracy 
message("Accuracy: ", specify_decimal((confMat[1]+confMat[2,2])/(confMat[1] + confMat[1,2] + confMat[2,1] + confMat[2,2])*100, 1), " %") 

このようにしてください。同じ同じ。

精度< - 和(DIAG(confMat))/ SUM(confMat)

これはもたらす:

  • 精度:76.9パーセント
  • リコール:69.8パーセント
  • 精度:89.0%

コードとの主な違いは、ケースの1つでtype = "class"を使用していることですが、その違いは何ですか?あなたもローズから行列を得ることができますか? これは私のデータセットを公開しない限り、再現可能な例であると言えます。

答えて

0

ROSEライブラリはその後、バグがあるように見える:

精度:0.919リコール:0.943 F:max(p,r) >= f >= min(p,r)

はたぶん、あなたはバグを修正する可能性があるため、0.465

は明らかに矛盾しているが著者にパッチを送ってください。

+0

あなたはどういう意味ですか? max(p、r)> = f> = min(p、r)? – sockevalley

+0

F値は常に精度とリコールの間にある必要があります。これらの2つの境界よりも小さくても大きくてもできません。したがって、ROSEによって報告されたF値、精度、およびリコールの少なくとも1つが間違っていなければなりません。 –

+0

私は正確で新しいバージョンをフォークし、コミットしました。今すぐNicolaからの回答を待っています。 – sockevalley

1

私はローズパッケージでいくつかの実験を行い、実際に間違っていることがわかりました。ここで

は、彼らの.meas機能からいくつかの版画です:

negatives: 21.8284728768508 
n.negatives 45 
postives 135.677199132703 
n.positives 155 
TP: 143 
FP 16 
TN 29 
FN 12 

私たちが見ることができますどのように私のテーブルに混同行列

pred <- predict(treeimb, newdata = test, type="class") 
confMat <- table(pred, test$Riskdrinker) 

      Reference 
Prediction Ja Nej 
     Ja 29 12 
     Nej 16 143 

を比較し、そのTPとTNが間違っているということです。

関連する問題