web-dev-qa-db-ja.com

pythonのマルチクラスデータの真陽性率と偽陽性率(TPR、FPR)

マルチクラス分類問題の真陽性率と偽陽性率をどのように計算しますか?いう、

_y_true = [1, -1,  0,  0,  1, -1,  1,  0, -1,  0,  1, -1,  1,  0,  0, -1,  0]
y_prediction = [-1, -1,  1,  0,  0,  0,  0, -1,  1, -1,  1,  1,  0,  0,  1,  1, -1]
_

混同行列はmetrics.confusion_matrix(y_true, y_prediction)によって計算されますが、それだけで問題がシフトします。


@seraloukの回答の後に編集します。ここで、クラス_-1_はネガティブと見なされますが、_0_および_1_はポジティブのバリエーションです。

4
M K

データを使用して、すべてのクラスのすべてのメトリックを一度に取得できます。

import numpy as np
from sklearn.metrics import confusion_matrix

y_true = [1, -1,  0,  0,  1, -1,  1,  0, -1,  0,  1, -1,  1,  0,  0, -1,  0]
y_prediction = [-1, -1,  1,  0,  0,  0,  0, -1,  1, -1,  1,  1,  0,  0,  1,  1, -1]
cnf_matrix = confusion_matrix(y_true, y_prediction)
print(cnf_matrix)
#[[1 1 3]
# [3 2 2]
# [1 3 1]]

FP = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)  
FN = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)
TP = np.diag(cnf_matrix)
TN = cnf_matrix.sum() - (FP + FN + TP)

FP = FP.astype(float)
FN = FN.astype(float)
TP = TP.astype(float)
TN = TN.astype(float)

# Sensitivity, hit rate, recall, or true positive rate
TPR = TP/(TP+FN)
# Specificity or true negative rate
TNR = TN/(TN+FP) 
# Precision or positive predictive value
PPV = TP/(TP+FP)
# Negative predictive value
NPV = TN/(TN+FN)
# Fall out or false positive rate
FPR = FP/(FP+TN)
# False negative rate
FNR = FN/(TP+FN)
# False discovery rate
FDR = FP/(TP+FP)
# Overall accuracy
ACC = (TP+TN)/(TP+FP+FN+TN)

多くのクラスがある一般的なケースでは、これらのメトリックは次の画像でグラフィカルに表されます。

Confusion matrix multiclass

22
makis

これを解決する方法はいくつかあり、実際に一般的なものはありません( https://stats.stackexchange.com/questions/202336/true-positive-false-negative-true-negative-false-positive- definition-for-mul?noredirect = 1&lq = 1 および https://stats.stackexchange.com/questions/51296/how-do-you-calculate-precision-and-recall-for-multiclass -classification-using-co#51301 )、これは 私が不明確だった論文 で使用されているように見えるソリューションです:

2つの前景ページ間の混乱を誤検知としてカウントする

したがって、解決策はimport numpy as np、 使用する y_trueおよびy_prediction なので np.array、次に:

FP = np.logical_and(y_true != y_prediction, y_prediction != -1).sum()  # 9
FN = np.logical_and(y_true != y_prediction, y_prediction == -1).sum()  # 4
TP = np.logical_and(y_true == y_prediction, y_true != -1).sum()  # 3
TN = np.logical_and(y_true == y_prediction, y_true == -1).sum()  # 1
TPR = 1. * TP / (TP + FN)  # 0.42857142857142855
FPR = 1. * FP / (FP + TN)  # 0.9
0
M K