Проблема в том, что TP
и FP
в вашей матрице смешения поменялись местами.
Как описано в этом примере двоичной классификации, метки интерпретируются следующим образом:
истинный отрицательный expected=0, predicted=0
истинный положительный expected=1, predicted=1
ложный отрицательный expected=1, predicted=0
ложное срабатывание expected=0, predicted=1
Для вашего примера это будет:
## TN TP FN FP
expected = [0]*102 + [1]*60 + [1]*8 + [0]*1
predicted = [0]*102 + [1]*60 + [0]*8 + [1]*1
print ("precision " + '{:.16f}'.format(precision_score(expected, predicted)))
print ("recall " + '{:.16f}'.format(recall_score(expected, predicted)))
print ("accuracy " + '{:.16f}'.format(accuracy_score(expected, predicted)))
precision 0.9836065573770492
recall 0.8823529411764706
accuracy 0.9473684210526315
Таким образом, меры соответствуют ожидаемым.
Матрица задокументирована здесь
По определению матрица путаницы такова, что равна числу наблюдений, о которых известно, чтогруппа, но предсказано быть в группе.Таким образом, в бинарной классификации количество истинных отрицательных значений равно C 0,0, ложных отрицательных значений равно C 1,0, истинных положительных значений C 1,1 равно, а ложных положительных значений равно C 0,1.
Thisприводит к следующему результату:
results = confusion_matrix(expected, predicted)
print('TN ' ,results[0][0])
print('TP ' ,results[1][1])
print('FN ' ,results[1][0])
print('FP ' ,results[0][1])
print(results)
TN 102
TP 60
FN 8
FP 1
[[102 1]
[ 8 60]]
Таким образом, меры снова в порядке, только позиция в матрице путаницы не является обычной с TP
вверху слева.
Средство правовой защитытак же просто, как вручную поменять местами TP
и TN
(results[0][0],results[1][1]) = (results[1][1],results[0][0])
print(results)
[[ 60 1]
[ 8 102]]