Python中的数组TP、TN、FP和FN

Python中的数组TP、TN、FP和FN,python,arrays,confusion-matrix,Python,Arrays,Confusion Matrix,我的预测结果是这样的 TestArray [1,0,0,0,1,0,1,...,1,0,1,1], [1,0,1,0,0,1,0,...,0,1,1,1], [0,1,1,1,1,1,0,...,0,1,1,1], . . . [1,1,0,1,1,0,1,...,0,1,1,1], [1,0,0,0,0,1,1,...,1,0,1,1], [1,0,1,1,1,1,0,...,1,0,0,1], [0,1,0,1,0,0,0,...,1,1,1,1], . . . [1,1,0,1,1,0,

我的预测结果是这样的

TestArray

[1,0,0,0,1,0,1,...,1,0,1,1],
[1,0,1,0,0,1,0,...,0,1,1,1],
[0,1,1,1,1,1,0,...,0,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],
[1,0,0,0,0,1,1,...,1,0,1,1],
[1,0,1,1,1,1,0,...,1,0,0,1],
[0,1,0,1,0,0,0,...,1,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],
PredictionArray

[1,0,0,0,1,0,1,...,1,0,1,1],
[1,0,1,0,0,1,0,...,0,1,1,1],
[0,1,1,1,1,1,0,...,0,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],
[1,0,0,0,0,1,1,...,1,0,1,1],
[1,0,1,1,1,1,0,...,1,0,0,1],
[0,1,0,1,0,0,0,...,1,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],
这是我拥有的数组的大小

TestArray.shape

Out[159]: (200, 24)

PredictionArray.shape

Out[159]: (200, 24)
我想得到这些阵列的TP、TN、FP和FN

我试过这个密码

cm=confusion_matrix(TestArray.argmax(axis=1), PredictionArray.argmax(axis=1))
TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]
print(TN,FN,TP,FP)
但是我得到的结果

TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]
print(TN,FN,TP,FP)

125 5 0 1
我检查了cm的形状

cm.shape

Out[168]: (17, 17)
125+5+0+1=131,这不等于我的列数,即200

我预计会有200个,因为数组中的每个单元格假设为TF、TN、FP、TP,所以总数应该是200

如何解决这个问题

下面是一个问题的例子

import numpy as np
from sklearn.metrics import confusion_matrix


TestArray = np.array(
[
[1,0,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1],
[0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,1,0,1,1],
[1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0],
[0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,1,1,1],
[0,0,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,1,1,1],
[1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,0,0,1,0,0],
[1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1],
[0,0,0,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,1,1],
[1,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0],
[1,1,0,1,1,1,1,0,1,0,1,0,1,1,1,1,0,1,0,0]
])

TestArray.shape



PredictionArray = np.array(
[
[0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,1],
[0,1,0,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1],
[1,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0],
[0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,1],
[0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,1,1,0,1],
[1,0,0,1,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0],
[1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,0,1,0,1],
[0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1,1],
[1,0,1,1,0,0,0,1,0,1,0,1,1,1,1,0,0,0,1,0],
[1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1,0,0]
])

PredictionArray.shape

cm=confusion_matrix(TestArray.argmax(axis=1), PredictionArray.argmax(axis=1))
TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]

print(TN,FN,TP,FP)
输出是

5 0 2 0 
=5+0+2+0=7

数组中有20列和10行


但是cm总共给了7个

使用
np.argmax
时,您输入的矩阵
sklearn.metrics.conflusion\u matrix
不再是二进制的,因为
np.argmax
返回第一个出现的最大值的索引。在这种情况下,沿
轴=1

当你的预测不是二元预测时,你不会得到好的结果——真正的肯定/命中、真正的否定/正确的拒绝等等

你应该发现
sum(sum(cm))
确实等于200


如果数组的每个索引表示一个单独的预测,即,您试图获得总共200个(
10*20
)预测的TP/TN/FP/FN,每个预测的结果为
0
1
,然后,您可以通过在将数组解析为
混淆矩阵
之前展平数组来获得TP/TN/FP/FN。也就是说,您可以将
TestArray
PreditionArry
重塑为
(200,)
,例如:

cm=混淆矩阵(TestArray.reformate(-1),PredictionArray.reformate(-1))
TN=cm[0][0]
FN=cm[1][0]
TP=cm[1][1]
FP=cm[0][1]
打印(TN,FN,TP,FP,'=',TN+FN+TP+FP)
返回

74 28 73 25 = 200

使用
np.argmax
时,您输入的矩阵
sklearn.metrics.conflusion\u matrix
不再是二进制的,因为
np.argmax
返回第一个出现的最大值的索引。在这种情况下,沿
轴=1

当你的预测不是二元预测时,你不会得到好的结果——真正的肯定/命中、真正的否定/正确的拒绝等等

你应该发现
sum(sum(cm))
确实等于200


如果数组的每个索引表示一个单独的预测,即,您试图获得总共200个(
10*20
)预测的TP/TN/FP/FN,每个预测的结果为
0
1
,然后,您可以通过在将数组解析为
混淆矩阵
之前展平数组来获得TP/TN/FP/FN。也就是说,您可以将
TestArray
PreditionArry
重塑为
(200,)
,例如:

cm=混淆矩阵(TestArray.reformate(-1),PredictionArray.reformate(-1))
TN=cm[0][0]
FN=cm[1][0]
TP=cm[1][1]
FP=cm[0][1]
打印(TN,FN,TP,FP,'=',TN+FN+TP+FP)
返回

74 28 73 25 = 200

你检查了
cm
的形状了吗?是的,我用cm-shapec编辑了我的问题你可以添加可复制的示例吗?@DavidS我添加了一个示例你检查了
cm
的形状了吗?是的,我用cm-shapec编辑了我的问题你可以添加可复制的示例吗?@DavidS我添加了一个示例,因此你建议不要使用TestArray.argmax(axis=1)?所以您建议不要使用TestArray.argmax(axis=1)?