Оценка эффекта классификации машинного обучения

машинное обучение

Для задач регрессии обычно существует четыре метода: MSE, MAE, RMSE и R^2 для оценки эффекта модели. Для задач классификации проще всего использовать показатель точности для оценки производительности модели. Например, оценка по умолчанию для проблем классификации в sklearn основана на степени точности.

Использовать точность для оценки понимания несложно, но прогнозы на крайне искаженных данных могут быть проблематичными. Например, для задачи прогнозирования рака отношение здоровых к больным может составлять 10 000:1. Для таких крайне искаженных данных мы можем сделать простейшую модель и напрямую предсказать, что все образцы относятся к здоровому классу, так что уровень точности модели может достигать 99,99%.

Для этого типа данных оценка модели алгоритма классификации может быть оценена с помощью матрицы путаницы.

матрица путаницы

Чтобы облегчить объяснение матрицы путаницы и таких терминов, как показатель точности и показатель отзыва, мы сначала проанализируем проблему двух классов в качестве примера.

фактический/прогнозируемый 0 1
0 TN FP
1 FN TP
  1. В приведенной выше таблице строки представляют фактические значения, а столбцы представляют прогнозируемые значения.
  2. 0 представляет отрицательное значение, 1 представляет положительное значение.
  3. TN (True Negative) означает, что фактическое значение отрицательное, предсказанное значение отрицательное, а предсказанное отрицательное значение правильное.
  4. FP (ложноположительный) означает, что фактическое значение отрицательное, предсказанное значение положительное, а предсказанное положительное неверно.
  5. FN (ложноотрицательный) означает, что фактическое значение положительное, предсказанное значение отрицательное, а предсказанное отрицательное значение неверно.
  6. TP (True Positive) означает, что фактическое значение положительно, предсказанное значение положительно, а предсказанное положительное значение неверно.

Вышеизложенное немного абстрактно, но вот конкретный пример.

фактический/прогнозируемый 0 1
0 9980 10
1 3 7
  1. 9980 человек сами не болели раком, и алгоритм также предсказал, что у них не было рака.
  2. У 10 человек нет рака, но алгоритм предсказывает, что у них рак.
  3. У 3 человек рак, но алгоритм предсказывает, что у них нет рака.
  4. У 7 человек был рак, и алгоритм предсказал, что у них рак.

точность

Определение точности: предсказаниеСледите за исходом событияИз 17 прогнозов вероятность верна, 7 раз верна и 10 раз неверна.

Точность = TP / (TP + FP) = 7 / (10+7), что означает, что при наличии 17 прогнозов болезни среднее значение верно 7 раз.

отзывать

Отзыв определяется как вероятность предсказания интересующего типа (т. е. 10 пациентов) (прогнозировано 7).

Напомним = TP / (TP + FN) = 7 / (7 + 3) = 70%, что означает, что каждый раз, когда есть 100 пациентов, алгоритм может успешно найти 70 пациентов и пропустить 30 пациентов.

F1-Score

Для некоторых сценариев более целесообразно выбрать уровень точности, например, в сценарии прогноза запасов, чтобы предсказать, будет ли акция расти или падать, бизнес должен быть более точным, чтобы найти акции, которые могут вырасти. Для сценария прогнозирования болезни, чтобы предсказать, болен ли пациент, бизнес-требование в настоящее время состоит в том, чтобы найти всех больных пациентов, не пропуская ни одного пациента.Можно сказать, что может не иметь большого значения диагностика здорового человека как больного. пациента, пока он не был диагностирован как здоровый.

Однако в некоторых сценариях необходимо одновременно сочетать точность и скорость отзыва, что нам делать в это время? Эту проблему можно решить с помощью f1-оценки, где f1 — среднее гармоническое точности и полноты:

F 1=\frac{2 \cdot \text { precision} \cdot \text {recall} }{\text { precision }+\text { recall }}

Пример

Чтобы продемонстрировать три концепции, упомянутые выше, сначала мы сначала создадим чрезвычайно искаженные данные.Мы выбираем sklearn, чтобы предоставить набор данных для распознавания рукописного ввода.В этом наборе данных десять чисел от 0 до 9 распределены равномерно.Данные десятилетия преобразуются в двоичные данные, один класс равен 9, а другой класс не равен 9, чтобы создать перекос данных.

import numpy as np
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()

y[digits.target==9] = 1
y[digits.target!=9] = 0

Используйте логистическую регрессию, чтобы делать прогнозы:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)

log_reg.score(X_test, y_test)

Поскольку данные сильно искажены, точность может составлять около 90 %, даже если прогнозируется, что все выборки относятся к типу 0. Точность может указывать только на точность прогноза модели для каждой выборки и не может действительно точно находить выборки типа 1, то есть точность не отражает, точно ли модель нашла выборки типа 1. Пакет показателей sklearn обеспечивает прямую поддержку матрицы путаницы, точности и отзыва.

from sklearn.metrics import confusion_matrix

confusion_matrix(y_test, y_log_predict)

from sklearn.metrics import precision_score

precision_score(y_test, y_log_predict)

from sklearn.metrics import recall_score

recall_score(y_test, y_log_predict)

from sklearn.metrics import f1_score

f1_score(y_test, y_log_predict)

Кривая PR

Для задач бинарной классификации мы можем настроить граничное значение классификации, чтобы отрегулировать соотношение точности и полноты. Он классифицируется как 1, когда оценка > порога, и 0, когда оценка

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()
y[digits.target==9] = 1
y[digits.target!=9] = 0

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
decision_scores = log_reg.decision_function(X_test)


from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

precisions = []
recalls = []
thresholds = np.arange(np.min(decision_scores), np.max(decision_scores), 0.1)

for threshold in thresholds:
    y_predict = np.array(decision_scores >= threshold, dtype='int')
    precisions.append(precision_score(y_test, y_predict))
    recalls.append(recall_score(y_test, y_predict))
plt.plot(precisions, recalls)
plt.show()

ROC-кривая

ROC (кривая рабочих характеристик приемника) используется для описания взаимосвязи между TPR и FPR, где:

  1. TPR(Истинная положительная частота) представляет собой истинную частоту, количество положительных результатов образца, предсказанных как положительные / фактическое количество положительных образцов: TPR = TP /(TP + FN)
  2. TNR(True Negative Rate) представляет истинный отрицательный процент; количество отрицательных результатов выборки, предсказанных как отрицательные / фактическое количество отрицательных выборок: TNR = TN /(TN + FP)
  3. FPR(Коэффициент ложноположительных результатов) представляет собой частоту ложноположительных результатов; количество отрицательных результатов пробы, предсказанных как положительные / фактическое количество отрицательных проб: FPR = FP / (TN + FP)
  4. FNR(Коэффициент ложноотрицательных результатов) представляет собой процент ложноотрицательных результатов; количество положительных результатов выборки, предсказанных как отрицательные / фактическое количество положительных результатов: FNR = FN /(TP + FN)
F P R=\frac{F P}{T N+F P}
T P R=\frac{T P}{T P+F N}

Пример

import numpy as np
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()
y[digits.target==9] = 1
y[digits.target!=9] = 0

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
decision_scores = log_reg.decision_function(X_test)

from sklearn.metrics import roc_curve

fprs, tprs, thresholds = roc_curve(y_test, decision_scores)

import matplotlib.pyplot as plt
plt.plot(fprs, tprs)
plt.show()

ROC-曲线

Площадь, ограниченная ROC-кривой и границей графика, используется в качестве критерия для измерения качества модели: чем больше площадь, тем лучше модель.