Я использовал joblib.dump для хранения модели машинного обучения (21 класс). Когда я вызываю модель и проверяю ее с помощью набора протяженности, я получаю значение, которое я не знаю, какой это показатель (точность, точность, отзыв и т. Д.)? !! +0,952380952381
Поэтому я вычислил матрицу смешения и FP, FN, TN, TP. Я использовал информацию из этого Ссылка
Я также нашел код из Github.
Я сравнил оба результата (1 и 2). Оба дают одно и то же значение для точности = 0,995464852608. Но этот результат отличается от вышеуказанного !!!
Любые идеи? Правильно ли я рассчитал TP, FP, TN, FN?
МОЯ КОНФУЗИОННАЯ МАТРИЦА
[[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.
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]
Ваш пример немного сбивает с толку. Если вы предоставите некоторые цифры, было бы легче понять и ответить. Например, просто печать 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 его реализует.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.