Я использовал joblib.dump для хранения модели машинного обучения (21 класс). Когда я вызываю модель и проверяю ее с помощью набора протяженности, я получаю значение, которое я не знаю, какой это показатель (точность, точность, отзыв и т. Д.)? !! +0,952380952381

  1. Поэтому я вычислил матрицу смешения и FP, FN, TN, TP. Я использовал информацию из этого Ссылка

  2. Я также нашел код из Github.

Я сравнил оба результата (1 и 2). Оба дают одно и то же значение для точности = 0,995464852608. Но этот результат отличается от вышеуказанного !!!

Любые идеи? Правильно ли я рассчитал TP, FP, TN, FN?

enter image description here

МОЯ КОНФУЗИОННАЯ МАТРИЦА

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]]

МОЙ КОД

 #Testing with the holdout set
 print(loaded_model.score(x_oos, y_oos))
 0.952380952381  <------IS IT ACCURACY?


 #Calculating the Confusion matrix
 cm = confusion_matrix(y_oos, y_oos_pred)
 cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] 

#Calculating values according to link 2.
FP = cm.sum(axis=0) - np.diag(cm)  
FN = cm.sum(axis=1) - np.diag(cm)  
TP = np.diag(cm)
TN = (21 - (FP + FN + TP))  #I put 21 because I have 21 classes


# Overall accuracy
ACC = np.mean((TP+TN)/(TP+FP+FN+TN))


print(ACC)
0.995464852608   <----IT IS DIFFERENT FROM THE ABOVE ONE.
0
Aizzaac 25 Апр 2017 в 00:11

2 ответа

Лучший ответ

Оба являются Точностью.

Первый - общая точность: All_True_Positives / All_classes (20/21).

Второе - это среднее значение точности для каждого класса. Таким образом, мы складываем все эти значения и делим на 21. [0.9524 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.9524 1 1 1]

0
Aizzaac 25 Апр 2017 в 18:29

Ваш пример немного сбивает с толку. Если вы предоставите некоторые цифры, было бы легче понять и ответить. Например, просто печать cm была бы очень полезна.

Что, как говорится. Способ деконструировать sklearn.metrics.confusion_matris выглядит следующим образом (для двоичной классификации):

true_neg, false_pos, false_neg, false_pos = confusion_matrix(y_oos, y_oos_pred).ravel()

Для нескольких классов я думаю, что результат ближе к тому, что у вас есть, но с суммированными значениями. Вот так:

trues = np.diag(cm).sum()
falses = (cm.sum(0) - np.diag(cm)).sum()

Тогда вы можете просто вычислить точность с:

ACC = trues / (trues + falses)

** Обновить**

Из вашего отредактированного вопроса теперь я вижу, что в вашей матрице путаницы у вас есть 21 выборка, из которых 20 были правильно классифицированы. В этом случае ваша точность:

$ \ frac {20} {21} = 0,95238 $

Это значение, напечатанное методом model_score. Итак, вы измеряете точность. Вы просто не воспроизводите это правильно.

n.b , извините за латекс, но, надеюсь, однажды StackOverflow его реализует.

0
Grr 25 Апр 2017 в 17:19