Аннотация: в этой статье в основном представлены показатели оценки задач классификации глубокого обучения.Основное содержание включает базовые приложения, практические навыки, принципы и механизмы и надеемся быть полезными для всех.
Эта статья опубликована в сообществе HUAWEI CLOUD.«Общие метрики оценки для задач классификации глубокого обучения», оригинальный автор: lutianfei.
В этой статье в основном представлены оценочные показатели задач классификации глубокого обучения.Основное содержание включает в себя базовые приложения, практические навыки, принципы и механизмы.Я надеюсь, что это будет полезно для всех.
классификационная модель
матрица путаницы
реализация sklearn:
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None)
返回值:一个格式化的字符串,给出了分类结果的混淆矩阵。
参数:参考classification_report 。
混淆矩阵的内容如下,其中Cij表示真实标记为i但是预测为j的样本的数量。
Confusion Matrix:
[[5 0]
[3 2]]
def calc_confusion_matrix(y_true: list, y_pred: list, show=True, save=False, figsize=(16, 16), verbose=False):
"""
计算混淆矩阵
:param y_true:
:param y_pred:
:param show:
:param save:
:param figsize:
:param verbose:
:return:
"""
confusion = confusion_matrix(y_true, y_pred)
if verbose:
print(confusion)
if show:
show_confusion_matrix(confusion, figsize=figsize, save=save)
return confusion
def show_confusion_matrix(confusion, classes=MY_CLASSES, x_rot=-60, figsize=None, save=False):
"""
绘制混淆矩阵
:param confusion:
:param classes:
:param x_rot:
:param figsize:
:param save:
:return:
"""
if figsize is not None:
plt.rcParams['figure.figsize'] = figsize
plt.imshow(confusion, cmap=plt.cm.YlOrRd)
indices = range(len(confusion))
plt.xticks(indices, classes, rotation=x_rot, fontsize=12)
plt.yticks(indices, classes, fontsize=12)
plt.colorbar()
plt.xlabel('y_pred')
plt.ylabel('y_true')
# 显示数据
for first_index in range(len(confusion)):
for second_index in range(len(confusion[first_index])):
plt.text(first_index, second_index, confusion[first_index][second_index])
if save:
plt.savefig("./confusion_matrix.png")
plt.show()
Матрица путаницы — это инструмент визуализации в обучении с учителем, который в основном используется для сравнения результатов классификации с реальной информацией об экземплярах. в матрицекаждая строкапредставитель инстанциикатегория прогноза,каждый столбецпредставитель инстанцииреальная категория.
Как понять:
P (положительный): прогнозируется как положительный образец
N (отрицательный): прогнозируется как отрицательный образец
T (Истина): предсказание верно
F(False): ошибка предсказания
- True (TruePositive, TP): положительные образцы, предсказанные моделью как положительные. Прогноз равен 1, прогноз правильный, т.е. фактический 1
- Ложноположительный результат (FP): отрицательные образцы, предсказанные моделью как положительные. Прогноз равен 1, прогноз неверен, т.е. фактический 0
- Ложноотрицательный (FN): положительные образцы, предсказанные моделью как отрицательные. Прогноз равен 0, прогноз неверен, т.е. фактический 1
- True Negative (TN): отрицательные образцы, предсказанные моделью как отрицательные. Прогноз равен 0, прогноз правильный, т.е. фактический 0
True Positive Rate (TPR) или показатель чувствительности (sensitivity)
TPR = TP/(TP+FN) -> количество положительных результатов прогнозирования выборки/фактическое количество положительных выборок
Из приведенной выше формулы видно, что TPR эквивалентен Recall
Частота истинно отрицательных результатов (TNR) или специфичность/специфичность
TNR=TN/(TN+FP) -> количество результатов предсказания отрицательной выборки/фактическое количество отрицательных выборок
Ложноположительный показатель (FPR)
FPR = FP/(FP+TN) -> количество отрицательных результатов выборки, предсказанных как положительные / фактическое количество отрицательных выборок
Частота ложноотрицательных результатов (FNR)
FNR = FN/(TP+FN) -> количество положительных результатов выборки, предсказанных как отрицательные / фактическое количество положительных результатов выборки
Точность (правильная скорость, Точность)
Также называется коэффициентом точности,Прогнозируемые правильные результаты в процентах от общей выборки, наиболее часто используемый показатель эффективности классификации.
Формула: Точность =(TP+TN)/(TP+FN+FP+FN)
Недостаток: ограничения, когда образец не сбалансирован.
Например: когда отрицательные выборки составляют 99%, классификатор также может получить точность 99%, предсказывая все выборки как отрицательные выборки. Поэтому, когда пропорция выборок разных категорий очень несбалансирована, категория с большей долей, как правило, является наиболее важным фактором, влияющим на точность.
реализация sklearn:
from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
返回值:如果normalize为True,则返回准确率;如果normalize为False,则返回正确分类的数量。
参数:
y_true:真实的标记集合。
y_pred:预测的标记集合。
normalize:一个布尔值,指示是否需要归一化结果。
如果为True,则返回分类正确的比例(准确率)。
如果为False,则返回分类正确的样本数量。
sample_weight:样本权重,默认每个样本的权重为 1 。
# 方法封装
def calc_accuracy_score(y_true: list, y_pred: list, verbose=False):
res = accuracy_score(y_true, y_pred)
if verbose:
print("accuracy:%s" % res)
return res
Частота ошибок
То есть количество положительных и отрицательных примеров/общее количество ложных предсказаний.
Правильная скорость и частота ошибок — это показатели, которые оцениваются как с положительной, так и с отрицательной стороны, а сумма двух значений точно равна 1.
ErrorRate = (FP+FN)/(TP+FN+FP+TN)
Точность (точность, точность)
точность(Точность), также известная какТочность, что длярезультат прогнозаговоря, значитВероятность положительного образца среди всех предсказанных положительных образцов, что означает, что в результате, предсказанном как положительный образец, мыНасколько вы уверены, что можете правильно предсказывать?, формула выглядит следующим образом:
Precision = TP/(TP+FP)
Недостатки: прогнозируемый результат имеет только 1 положительный пример, и он правильный, с точностью 100%. На самом деле есть много отрицательных примеров неправильных предсказаний, то есть истинно положительных примеров.
Сценарий: прогнозируется, что запас поднимется, но он на самом деле поднялся в 10 раз, но только два раза прогнозируются, и прогноз претендует, а прогноз исправляет оба раза, то точность, которую мы хотим, и скорость отзыва не является важно в это время.
реализация sklearn:
from sklearn.metrics import precision_score
sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1,
average='binary', sample_weight=None)
返回值:查准率。即预测结果为正类的那些样本中,有多少比例确实是正类。
参数:
y_true:真实的标记集合。
y_pred:预测的标记集合。
labels:一个列表。当average 不是'binary' 时使用。
对于多分类问题,它表示:将计算哪些类别。不在labels 中的类别,计算macro precision
时其成分为 0 。
对于多标签问题,它表示:待考察的标签的索引。
除了average=None 之外,labels 的元素的顺序也非常重要。
默认情况下,y_true 和 y_pred 中所有的类别都将被用到。
pos_label:一个字符串或者整数,指定哪个标记值属于正类。
如果是多分类或者多标签问题,则该参数被忽略。
如果设置label=[pos_label] 以及average!='binary' 则会仅仅计算该类别的precision 。
average:一个字符串或者None,用于指定二分类或者多类分类的precision 如何计算。
'binary':计算二类分类的precision。 此时由pos_label
指定的类为正类,报告其precision 。
它要求y_true、y_pred 的元素都是0,1 。
'micro':通过全局的正例和负例,计算precision 。
'macro':计算每个类别的precision,然后返回它们的均值。
'weighted':计算每个类别的precision,然后返回其加权均值,权重为每个类别的样本数。
'samples':计算每个样本的precision,然后返回其均值。该方法仅仅对于多标签分类问题有意义。
None:计算每个类别的precision,然后以数组的形式返回每个precision 。
sample_weight:样本权重,默认每个样本的权重为 1
# 方法封装
def calc_precision_score(y_true: list, y_pred: list, labels=MY_CLASSES, average=None, verbose=False):
res = precision_score(y_true, y_pred, labels=labels, average=average)
if verbose:
print("precision:%s" % res)
return res
Скорость отзыва (скорость отзыва, отзыв)
Припоминание, также известное как припоминание, представляет собойоригинальный образецговоря, значитВероятность предсказания положительного результата среди действительно положительных образцов, формула выглядит следующим образом:
Recall = TP/(TP+FN)
Недостатки: Когда все предсказанные положительные примеры охватывают все реальные положительные примеры, показатель припоминания также составляет 100%.
Сценарии применения скорости отзыва: Например, возьмем в качестве примера ставку по умолчанию для онлайн-кредитов.По сравнению с хорошими пользователями, мы больше заботимся о плохих пользователях и не можем пропустить ни одного плохого пользователя. Потому что, если мы будем слишком считать плохих пользователей хорошими пользователями, возможная сумма дефолта в будущем намного превысит сумму процентов по кредиту, выплачиваемую хорошими пользователями, что приведет к серьезным убыткам. Чем выше показатель отзыва, тем выше вероятность того, что будет предсказан настоящий плохой пользователь, и его смысл аналогичен: лучше убить тысячу по ошибке и никогда не отпускать ни одного.
реализация sklearn:
from sklearn.metrics import recall_score
sklearn.metrics.recall_score(y_true, y_pred, labels=None,
pos_label=1,average='binary', sample_weight=None)
返回值:查全率。即真实的正类中,有多少比例被预测为正类。
参数:参考precision_score。
# 方法封装
def calc_recall_score(y_true: list, y_pred: list, labels=MY_CLASSES, average=None, verbose=False):
res = recall_score(y_true, y_pred, labels=labels, average=average)
if verbose:
print("recall: %s" % res)
return res
Положительные показатели точности и отзыва на рисунке ниже еще раз иллюстрируют
Кривая PR
Согласно формуле точности и полноты, можно знать, что числитель точности и полноты одинаковы, оба являются TP, но знаменатель различен, один равен (TP+FP), а другой равен ( ТП+ФН). Отношения между ними можно показать на диаграмме PR:
Конечным результатом модели классификации часто является значение вероятности. Обычно нам нужно преобразовать значение вероятности в определенную категорию. Для второй классификации мы устанавливаем порог (порог), а затем оцениваем его как положительный класс, если он выше этого порога и наоборот. Вышеуказанные показатели оценки (точность, точность, полнота) предназначены для определенного порога, поэтому, когда разные модели принимают разные пороги, как всесторонне оценить разные модели? Поэтому для оценки здесь необходимо ввести кривую PR, кривую Precision-Recall.
Чтобы найти наиболее подходящий порог, отвечающий нашим требованиям, мы должны пройти все пороги от 0 до 1, и каждый порог соответствует паре точности и полноты, поэтому мы получаем эту кривую.
Как показано на рисунке ниже, ордината — это показатель точности P, а абсцисса — показатель полноты R. Для модели точка на ее кривой PR представляет, что при определенном пороге модель определяет результат выше порога как положительную выборку, а результат меньше порога как отрицательную выборку, а возвращаемый результат соответствует Пара отзыв и точность, как координата в системе координат PR.
Вся кривая P-R создается путем смещения порога от высокого к низкому. Чем ближе кривая P-R к правому верхнему углу (1,1), тем лучше модель. В реальных сценариях необходимо всесторонне оценивать качество различных моделей в соответствии с различными требованиями к принятию решений.
стандарт оценки:
Сначала посмотрите на гладкие и не гладкие (чем ровнее, тем лучше). В целом на одном и том же тестовом наборе верхняя лучше нижней (зеленая линия лучше красной). Значение F1 наибольшее, когда значения P и R близки. В этой точке нарисуйте линию, соединяющую (0,0) и (1,1). Значение F1 является наибольшим там, где линия и кривая PR перекрываются. В настоящее время F1 относится к кривой PR, как AUC к ROC.
Площадь под кривой PR называется AP (ScreadPression), которая представляет среднее значение точности отзыва от 0-1. AP может быть рассчитан с точками. Область AP не будет больше 1. Чем больше площадь под кривой PR, тем лучше модель производительности.
Так называемая модель производительности должна быть высоким уровнем, а скорость отзыва увеличивается.
реализация sklearn:
sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_label=None,
sample_weight=None)
返回值:一个元组,元组内的元素分别为:
P-R曲线的查准率序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为
thresholds[i]时的查准率。
P-R曲线的查全率序列。该序列是递减序列,序列第 i 个元素是当正类概率的判定阈值为
thresholds[i]时的查全率。
P-R曲线的阈值序列thresholds。该序列是一个递增序列,给出了判定为正例时的正类概率的阈值。
参数:
y_true:真实的标记集合。
probas_pred:每个样本预测为正类的概率的集合。
pos_label:正类的类别标记。
sample_weight:样本权重,默认每个样本的权重为 1。
def calc_precision_recall_curve(class_info, class_name=None, show=True, save=False, verbose=False):
"""
计算PR曲线
:param class_info:
:param class_name:
:param show:
:param save:
:param verbose:
:return:
"""
precision, recall, thresholds = precision_recall_curve(class_info['gt_lbl'], class_info['score'])
if verbose:
print("%s precision:%s " % (class_name, precision,))
print("%s recall:%s " % (class_name, recall,))
print("%s thresholds:%s " % (class_name, thresholds,))
if show:
show_PR_curve(recall, precision, class_name)
return precision, recall, thresholds
Метод рисования кривой PR:
def show_PR_curve(recall, precision, class_name=None, save=False):
"""
绘制PR曲线
:param recall:
:param precision:
:param class_name:
:param save:
:return:
"""
plt.figure("%s P-R Curve" % class_name)
plt.title('%s Precision/Recall Curve' % class_name)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall, precision)
if save:
plt.savefig("./%s_pr_curve.png")
plt.show()
Среднее гармоническое значение F1
F1Score, также известный как F-Measure, представляет собой гармоническое значение коэффициента точности и коэффициента полноты, которое ближе к меньшему из двух чисел, поэтому значение F1 является наибольшим, когда коэффициент точности и коэффициент полноты близки. . Многие системы рекомендаций оцениваются с помощью F1Score.
Precision и Recall - два противоречивых и унифицированных индикатора.Чтобы улучшить значение Precision, классификатор должен попытаться предсказать образец как положительный образец, когда он «более уверен», но в это время он имеет тенденцию многое пропускать, потому что это слишком консервативно. «Неуверенные» положительные образцы, что приводит к более низкому значению полноты. Так как же выбрать модель, когда у отзывов и точности разных моделей есть свои преимущества? Если мы хотим найти баланс между ними, нам нужна новая метрика: оценка F1. Оценка F1 учитывает как точность, так и отзыв, так что они могут быть самыми высокими одновременно, соблюдая баланс. Формула для оценки F1: 2*точность*отзыв / (точность + отзыв). Балансовая точка, которую мы видим на кривой PR на рисунке 1, является результатом оценки F1.
То есть в реальном сценарии, если одна из двух моделей имеет особенно высокую точность и особенно низкую полноту, а другая имеет особенно высокую полноту и особенно низкую точность, показатель f1 может быть схожим, а окончательный оценка не может быть сделана через f1socre.Необходимо выбрать другие подходящие индикаторы, чтобы делать оценки в соответствии с различными сценариями.
реализация sklearn:
from sklearn.metrics import f1_score #调和平均值F1
f1_score(y_true, y_pred, labels=None, pos_label=1, average='binary',
sample_weight=None)
返回值: 值。即查准率和查全率的调和均值。
参数:参考precision_score。
#方法封装
def calc_f1_score(y_true: list, y_pred: list, labels=MY_CLASSES, average=None, verbose=False):
res = f1_score(y_true, y_pred, labels=labels, average=average)
if verbose:
print("f1_score: %s" % res)
return res
ROC-кривая
ROC (кривая рабочих характеристик приемника — кривая рабочих характеристик приемника, также известная как кривая восприимчивости), которая графически описывает производительность двухклассовой модели, является индикатором для комплексной оценки модели.
Причина, по которой ROC и AUC могут игнорировать дисбаланс выборки, заключается в следующем: чувствительность и (1-специфичность), также известная как истинная частота (TPR) и ложноположительная частота (FPR). Поскольку TPR и FPR основаны на фактической производительности 1 и 0 соответственно, то есть они наблюдают связанные с вероятностью проблемы в реальных положительных и отрицательных выборках соответственно. Из-за этого это не повлияет на то, сбалансирован образец или нет.
Например, в общей выборке 90 % составляют положительные образцы, а 10 % — отрицательные образцы. Мы знаем, что в использовании показателя точности есть вода, но использование TPR и FPR — это не одно и то же. Здесь TPR обращает внимание только на то, сколько из 90 % положительных образцов фактически покрыты, и не имеет ничего общего с 10 % Точно так же FPR обращает внимание только на то, сколько из 10 % отрицательных образцов покрыты ошибками, и это не имеет ничего общего с 90%. используются в качестве индикаторов ROC/AUC.
Ось X: частота ложных срабатываний (FPR), доля истинных отрицательных результатов, которые модель предсказывает как ложные положительные результаты. Доля ошибочно оцененных положительных классов ко всем отрицательным классам с медицинской точки зрения эквивалентна частоте ошибочных диагнозов.
Ось Y: истинная скорость (TPR), предсказание модели соответствует пропорции истинного и положительного.
Чем ближе кривая ROC к диагонали, тем ниже точность модели.
Описание кривой:
Кривые ROC получены по координатам FPR и TPR при разных порогах. В частности, путем динамической настройки порога вероятности модели (порог вероятности означает, насколько вероятно, что модель будет оценена как положительный класс), начиная с самого высокого значения (например, 1, что соответствует нулевой точке кривой ROC) и постепенно настраиваясь на наименьшее значение вероятности. Каждое значение вероятности соответствует FPR и TPR, и положение, соответствующее каждому значению вероятности, рисуется на диаграмме ROC, а затем все точки соединяются для получения окончательной кривой ROC.
Характеристики кривой:
-
При настройке порога оценки классификации (по умолчанию порог логистической регрессии равен 0,5) соответственно изменяются TPR и FPR, а затем в координатах кривой ROC формируются несколько точек, чтобы отразить классификационный эффект модели.
-
Чем быстрее увеличивается TPR и чем ниже FPR, тем более выпуклая кривая, тем выше эффективность классификации модели, то есть тем больше положительных примеров прогнозируется как правильные.
-
Кривая ROC проходит над двумя точками (0,0), (1,0). причина:
Пороговое значение по умолчанию для модели логистической регрессии равно 0,5.Когда результатом sigmoid() является вероятность класса p ≥ 0,5 по умолчанию, модель предсказывает класс 1 (положительный пример). Затем, когда модифицированный порог равен 0, модель p≥0 предсказывает категорию 1 (положительный пример), указывая на то, что модель будет предсказывать все данные как категорию 1 (независимо от того, правильные они или неправильные) ниже этого порога. В это время FN=TN =0, TPR=FPR=1 Когда модифицированный порог равен 1, модель p≥1 предсказывает категорию 1 (положительный пример), а p вряд ли будет больше 100%, что указывает на то, что модель будет предсказывать все данные как категорию 0. ниже этого порога (независимо от того, правильно это или нет), в это время FP=TP=0, TPR=FPR=0
реализация sklearn:
roc_curve函数用于计算分类结果的ROC曲线。其原型为:
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None,
drop_intermediate=True)
返回值:一个元组,元组内的元素分别为:
ROC曲线的FPR序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为
thresholds[i]时的假正例率。
ROC曲线的TPR序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为
thresholds[i]时的真正例率。
ROC曲线的阈值序列thresholds。该序列是一个递减序列,给出了判定为正例时的正类概率的阈值。
参数:
y_true:真实的标记集合。
y_score:每个样本预测为正类的概率的集合。
pos_label:正类的类别标记。
sample_weight:样本权重,默认每个样本的权重为 1。
drop_intermediate:一个布尔值。如果为True,则抛弃某些不可能出现在ROC曲线上的阈值。
#方法封装
def calc_roc_curve(class_info, class_name=None, show=True, save=False, verbose=False):
"""
计算roc曲线
:param class_info:
:param class_name:
:param show:
:param save:
:param verbose:
:return:
"""
fpr, tpr, thresholds = roc_curve(class_info['gt_lbl'], class_info['score'], drop_intermediate=True)
if verbose:
print("%s fpr:%s " % (class_name, fpr,))
print("%s tpr:%s " % (class_name, tpr,))
print("%s thresholds:%s " % (class_name, thresholds,))
if show:
auc_score = calc_auc_score(fpr, tpr)
show_roc_curve(fpr, tpr, auc_score, class_name)
return fpr, tpr, thresholds
Метод рисования кривой ROC:
def show_roc_curve(fpr, tpr, auc_score, class_name=None, save=False):
plt.figure("%s ROC Curve" % class_name)
plt.title('%s ROC Curve' % class_name)
plt.xlabel('False Positive Rate') # 横坐标是fpr
plt.ylabel('True Positive Rate') # 纵坐标是tpr
plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % auc_score)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([-0.1, 1.1])
plt.ylim([-0.1, 1.1])
if save:
plt.savefig("./%s_auc_curve.png")
plt.show()
AUC (площадь ROC-кривой)
AUC (площадь под кривой определяется как площадь под кривой ROC. Очевидно, что значение этой площади не будет больше 1. Поскольку кривая ROC обычно находится выше линии y=x, диапазон значений AUC обычно составляет 0,5. и Между 1. Значение AUC используется в качестве критерия оценки, поскольку во многих случаях ROC-кривая четко не указывает, какой классификатор лучше, и в качестве значения лучше классификатор с большей AUC.
реализация sklearn:
roc_auc_score函数用于计算分类结果的ROC曲线的面积AUC。其原型为:
sklearn.metrics.roc_auc_score(y_true, y_score, average='macro',
sample_weight=None)
返回值:AUC值。
参数:参考 roc_curve。
#也可以通过如下方法计算得到
def calc_auc_score(fpr, tpr, verbose=False):
res = auc(fpr, tpr)
if verbose:
print("auc:%s" % res)
return res
Существует два способа расчета AUC: метод трапеций и ROC.
Метод AUCH использует метод аппроксимации для получения приблизительных значений, подробности см. в Википедии.
Критерии оценки качества классификатора (прогностической модели) из AUC:
-
AUC = 1, это идеальный классификатор, при использовании этой модели прогнозирования существует как минимум один порог для получения идеального прогноза. В подавляющем большинстве случаев прогнозирования идеального классификатора не существует.
-
0,5
-
AUC = 0,5, следующая машина угадывает то же самое (например, потеря медной пластины), модель не имеет прогностической ценности.
-
AUC
Три примера значений AUC:
Проще говоря: чем больше значение AUC классификатора, тем выше показатель точности.
Примечание: Чтобы сравнить определения TPR, FPR, Precision и Recall, знаменатель TPR и Recall — это количество положительных классов в выборке, а знаменатель FPR — это количество отрицательных классов в выборке. выборки определяется, это фиксированное значение, поэтому три изменения каждого показателя монотонно возрастают с увеличением числителя. Однако в знаменателе Precision находится количество прогнозируемых положительных классов, которое будет меняться при изменении порога, поэтому на изменение Precision влияет комбинированный эффект TP и FP, который не является монотонным и изменение непредсказуемо. .
Метод построения кривой ROC-AUC в случае нескольких классов
def show_roc_info(classdict, show=True, save=False, figsize=(30, 22), fontsize=12):
"""
多类别情况下计算展示每个类别的roc-auc图
:param classdict:
:param show:
:param save:
:param figsize:
:param fontsize:
:return:
"""
def sub_curve(fpr, tpr, auc_score, class_name, sub_idx):
plt.subplot(6, 5, sub_idx)
plt.title('%s ROC Curve' % class_name)
plt.xlabel('False Positive Rate') # 横坐标是fpr
plt.ylabel('True Positive Rate') # 纵坐标是tpr
plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % auc_score)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([-0.1, 1.1])
plt.ylim([-0.1, 1.1])
if show:
plt.figure("Maoyan video class AUC Curve", figsize=figsize)
plt.subplots_adjust(bottom=0.02, right=0.98, top=0.98)
for idx, cls in enumerate(MY_CLASSES):
if cls in classdict:
fpr, tpr, thresholds = calc_roc_curve(classdict[cls], class_name=cls, show=False)
auc_score = calc_auc_score(fpr, tpr)
print("%s auc:\t\t\t%.4f" % (cls, auc_score))
if show:
sub_curve(fpr, tpr, auc_score, cls, idx + 1)
else:
print("%s auc:\t\t\t0" % cls)
sub_curve([0], [0], 0, cls, idx + 1)
if save:
plt.savefig("./maoyan_all_auc_curve.png")
if show:
plt.show()
Практические советы по использованию
Для ROC в целом, если ROC гладкий, в принципе можно судить о том, что переобучения не так много (например, от 0,2 до 0,4 на рисунке могут быть проблемы, но выборок слишком мало). Модель можно отрегулировать, только взглянув на AUC. Чем больше площадь, тем лучше считается модель.
Для PRC (прецизионная кривая отзыва) и ROC сначала смотрите на гладкость, а не на плавность (синяя линия явно лучше), а потом смотрите, кто входит, а кто выходит (на одном и том же тестовом наборе).Вообще говоря, верхняя лучше, чем нижний (зеленая линия лучше, чем красная линия) хорошо). Когда P и R ближе к F1, чем больше, вообще говоря, F1, где линия, соединяющая (0,0) и (1,1), совпадает с PRC, является наибольшим F1 этой линии (в случае гладкости). F1 для PRC — то же, что AUC для ROC. Число легче настроить модель, чем линию.
AP
Строгий АД — это площадь под кривой PR, а mAP — среднее арифметическое всех классов АД.
Однако эта площадь обычно оценивается приближенным методом.
реализация sklearn:
sklearn.metrics.average_precision_score(y_true, y_score, average=‘macro’,
sample_weight=None)
注意:此实现仅限于二进制分类任务或多标签分类任务。
参数:
y_true : array, shape = [n_samples] or [n_samples, n_classes]
真实标签:取0和1
y_score : array, shape = [n_samples] or [n_samples, n_classes]
预测标签:[0,1]之间的值。
可以是正类的概率估计、置信值,也可以是决策的非阈值度量(如某些分类器上的“决策函数”返回的)
average : string, [None, ‘micro’, ‘macro’ (default), ‘samples’, ‘weighted’]
sample_weight : array-like of shape = [n_samples], optional sample weights.
#方法封装
def calc_AP_score(class_info, class_name=None, average="macro", verbose=True):
res = average_precision_score(class_info['gt_lbl'], class_info['score'], average=average)
if verbose:
print("%s ap:\t\t\t%.4f" % (class_name, res))
return res
Метод расчета АП
Во-первых, используйте обученную модель, чтобы получить показатель достоверности всех тестовых образцов, предполагая, что в определенном классе есть 20 тестовых образцов, каждый идентификатор, показатель достоверности и основная правда.
Этикетки следующие:
Затем отсортируйте показатель доверия, чтобы получить:
Рассчитайте TopN, соответствующий отзыву и точности. Среди них для значения полноты r значение точности принимаетвсе вспоминает>= максимальное значение r (это гарантирует, что кривая p-r монотонно убывает, и позволяет избежать колебания кривой). Этот метод называется интерполяцией по всем точкам. Это значение АР также является площадью под кривой PR.
Например: отзыв топ5=2/6, точность=2/5=0,4, когда отзыв>=2/6, максимальная точность равна 1.
Отзыв = 3/6, точность = 3/6 от top6, а максимальная точность составляет 4/7, когда все повторы> = 3/6.
В настоящее время
AP=1*(1/6) + 1*(1/6)+ (4/7)*(1/6) + (4/7)*(1/6) + (5/11)*(1/6) + (6/16)*
(1/6) = 0.6621
Соответствующая кривая Precision-Recall (эта кривая монотонно убывающая) выглядит следующим образом:
mAP
средняя средняя точность, то есть среднее значение AP для каждой категории
Используйте описанный выше метод, чтобы рассчитать AP каждого класса отдельно, а затем возьмите среднее значение, чтобы получить mAP. Преимущество mAP заключается в том, что он может предотвратить смещение AP для большого количества категорий.
реализация sklearn:
#mAP计算封装
def calc_mAP_score(classdict, verbose=True):
AP = []
for cls in MY_CLASSES:
if cls in classdict:
AP.append(calc_AP_score(classdict[cls], cls))
else:
print("%s ap:\t 0" % cls)
AP.append(0)
mAP_score = np.mean(AP)
if verbose:
print("mAP:%s" % mAP_score)
return mAP_score
В случае нескольких категорий рассчитывается и отображается карта pr и соответствующее значение AP для каждой категории.
def show_mAP_info(classdict, show=True, save=False, figsize=(30, 22), fontsize=12):
"""
多类别情况下计算展示每个类别的pr图及对应的AP值
:param classdict:
:param show:
:param save:
:param figsize:
:param fontsize:
:return:
"""
def sub_curve(recall, precision, class_name, ap_score, sub_idx):
plt.subplot(6, 5, sub_idx)
plt.title('%s PR Curve, ap:%.4f' % (class_name, ap_score))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall, precision)
AP = []
if show:
plt.figure("Maoyan video class P-R Curve", figsize=figsize)
plt.subplots_adjust(bottom=0.02, right=0.98, top=0.98)
for idx, cls in enumerate(MY_CLASSES):
if cls in classdict:
ap_score = calc_AP_score(classdict[cls], cls)
precision, recall, thresholds = calc_precision_recall_curve(classdict[cls], class_name=cls, show=False)
if show:
sub_curve(recall, precision, cls, ap_score, idx + 1)
else:
ap_score = 0
print("%s ap:\t\t\t0" % cls)
sub_curve([0], [0], cls, ap_score, idx + 1)
AP.append(ap_score)
if save:
plt.savefig("./maoyan_all_ap_curve.png")
if show:
plt.show()
mAP_score = np.mean(AP)
print("mAP:%s" % mAP_score)
return mAP_score
Способ получения необходимой информации на этикетке в случае нескольких категорий
def get_simple_result(df: DataFrame):
y_true = []
y_pred = []
pred_scores = []
for idx, row in df.iterrows():
video_path = row['video_path']
gt_label = video_path.split("/")[-2]
y_true.append(gt_label)
pred_label = row['cls1']
y_pred.append(pred_label)
pred_score = row['score1']
pred_scores.append(pred_score)
return y_true, y_pred, pred_scores
def get_multiclass_result(df: DataFrame):
classdict = {}
for idx, row in df.iterrows():
video_path = row['video_path']
gt_label = video_path.split("/")[-2]
pred_label = row['cls1']
pred_score = row['score1']
if pred_label in classdict:
classdict[pred_label]['score'].append(pred_score)
classdict[pred_label]['gt_lbl'].append(1 if gt_label == pred_label else 0)
else:
classdict[pred_label] = {'score': [pred_score], 'gt_lbl': [1 if gt_label == pred_label else 0]}
return classdict
потеря журнала (log_loss)
from sklearn.metrics import log_loss
log_loss(y_true,y_pred)
Текстовый отчет о метриках классификации (classification_report)
Функцияclassification_report используется для отображения текстового отчета об основных метриках классификации. Отображает точность, отзыв, значение F1 и т. д. для каждого класса в отчете.
реализация sklearn:
sklearn.metrics.classification_report(y_true, y_pred, labels=None,
target_names=None, sample_weight=None, digits=2)
返回值:一个格式化的字符串,给出了分类评估报告。
参数:
y_true:真实的标记集合。
y_pred:预测的标记集合。
labels:一个列表,指定报告中出现哪些类别。
target_names:一个列表,指定报告中类别对应的显示出来的名字。
digits:用于格式化报告中的浮点数,保留几位小数。
sample_weight:样本权重,默认每个样本的权重为 1
分类评估报告的内容如下,其中:
precision列:给出了查准率。它依次将类别 0 作为正类,类别 1 作为正类...
recall列:给出了查全率。它依次将类别 0 作为正类,类别 1 作为正类...
F1列:给出了F1值。
support列:给出了该类有多少个样本。
avg / total行:
对于precision,recall,f1给出了该列数据的算术平均。
对于support列,给出了该列的算术和(其实就等于样本集总样本数量)。
Использовать сводку
-
Для моделей классификации AUC, кривая ROC (линия, соединяющая точки FPR и TPR) и кривая PR (линия, соединяющая точки точности и полноты) являются показателями всесторонней оценки способности модели различать и сортировать, в то время как точность rate , отзыв и значение F1 — это метрики, вычисляемые после определения порогов.
-
Для одной и той же модели кривые PRC и ROC могут объяснить определенные проблемы, и у них есть определенная корреляция.Если вы хотите оценить эффект модели, вы также можете нарисовать обе кривые для всесторонней оценки.
-
Для контролируемых задач с двумя классификациями, когда имеется достаточное количество положительных и отрицательных образцов, кривая ROC и AUC могут использоваться для непосредственной оценки эффекта модели, а в случае чрезвычайно несбалансированных образцов кривая PR может лучше отражать эффект модели.
-
В процессе определения порога классификационный эффект модели может быть оценен по Precision, Recall или F1. Для задач с множественной классификацией Precision, Recall и F1 можно рассчитать отдельно для каждого класса и всесторонне использовать в качестве индикаторов оценки модели.
регрессионная модель
MAE означает абсолютную ошибку
реализация sklearn:
mean_absolute_error函数用于计算回归预测误差绝对值的均值(mean absolute
error:MAE),其原型为:
sklearn.metrics.mean_absolute_error(y_true, y_pred, sample_weight=None,
multioutput='uniform_average')
返回值:预测误差绝对值的均值。
参数:
y_true:真实的标记集合。
y_pred:预测的标记集合。
multioutput:指定对于多输出变量的回归问题的误差类型。可以为:
'raw_values':对每个输出变量,计算其误差 。
'uniform_average':计算其所有输出变量的误差的平均值。
sample_weight:样本权重,默认每个样本的权重为 1。
Среднеквадратическая ошибка (среднеквадратичная ошибка MSE)
Функция mean_squared_error используется для вычисления среднеквадратичной ошибки прогноза регрессии (mean SquareError: MSE).Ее прототип:
sklearn.metrics.mean_squared_error(y_true, y_pred, sample_weight=None,
multioutput='uniform_average')
返回值:预测误差的平方的平均值。
参数:参考mean_absolute_error 。
Среднеквадратическая ошибка (среднеквадратическая ошибка RMSE)
Нормализованная среднеквадратическая ошибка (нормализованная среднеквадратическая ошибка NRMSE) нормализованная среднеквадратическая ошибка
Коэффициент детерминации (R2)
R2 — отношение суммы квадратов регрессии к общей сумме квадратов множественной регрессии. зависимая переменная у.
Чем ближе R2 к 1, тем больше доля суммы квадратов регрессии в общей сумме квадратов, чем ближе линия регрессии к каждой точке наблюдения, тем больше изменение y объясняется изменением x и тем лучше степень подгонки регрессии.
from sklearn.metrics import r2_score
r2_score(y_true, y_pred, sample_weight=None, multioutput='uniform_average')
Обратитесь к следующим статьям, чтобы обобщить часто используемые индикаторы оценки глубокого обучения:
Терри:zhuanlan.zhihu.com/p/86120987
цикада:zhuanlan.zhihu.com/p/267901426
Долгий путь:
Ууху. Call.com/question/30…
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~