Rでの精度と再現率の計算


8

私が誰かが結婚しているか独身かを予測するロジスティック回帰分類器を構築しているとしましょう。(1 =結婚、0 =単一)少なくとも75%の精度が得られる精度-再現率曲線上の点を選択したいので、しきい値およびt 2を選択して、次のようにします。t1t2

  • 分類子の出力がより大きい場合、「結婚」を出力します。t1
  • 出力が未満の場合、「単一」を出力します。t2
  • 出力が間にある場合は、「わからない」と出力します。

いくつかの質問:

  1. 精度の標準的な定義の下では、精度は結婚したクラスの精度のみを測定することになると思います(つまり、精度=結婚を正しく予測する#回/結婚を予測する合計#回)。ただし、私が本当にやりたいことは、全体の精度を測定することです(つまり、結婚または独身を正しく予測した合計#回/結婚または独身を予測した合計#回)。これは大丈夫ですか?そうでない場合、私は何をすべきですか?
  2. Rでこの「全体的な」精度/再現率曲線を計算する方法はありますか(たとえば、ROCRパッケージまたは他のライブラリを使用して)?現在ROCRパッケージを使用していますが、一度に1つのクラスの精度/リコールしか得られないようです。

回答:


7

この目的のための関数は、Rによるデータマイニングの演習に基づいて作成しました。

# Function: evaluation metrics
    ## True positives (TP) - Correctly idd as success
    ## True negatives (TN) - Correctly idd as failure
    ## False positives (FP) - success incorrectly idd as failure
    ## False negatives (FN) - failure incorrectly idd as success
    ## Precision - P = TP/(TP+FP) how many idd actually success/failure
    ## Recall - R = TP/(TP+FN) how many of the successes correctly idd
    ## F-score - F = (2 * P * R)/(P + R) harm mean of precision and recall
prf <- function(predAct){
    ## predAct is two col dataframe of pred,act
    preds = predAct[,1]
    trues = predAct[,2]
    xTab <- table(preds, trues)
    clss <- as.character(sort(unique(preds)))
    r <- matrix(NA, ncol = 7, nrow = 1, 
        dimnames = list(c(),c('Acc',
        paste("P",clss[1],sep='_'), 
        paste("R",clss[1],sep='_'), 
        paste("F",clss[1],sep='_'), 
        paste("P",clss[2],sep='_'), 
        paste("R",clss[2],sep='_'), 
        paste("F",clss[2],sep='_'))))
    r[1,1] <- sum(xTab[1,1],xTab[2,2])/sum(xTab) # Accuracy
    r[1,2] <- xTab[1,1]/sum(xTab[,1]) # Miss Precision
    r[1,3] <- xTab[1,1]/sum(xTab[1,]) # Miss Recall
    r[1,4] <- (2*r[1,2]*r[1,3])/sum(r[1,2],r[1,3]) # Miss F
    r[1,5] <- xTab[2,2]/sum(xTab[,2]) # Hit Precision
    r[1,6] <- xTab[2,2]/sum(xTab[2,]) # Hit Recall
    r[1,7] <- (2*r[1,5]*r[1,6])/sum(r[1,5],r[1,6]) # Hit F
    r}

バイナリ分類タスクの場合、これは、各分類の精度、再現率、およびF統計と、全体的な精度を次のように返します。

> pred <- rbinom(100,1,.7)
> act <- rbinom(100,1,.7)
> predAct <- data.frame(pred,act)
> prf(predAct)
      Acc     P_0       R_0       F_0       P_1       R_1       F_1
[1,] 0.63 0.34375 0.4074074 0.3728814 0.7647059 0.7123288 0.7375887

このように各クラスのP、R、Fを計算すると、どちらか一方が問題を引き起こしているかどうかを確認でき、P、R、Fの全体的な統計情報を簡単に計算できます。私はROCRパッケージを使用していませんが、いくつかのパラメーターの範囲で分類子をトレーニングし、範囲に沿ったポイントで分類子の関数を呼び出すことにより、同じROC曲線を簡単に導出できます。


精度と再現コードが交換されたと思います。r [1,5] <-xTab [2,2] / sum(xTab [2、])
danioyuan

6

ロバートがそれを正しく述べたように、精度は進むべき道です。ROCRで計算できることを追加したいだけです。ヘルプ(パフォーマンス)を見て、さまざまなメジャーを選択してください。

たとえば、ROCRでは、カットオフと呼ばれる1つの決定しきい値のみが使用されます。次のコードは、精度とカットオフをプロットし、最大精度のカットオフを抽出します。

require(ROCR)

# Prepare data for plotting
data(ROCR.simple)
pred <- with(ROCR.simple, prediction(predictions, labels))
perf <- performance(pred, measure="acc", x.measure="cutoff")

# Get the cutoff for the best accuracy
bestAccInd <- which.max(perf@"y.values"[[1]])
bestMsg <- paste("best accuracy=", perf@"y.values"[[1]][bestAccInd], 
              " at cutoff=", round(perf@"x.values"[[1]][bestAccInd], 4))

plot(perf, sub=bestMsg)

その結果

ここに画像の説明を入力してください

不確実性の中間領域を作成するために2つのしきい値で操作するには(これは、状況/ターゲットアプリケーションで許可されている場合に有効な方法です)ROCRで2つのパフォーマンスオブジェクトを作成できます。

  1. 正のクラスのカットオフvs真陽性率(tpr)別名精度
  2. カットオフvs真の負のレート(tnr)別名負のクラスの精度

パフォーマンスベクトルから適切なカットオフを選択し(Rメソッドを使用)、それらを組み合わせて目的のバランスを達成します。これは簡単なはずなので、読者への練習問題として残しておきます。

最後の注意:両方のクラスの精度と計算精度の違いは何ですか?たとえば、それらを(加重)平均に結合しますか?

精度は加重平均を計算します。クラスcの重みは、クラスcのインスタンスの数に相当します。つまり、クラスのスキューが大きい場合(たとえば、98%のネガティブ)は、すべてのインスタンスのラベルのネガティブを予測するように設定することで、単に精度を「最適化」できます。このような場合、両方のクラスの精度の重み付けされていない単純な平均は、メトリックのゲームを妨げます。バランスの取れたクラスの場合、どちらの計算方法でも当然同じ結果になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.