Общие метрики оценки модели в сценариях классификации с несколькими метками в sklearn

искусственный интеллект
Общие метрики оценки модели в сценариях классификации с несколькими метками в sklearn

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность

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

Частично корректные методы оценки не учитываются

Точное соотношение соответствия

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

accuracy(y,y^)=1nsamplesi=0nsamples1I(y^i=yi)\texttt{accuracy}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples}-1} I(\hat{y}_i = y_i)

в,I(x)I(x)является индикаторной функцией, когдаy^i\hat{y}_iточно эквивалентноyiy_i, значение равно 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 вычисляет долю выборок, которые предсказывают полностью неправильно, к общему количеству выборок.

Его формула:

L01(yi,y^i)=1mi=0m1I(y^iyi)L_{0-1}(y_i, \hat{y}_i) = \frac{1}{m} \sum_{i=0}^{m-1} I(\hat{y}_i \not= y_i)

в,I(x)I(x)является индикаторной функцией.

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 в сценариях классификации с несколькими метками.

точность

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

Его формула:

P(ys,y^s)=ysy^sy^sP(y_s, \hat{y}_s) = \frac{\left| y_s \cap {\hat{y}_s} \right|}{\left| {\hat{y}_s} \right|}
Precision=1SsеSP(ys,y^s)Precision = \frac{1}{\left|S\right|} \sum_{s \in S} P(y_s, \hat{y}_s)

в,ysy_sправильные данные метки для истинного значения,y^s\hat{y}_sПредскажите правильное значение для классификатора.

Например, для образца его истинная метка[0, 1, 0, 1], предсказанная метка[0, 1, 1, 0]. Тогда показатель точности, соответствующий этой выборке, должен быть:

precision=11+1=12precision = \frac{1}{1+1}=\frac{1}{2}

Следовательно, для реальных данных и прогнозируемых результатов, приведенных выше, точность составляет:

Precision=13*(12+22+12)0.666Precision = \frac{1}{3}*(\frac{1}{2}+\frac{2}{2}+\frac{1}{2}) \approx 0.666

Соответствующий код реализован следующим образом:

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 фактически вычисляет среднюю точность всех выборок. Для каждого образца скорость отзыва представляет собой пропорцию предсказанного количества правильных меток к общему количеству правильных меток.

Его формула:

R(ys,y^s)=ysy^sysR(y_s, \hat{y}_s) = \frac{\left| y_s \cap \hat{y}_s \right|}{\left| y_s \right|}
Recall=1SsеSR(ys,y^s)Recall = \frac{1}{\left|S\right|} \sum_{s \in S} R(y_s, \hat{y}_s)

в,ysy_sправильные данные метки для истинного значения,y^s\hat{y}_sПредскажите правильное значение для классификатора.

Следовательно, для приведенных выше реальных данных и результатов прогнозирования скорость отзыва составляет:

Recall=13*(12+22+13)0.611Recall = \frac{1}{3}*(\frac{1}{2}+\frac{2}{2}+\frac{1}{3}) \approx 0.611

Соответствующий код реализован следующим образом:

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

F1F_1Вычисляется также среднее значение всех выборокF1F_1ценность.

Его формула:

Fβ(ys,y^s)=(1+β2)P(ys,y^s)×R(ys,y^s)β2P(ys,y^s)+R(ys,y^s)F_\beta(y_s, \hat{y}_s) = \left(1 + \beta^2\right) \frac{P(y_s, \hat{y}_s) \times R(y_s, \hat{y}_s)}{\beta^2 P(y_s, \hat{y}_s) + R(y_s, \hat{y}_s)}
Fβ=1SsеSFβ(ys,y^s)F_\beta = \frac{1}{\left|S\right|} \sum_{s \in S} F_\beta(y_s, \hat{y}_s)

когдаβ=1\beta=1когдаF1F_1ценность. Его формула:

Fβ(ys,y^s)=1SsеS2*P(ys,y^s)×R(ys,y^s)P(ys,y^s)+R(ys,y^s)=1SsеS2*ysy^sy^s+ysF_\beta(y_s, \hat{y}_s) = \frac{1}{\left|S\right|} \sum_{s \in S} \frac{2 * P(y_s, \hat{y}_s) \times R(y_s, \hat{y}_s)}{ P(y_s, \hat{y}_s) + R(y_s, \hat{y}_s)}=\frac{1}{\left|S\right|} \sum_{s \in S} \frac{2* \left| y_s \cap \hat{y}_s \right|}{\left| \hat{y}_s \right| + \left| y_s \right|}

Следовательно, для приведенных выше реальных и прогнозируемых результатов егоF1F_1значение

F1=23*(14+12+15)0.633F_1 = \frac{2}{3} * (\frac{1}{4}+\frac{1}{2}+\frac{1}{5}) \approx 0.633

Соответствующий код реализован следующим образом:

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

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

Его формула:

Accuracy=1mi=1myiy^iyiy^i\text{Accuracy} = \frac{1}{m} \sum_{i=1}^{m} \frac{\left| y_i \cap \hat{y}_i \right|}{\left| y_i \cup \hat{y}_i \right|}

Например, для образца его истинная метка[0, 1, 0, 1], предсказанная метка[0, 1, 1, 0]. Тогда соответствующая точность этой выборки должна быть:

accuracy=11+1+1=13\text{accuracy} = \frac{1}{1+1+1} = \frac{1}{3}

Следовательно, для приведенных выше реальных данных и прогнозируемых результатов его показатель Хэмминга равен:

Accuracy=13*(13+22+14)0.5278\text{Accuracy} = \frac{1}{3}*(\frac{1}{3}+\frac{2}{2}+\frac{1}{4}) \approx 0.5278

Соответствующий код реализован следующим образом:

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 означает, что модель полностью противоречит желаемому результату.

Его формула:

LHamming(y,y^)=1m*nlabelsi=0m1j=0nlabels1I(y^j(i)yj(i))L_{Hamming}(y, \hat{y}) = \frac{1}{m*n_\text{labels}} \sum_{i=0}^{m - 1}\sum_{j=0}^{n_\text{labels} - 1} I(\hat{y}_j^{(i)} \not= y_j^{(i)})

где m - количество выборок,nlablen_\text{lable}Указывает количество этикеток.

Следовательно, для приведенных выше реальных и прогнозируемых результатов значение потерь по Хэммингу равно

Hamming Loss=13*4*(2+0+3)0.4166\text{Hamming Loss} = \frac{1}{3*4}*(2+0+3) \approx 0.4166

Соответствующий код реализован следующим образом:

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) и т. д. здесь не представлены.

Справочная документация