27

私はrpartR で分類器を使用しています。問題は、トレーニング済みの分類器をテスト データでテストしたいということです。これで問題ありませんpredict.rpart。関数を使用できます。

しかし、精度、再現率、F1 スコアも計算したいと思います。

私の質問は、それらの関数を自分で作成する必要がありますか、それとも R またはそのための CRAN ライブラリのいずれかに関数がありますか?

4

7 に答える 7

28

キャレットパッケージを使用:

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))
}

関数に関するいくつかのコメント:

  • F1 = NA がゼロであると仮定します
  • positive.classバイナリ f1 でのみ使用されます
  • マルチクラスの問題の場合、マクロ平均 F1 が計算されます
  • predictedとのexpectedレベルが異なる場合は、レベルpredictedを受け取りますexpected
于 2016-04-25T14:45:32.910 に答える
24

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)

...
于 2011-12-14T09:22:57.243 に答える
12

今このスレッドに出くわしたのでこれを更新するために、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

于 2019-09-26T21:28:21.477 に答える
4

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)))))
于 2015-06-17T15:51:27.800 に答える
1

confusionMatrix()提供されたcaretパッケージを使用することもでき ます。出力には、感度 (再現率とも呼ばれます) と推定値 (精度とも呼ばれます) が含まれます。上記のように、F1 は次のように簡単に計算できます。 F1 <- (2 * precision * recall) / (precision + recall)

于 2017-01-29T17:45:49.937 に答える