マルチクラス分類問題の真陽性率と偽陽性率をどのように計算しますか?いう、
_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
_はポジティブのバリエーションです。
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)
多くのクラスがある一般的なケースでは、これらのメトリックは次の画像でグラフィカルに表されます。
これを解決する方法はいくつかあり、実際に一般的なものはありません( 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