Как рассчитать коэффициент корреляции Мэтью в тензорном потоке - PullRequest
1 голос
/ 03 июля 2019

Итак, я сделал модель с тенорным потоком кера, и она, кажется, работает нормально. Однако мой руководитель сказал, что было бы полезно рассчитать коэффициент корреляции Мэтьюса, а также точность и потери, которые он уже рассчитывает.

моя модель очень похожа на код из учебного руководства (https://www.tensorflow.org/tutorials/keras/basic_classification), за исключением набора данных намного меньшего размера.

есть ли встроенная функция или мне нужно будет получить прогноз для каждого теста и вычислить его вручную?

Ответы [ 2 ]

6 голосов
/ 12 июля 2019

Встроенная функция для расчета коэффициента корреляции Мэтьюса

sklearn.metrics.matthews_corrcoef(y_true, y_pred, sample_weight=None )

пример:

> from sklearn.metrics import matthews_corrcoef
> y_true = [+1, +1, +1, -1]
> y_pred = [+1, -1, +1, +1]
> matthews_corrcoef(y_true, y_pred) 

Пожалуйста, обратитесь https://scikit -learn.org / stable / modules / model_evaluation.html# matthews-corrcoef

Надеюсь, это поможет.

0 голосов
/ 03 июля 2019

Нет ничего нестандартного, но мы можем рассчитать его по формуле в пользовательской метрике.

Базовая ссылка на классификацию, которую вы предоставили, предназначена для многоклассовой задачи категоризации, тогда как коэффициент корреляции Мэтьюса специально предназначен для двоичных задач классификации.

Предполагая, что ваша модель структурирована "обычным" способом для таких проблем (то есть y_pred - это число от 0 до 1 для каждой записи, представляющее прогнозируемую вероятность "True", и каждая метка точно равна 0 или 1 представляет основную правду "Ложь" и "Истина" соответственно), тогда мы можем добавить в метрику MCC следующим образом:

# 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])

Пример

Вот полный обработанный пример, в котором мы классифицируем цифры mnist в зависимости от того, больше ли они 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]
...