私はrpart
R で分類器を使用しています。問題は、トレーニング済みの分類器をテスト データでテストしたいということです。これで問題ありませんpredict.rpart
。関数を使用できます。
しかし、精度、再現率、F1 スコアも計算したいと思います。
私の質問は、それらの関数を自分で作成する必要がありますか、それとも R またはそのための CRAN ライブラリのいずれかに関数がありますか?
私はrpart
R で分類器を使用しています。問題は、トレーニング済みの分類器をテスト データでテストしたいということです。これで問題ありませんpredict.rpart
。関数を使用できます。
しかし、精度、再現率、F1 スコアも計算したいと思います。
私の質問は、それらの関数を自分で作成する必要がありますか、それとも R またはそのための CRAN ライブラリのいずれかに関数がありますか?
キャレットパッケージを使用:
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
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(auc.tmp@y.values)
...
今このスレッドに出くわしたのでこれを更新するために、confusionMatrix
関数caret
はこれらすべてを自動的に計算します。
cm <- confusionMatrix(prediction, reference = test_set$label)
# extract F1 score for all classes
cm[["byClass"]][ , "F1"] #for multiclass classification problems
「F1」を次のいずれかに置き換えて、関連する値も抽出できます。
「感度」、「特異度」、「Pos Pred Value」、「Neg Pred Value」、「Precision」、「Recall」、「F1」、「Prevalence」、「Detection」、「Rate」、「Detection Prevalence」、「バランスの取れた精度」
二項分類問題のみを行っている場合は、これの動作が少し異なると思いますが、どちらの場合も、confusionMatrix オブジェクトの内部を見ると、これらの値はすべて計算されます。$byClass
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()
提供されたcaret
パッケージを使用することもでき ます。出力には、感度 (再現率とも呼ばれます) と推定値 (精度とも呼ばれます) が含まれます。上記のように、F1 は次のように簡単に計算できます。
F1 <- (2 * precision * recall) / (precision + recall)