私はRでrpart
分類子を使用しています。問題は、トレーニング済みの分類子をテストデータでテストすることです。これは問題ありません-predict.rpart
関数。
しかし、私は精度、再現率、F1スコアも計算したいと考えています。
私の質問は-私自身のために関数を作成する必要がありますか、それともRまたはCRANライブラリにそのための関数がありますか?
[〜#〜] rocr [〜#〜] ライブラリはこれらすべておよびその他すべてを計算します(以下も参照してください http://rocr.bioinf.mpi-sb.mpg.de ):
library (ROCR);
...
y <- ... # logical array of positive / negative cases
predictions <- ... # array of predictions
pred <- prediction(predictions, y);
# Recall-Precision curve
RP.perf <- performance(pred, "prec", "rec");
plot (RP.perf);
# ROC curve
ROC.perf <- performance(pred, "tpr", "fpr");
plot (ROC.perf);
# ROC area under the curve
auc.tmp <- performance(pred,"auc");
auc <- as.numeric([email protected])
...
caret パッケージを使用:
library(caret)
y <- ... # factor of positive / negative cases
predictions <- ... # factor of predictions
precision <- posPredValue(predictions, y, positive="1")
recall <- sensitivity(predictions, y, positive="1")
F1 <- (2 * precision * recall) / (precision + recall)
パッケージを使用せずにバイナリおよびマルチクラス分類で機能する一般的な関数は次のとおりです。
f1_score <- function(predicted, expected, positive.class="1") {
predicted <- factor(as.character(predicted), levels=unique(as.character(expected)))
expected <- as.factor(expected)
cm = as.matrix(table(expected, predicted))
precision <- diag(cm) / colSums(cm)
recall <- diag(cm) / rowSums(cm)
f1 <- ifelse(precision + recall == 0, 0, 2 * precision * recall / (precision + recall))
#Assuming that F1 is zero when it's not possible compute it
f1[is.na(f1)] <- 0
#Binary F1 or Multi-class macro-averaged F1
ifelse(nlevels(expected) == 2, f1[positive.class], mean(f1))
}
関数に関するいくつかのコメント:
positive.class
はバイナリf1でのみ使用されますpredicted
とexpected
のレベルが異なる場合、predicted
はexpected
レベルを受け取りますバイナリクラスにはF1スコアが必要であるというコメントに気付きました。通常そうだと思います。しかし、しばらく前に私はこれを書いて、番号で示されたいくつかのグループに分類しました。これは役に立つかもしれません...
calcF1Scores=function(act,prd){
#treats the vectors like classes
#act and prd must be whole numbers
df=data.frame(act=act,prd=prd);
scores=list();
for(i in seq(min(act),max(act))){
tp=nrow(df[df$prd==i & df$act==i,]);
fp=nrow(df[df$prd==i & df$act!=i,]);
fn=nrow(df[df$prd!=i & df$act==i,]);
f1=(2*tp)/(2*tp+fp+fn)
scores[[i]]=f1;
}
print(scores)
return(scores);
}
print(mean(unlist(calcF1Scores(c(1,1,3,4,5),c(1,2,3,4,5)))))
print(mean(unlist(calcF1Scores(c(1,2,3,4,5),c(1,2,3,4,5)))))
キャレットパッケージのconfusionMatrix()は、正の係数としてどの係数をとるべきかを指定する適切なオプションのフィールド「正」とともに使用できます。
confusionMatrix(predicted, Funded, mode = "prec_recall", positive="1")
このコードは、F統計、精度などの追加の値も提供します。
キャレットのconfusionMatrix関数からF1値を簡単に取得できます
result <- confusionMatrix(Prediction, Lable)
# View confusion matrix overall
result
# F1 value
result$byClass[7]
caret
パッケージで提供されるconfusionMatrix()
を使用することもできます。出力には、他のものの間で、感度(リコールとも呼ばれます)とPos Pred Value(精度とも呼ばれます)が含まれます。次に、F1は上記のように、次のように簡単に計算できます。F1 <- (2 * precision * recall) / (precision + recall)