Я создал простую модель для бинарной классификации с помощью Keras. Код:
# create model
model = Sequential()
model.add(Dense(250, input_dim=1, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', 'binary_accuracy'])
Моей целью было проверить результат accuracy и binary_accuracy понять разницу между ними.
Как говорит Керас, binary_accuracy точность имеет порог, который по умолчанию равен .5, а «точность» — нет. Когда я тестирую их с выборочными данными, результат отличается, но в поезде модели у вас одинаковые результаты в каждую эпоху.
Для этой истинной и предсказанной выборки, которую я тестировал accuracy и binary_accuracy:
y_true = [[1], [1], [0], [0]]
y_pred = [[0.51], [1], [0], [0.4]]
Для binary_accuracy это:
m = tf.keras.metrics.BinaryAccuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
Этот результат: 1
Для accuracy это:
m = tf.keras.metrics.Accuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
И результат: '.5'
Но в приведенной выше модели это одинаково для каждого из них в каждую эпоху.
Редактировать
Изменив компиляцию на это, результат изменился:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', tf.keras.metrics.BinaryAccuracy(threshold=.7)])
Почему accuracy работает как binary_accuracy с threshold=0.5 в модели, а не вне модели?
Согласно tf.keras.Model.compile() документации:
Когда вы передаете строки «accuracy» или «acc», мы преобразуем их в одну из tf.keras.metrics.BinaryAccuracy, tf.keras.metrics.CategoricalAccuracy, tf.keras.metrics.SparseCategoricalAccuracy на основе используемой функции потерь и выходная форма модели. Аналогичное преобразование мы делаем и для строк crossentropy и ce.
В вашем случае он был преобразован в BinaryAccuracy, поэтому результат тот же.
Однако tf.keras.metrics.Accuracy — это совсем другое. Если вы читаете документацию:
Вычисляет, как часто прогнозы совпадают с метками.
Это означает, что он рассматривает уникальные значения y_pred и y_true и рассматривает каждое уникальное значение как отдельную метку. В вашем случае 0,51 и 0,4 рассматриваются как отдельные метки, и поскольку они не равны 1 и 0 соответственно, вы получаете 0,5
Приносим извинения за то, что сначала пометили этот вопрос как дубликат, поведение в пакете tf.keras отличается от поведения в пакете keras.
При оценке следует использовать тот же порог. Если вы измените порог, точность, естественно, изменится. При выполнении вывода порог классификации можно настроить в соответствии с вашими потребностями, то есть сбалансировать истинные положительные и истинные отрицательные значения.
Большое спасибо. затем оценить сделать это? он использует threshold=0.5? и когда мы используем прогнозирование и другой порог, точность меняется?