Коэффициент корреляции мэтьюса python

Как рассчитать коэффициент корреляции Мэтью в тензорном потоке

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

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

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

3 ответа

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

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) 

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

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

Предполагая, что ваша модель структурирована «нормальным» способом для таких проблем (т. Е. 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] 

Поскольку спрашивающий принял версию Python от sklearn, вот ответ Stewart_Rs на чистом Python:

from math import sqrt def mcc(tp, fp, tn, fn): # https://stackoverflow.com/a/56875660/992687 x = (tp + fp) * (tp + fn) * (tn + fp) * (tn + fn) return ((tp * tn) - (fp * fn)) / sqrt(x) 

Преимущество состоит в том, что он является общим, а не только для оценки двоичных классификаций.

Источник

sklearn.metrics.matthews_corrcoef

Коэффициент корреляции Мэттьюса используется в машинном обучении как мера качества бинарных и мультикласных классификаций.Он учитывает истинные и ложные положительные и отрицательные результаты и обычно рассматривается как сбалансированная мера,которая может быть использована даже в том случае,если классы имеют очень разные размеры.MCC,по сути,является значением коэффициента корреляции между -1 и +1.Коэффициент +1 представляет собой идеальное предсказание,0-среднее случайное предсказание и -1-обратное предсказание.Статистика также известна как коэффициент фи.[источник:Википедия]

Поддерживаются бинарные и многоклассовые метки.Только в бинарном случае это относится к информации об истинных и ложных срабатываниях и негативах.См.ссылки ниже.

Parameters y_truearray, shape = [n_samples]

Основные (правильные)целевые значения.

y_predarray, shape = [n_samples]

Оцененные цели,возвращаемые классификатором.

sample_weightarray-like of shape (n_samples,), default=None

Коэффициент корреляции Мэттьюса (+1 представляет собой идеальное предсказание,0-среднее случайное предсказание и -1 и обратное предсказание).

References

Examples

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

Потеря журнала, также известная как логистическая или кросс-энтропия. Это функция потерь, используемая в (полиномиальной) логистической регрессии и ее расширениях, таких как нейронные сети,

Источник

Matthews Correlation Coefficient is The Best Classification Metric You’ve Never Heard Of

Congratulations! You’ve built a binary classifier —a fancy-schmancy neural network using 128 GPUs with their dedicated power station, or perhaps a robust logistic regression model that runs on your good old ThinkPad. You’ve designed the model and fed the data; now the time has finally come to measure the classifier’s performance.

Don’t get me wrong: ROC curves are the best choice for comparing models. However, scalar metrics still remain popular among the machine-learning community with the four most common being accuracy, recall, precision, and F1-score. Scalar metrics are ubiquitous in textbooks, web articles, online courses, and they are the metrics that most data scientists are familiar with. But a couple of weeks ago, I stumbled upon another scalar metric for binary classification: the Matthews Correlation Coefficient (MCC). Following my “discovery”, I asked around and was surprised to find that many people in the field are not familiar with this classification metric. As a born-again believer, I’m here to spread the gospel!

Let’s start with a quick overview of the “Famous Four” metrics, including a discussion on why they are sometimes not very useful, or even downright misleading. Following that, I’ll introduce the other metric.

As a reminder, in binary classification we have two classes: the so-called positive and negative classes. It is useful to talk about classification metrics using the confusion matrix, which we tally after setting a classification threshold for our binary classifier. (Not familiar with the confusion matrix? Check my other post). The confusion matrix has 4 values, corresponding to the 4 combinations of true and predicted classes. Here’s a typical confusion matrix, with TP, FP, FN and TN representing the four combinations.

Let’s look at a toy example: our data are images of pets, either a dog (🐶), or a cat (🐱). Our classifier detects a pet in each photo, and we would like to measure its performance.

Here is the confusion matrix of our photo classifier. We have a total of 24…

Источник

Читайте также:  margin-bottom
Оцените статью