我必须仅使用numpy方法计算多类分类的假阳性率。我有两个numpy数组,一个用于预测((m,k(shape:m是样本元素的计数,k是类别的计数(,另一个用于真实标签((m(shape(。
我已经做了:确定所有行的预测(正(元素索引(prediction_labels数组(,为唯一类别(true_labels(创建一个集合。
我想做的是:在同一时间迭代prediction_labels和y_true数组,并计算给定元素(true_labels中的每个唯一值(在同一位置是否相等。因此,我想在数组(false_positive_counts(中按类别确定假阳性计数
例如:
def false_positive_rate(y_pred, y_true):
prediction_labels = np.argmax(y_pred, axis=1)
true_labels = np.unique(y_true)
false_positive_counts = ... # ?
...
return fpr
y_pred = np.array([[1., 0., 0., 0.],
[1., 0., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 1., 0.],
[0., 1., 0., 0.],
[0., 0., 0., 1.],
]) # [0,0,2,2,1,3]
y_true = np.array([0, 2, 1, 1, 1, 3])
print(false_positive_rate(y_pred, y_true)) # 3/20
您的预测有正面和负面。但是,答案没有错。
因此,您的FPR始终为1。
def false_positive_rate(y_pred_raw, y_true):
y_pred = np.argmax(y_pred_raw, axis=1)
TP, FP, FN, TN = 0,0,0,0
for pp, tt in zip(y_pred, y_true):
if pp==tt: TP+=1;
elif pp!=tt: FP+=1;
# there is no case for FN, TN
print(f"TP={TP}, FP={FP}, FN={FN}, TN={TN}");
FPR = FP/ (TN+FP);
return FPR