Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
В sklearn предоставляются различные методы оценки модели в сценариях классификации с несколькими метками.В этой статье будут описаны общие индикаторы оценки модели классификации с несколькими метками в sklearn. В классификации с несколькими метками мы можем разделить показатели оценки модели на две категории, а именно: метод оценки модели, который не считает часть выборки правильной, и метод оценки модели, который считает часть выборки правильной.
Во-первых, мы приводим примеры реальных данных и прогнозируемых результатов, на которых основаны все последующие примеры,
import numpy as np
y_true = np.array([[0, 1, 0, 1],
[0, 1, 1, 0],
[1, 0, 1, 1]])
y_pred = np.array([[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 1, 0, 1]])
Частично корректные методы оценки не учитываются
Точное соотношение соответствия
Так называемая абсолютная скорость совпадения означает, что для каждой выборки прогноз верен только в том случае, если прогнозируемое значение точно совпадает с реальным значением, то есть до тех пор, пока есть разница в прогнозируемых результатах одной категории. , предсказание неверно. Следовательно, формула расчета его точности:
в,является индикаторной функцией, когдаточно эквивалентно, значение равно 1, в противном случае значение равно 0.
Чем больше значение, тем выше точность классификации.
from sklearn.metrics import accuracy_score
print(accuracy_score(y_true,y_pred)) # 0.33333333
print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))) # 0.5
0-1 поражение
В дополнение к абсолютной частоте совпадений есть еще один критерий оценки, прямо противоположный процессу расчета, а именно проигрыш 0-1 (Zero-One Loss). Абсолютная точность вычисляет долю выборок, которые полностью предсказаны правильно, к общему количеству выборок, в то время как потеря 0-1 вычисляет долю выборок, которые предсказывают полностью неправильно, к общему количеству выборок.
Его формула:
в,является индикаторной функцией.
from sklearn.metrics import zero_one_loss
print(zero_one_loss(y_true,y_pred)) # 0.66666
Рассмотрим частично правильный метод оценки
Из приведенных выше двух показателей оценки видно, что будь то абсолютная скорость совпадения или потеря 0-1, оба они не учитывают частично правильную ситуацию при расчете результата, который явно неточен для оценки модели. .из. Например, предположим, что правильная метка[1,0,0,1]
, метка, предсказанная моделью,[1,0,1,0]
. Можно видеть, что, хотя модель не предсказала все метки, она все же предсказала некоторые. Поэтому целесообразно учитывать результаты, которые частично предсказаны правильно. Sklearn предоставляет методы расчета для точности, отзыва и значения F1 в сценариях классификации с несколькими метками.
точность
Коэффициент точности фактически рассчитывается как средний показатель точности для всех выборок. Для каждой выборки показатель точности представляет собой отношение количества правильно предсказанных меток к количеству правильных меток, предсказанных всем классификатором.
Его формула:
в,правильные данные метки для истинного значения,Предскажите правильное значение для классификатора.
Например, для образца его истинная метка[0, 1, 0, 1]
, предсказанная метка[0, 1, 1, 0]
. Тогда показатель точности, соответствующий этой выборке, должен быть:
Следовательно, для реальных данных и прогнозируемых результатов, приведенных выше, точность составляет:
Соответствующий код реализован следующим образом:
def Precision(y_true, y_pred):
count = 0
for i in range(y_true.shape[0]):
if sum(y_pred[i]) == 0:
continue
count += sum(np.logical_and(y_true[i], y_pred[i])) / sum(y_pred[i])
return count / y_true.shape[0]
print(Precision(y_true, y_pred)) # 0.6666
Метод реализации в sklearn следующий
from sklearn.metrics import precision_score
print(precision_score(y_true=y_true, y_pred=y_pred, average='samples')) # 0.6666
отзывать
Recall фактически вычисляет среднюю точность всех выборок. Для каждого образца скорость отзыва представляет собой пропорцию предсказанного количества правильных меток к общему количеству правильных меток.
Его формула:
в,правильные данные метки для истинного значения,Предскажите правильное значение для классификатора.
Следовательно, для приведенных выше реальных данных и результатов прогнозирования скорость отзыва составляет:
Соответствующий код реализован следующим образом:
def Recall(y_true, y_pred):
count = 0
for i in range(y_true.shape[0]):
if sum(y_true[i]) == 0:
continue
count += sum(np.logical_and(y_true[i], y_pred[i])) / sum(y_true[i])
return count / y_true.shape[0]
print(Recall(y_true, y_pred)) # 0.6111
Метод реализации в sklearn следующий:
from sklearn.metrics import recall_score
print(recall_score(y_true=y_true, y_pred=y_pred, average='samples'))# 0.6111
Значение F1
Вычисляется также среднее значение всех выборокценность.
Его формула:
когдакогдаценность. Его формула:
Следовательно, для приведенных выше реальных и прогнозируемых результатов егозначение
Соответствующий код реализован следующим образом:
def F1Measure(y_true, y_pred):
count = 0
for i in range(y_true.shape[0]):
if (sum(y_true[i]) == 0) and (sum(y_pred[i]) == 0):
continue
p = sum(np.logical_and(y_true[i], y_pred[i]))
q = sum(y_true[i]) + sum(y_pred[i])
count += (2 * p) / q
return count / y_true.shape[0]
print(F1Measure(y_true, y_pred))# 0.6333
Метод реализации в sklearn следующий:
from sklearn.metrics import f1_score
print(f1_score(y_true,y_pred,average='samples')) # 0.6333
Среди приведенных выше четырех показателей, чем больше значение, тем лучше классификационный эффект соответствующей модели. В то же время из приведенной выше формулы видно, что хотя шаги расчета показателей в многозначном сценарии отличаются от таковых в однозначном сценарии, идеи, которых они придерживаются при расчете показателей, схожи.
Hamming Score
Показатель Хэмминга — это еще один метод получения точности в сценариях классификации с несколькими метками. Показатель Хэмминга фактически вычисляет среднюю точность всех выборок. Для каждой выборки показатель точности представляет собой долю предсказанных правильных меток в общем числе предсказанных правильных и истинно правильных меток.
Его формула:
Например, для образца его истинная метка[0, 1, 0, 1]
, предсказанная метка[0, 1, 1, 0]
. Тогда соответствующая точность этой выборки должна быть:
Следовательно, для приведенных выше реальных данных и прогнозируемых результатов его показатель Хэмминга равен:
Соответствующий код реализован следующим образом:
import numpy as np
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
http://stackoverflow.com/q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set(np.where(y_true[i])[0] )
set_pred = set(np.where(y_pred[i])[0] )
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/float(len(set_true.union(set_pred)) )
acc_list.append(tmp_a)
return np.mean(acc_list)
y_true = np.array([[0, 1, 0, 1],
[0, 1, 1, 0],
[1, 0, 1, 1]])
y_pred = np.array([[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 1, 0, 1]])
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.5277
Потери Хэмминга (расстояние Хэмминга, потери Хэмминга)
Потери Хэмминга измеряют долю неправильно предсказанных меток в общем количестве меток во всех выборках. Следовательно, чем меньше значение потери Хэмминга, тем лучше производительность модели. Значение находится в диапазоне от 0 до 1. Расстояние 0 означает, что прогнозируемый результат точно совпадает с реальным результатом, а расстояние 1 означает, что модель полностью противоречит желаемому результату.
Его формула:
где m - количество выборок,Указывает количество этикеток.
Следовательно, для приведенных выше реальных и прогнозируемых результатов значение потерь по Хэммингу равно
Соответствующий код реализован следующим образом:
def Hamming_Loss(y_true, y_pred):
count = 0
for i in range(y_true.shape[0]):
# 单个样本的标签数
p = np.size(y_true[i] == y_pred[i])
# np.count_nonzero用于统计数组中非零元素的个数
# 单个样本中预测正确的样本数
q = np.count_nonzero(y_true[i] == y_pred[i])
print(f"{p}-->{q}")
count += p - q
print(f"样本数:{y_true.shape[0]}, 标签数:{y_true.shape[1]}") # 样本数:3, 标签数:4
return count / (y_true.shape[0] * y_true.shape[1])
print(Hamming_Loss(y_true, y_pred)) # 0.4166
Метод реализации в sklearn следующий:
from sklearn.metrics import hamming_loss
print(hamming_loss(y_true, y_pred))# 0.4166
print(hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))) # 0.75
Суммировать
В дополнение к методам оценки модели с несколькими метками, представленным выше, в sklean также предоставляются другие методы оценки модели, такие как Матрица путаницы (multilabel_confusion_matrix), коэффициент сходства Жаккарда (jaccrd_similarity_score) и т. д. здесь не представлены.