Нет ничего готового, но мы можем рассчитать его по формуле в пользовательской метрике.
Предоставленная вами базовая ссылка на классификацию предназначена для задачи категоризации с несколькими классами, тогда как коэффициент корреляции Мэтьюса предназначен специально для задач бинарной классификации.
Предполагая, что ваша модель структурирована «нормальным» образом для таких проблем (т. Е. y_pred
- это число от 0 до 1 для каждой записи, представляющей прогнозируемую вероятность «Истина», и каждая метка представляет собой точно 0
или 1
, представляющие наземную истину «Ложь», и "True" соответственно), то мы можем добавить показатель Центра клиентов следующим образом:
# if y_pred > threshold we predict true.
# Sometimes we set this to something different to 0.5 if we have unbalanced categories
threshold = 0.5
def mcc_metric(y_true, y_pred):
predicted = tf.cast(tf.greater(y_pred, threshold), tf.float32)
true_pos = tf.math.count_nonzero(predicted * y_true)
true_neg = tf.math.count_nonzero((predicted - 1) * (y_true - 1))
false_pos = tf.math.count_nonzero(predicted * (y_true - 1))
false_neg = tf.math.count_nonzero((predicted - 1) * y_true)
x = tf.cast((true_pos + false_pos) * (true_pos + false_neg)
* (true_neg + false_pos) * (true_neg + false_neg), tf.float32)
return tf.cast((true_pos * true_neg) - (false_pos * false_neg), tf.float32) / tf.sqrt(x)
который мы можем включить в наш вызов model.compile
:
model.compile(optimizer='adam',
loss=tf.keras.losses.binary_crossentropy,
metrics=['accuracy', mcc_metric])
Пример
Вот полный рабочий пример, в котором мы классифицируем многозначные цифры в зависимости от того, больше ли они 4:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
y_train, y_test = 0 + (y_train > 4), 0 + (y_test > 4)
def mcc_metric(y_true, y_pred):
predicted = tf.cast(tf.greater(y_pred, 0.5), tf.float32)
true_pos = tf.math.count_nonzero(predicted * y_true)
true_neg = tf.math.count_nonzero((predicted - 1) * (y_true - 1))
false_pos = tf.math.count_nonzero(predicted * (y_true - 1))
false_neg = tf.math.count_nonzero((predicted - 1) * y_true)
x = tf.cast((true_pos + false_pos) * (true_pos + false_neg)
* (true_neg + false_pos) * (true_neg + false_neg), tf.float32)
return tf.cast((true_pos * true_neg) - (false_pos * false_neg), tf.float32) / tf.sqrt(x)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss=tf.keras.losses.binary_crossentropy,
metrics=['accuracy', mcc_metric])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
выход:
Epoch 1/5
60000/60000 [==============================] - 7s 113us/sample - loss: 0.1391 - acc: 0.9483 - mcc_metric: 0.8972
Epoch 2/5
60000/60000 [==============================] - 6s 96us/sample - loss: 0.0722 - acc: 0.9747 - mcc_metric: 0.9495
Epoch 3/5
60000/60000 [==============================] - 6s 97us/sample - loss: 0.0576 - acc: 0.9797 - mcc_metric: 0.9594
Epoch 4/5
60000/60000 [==============================] - 6s 96us/sample - loss: 0.0479 - acc: 0.9837 - mcc_metric: 0.9674
Epoch 5/5
60000/60000 [==============================] - 6s 95us/sample - loss: 0.0423 - acc: 0.9852 - mcc_metric: 0.9704
10000/10000 [==============================] - 1s 58us/sample - loss: 0.0582 - acc: 0.9818 - mcc_metric: 0.9639
[0.05817381642502733, 0.9818, 0.9638971]
person
Stewart_R
schedule
03.07.2019