Метрики качества. Метрики классификации. Подсчет количества ошибок, доли правильных ответов, точности, полноты.

Метрики качества.

I. Доля правильных ответов (accuracy)

II. Точность (precision)

III. Полнота (recall)

IV.  F-мера (агрегирующая метрика)

 

I. Доля правильных ответов (accuracy)

Не подходит, если есть дисбаланс классов, т.е. если соотношение классов далеко от 1:1.

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

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

import pandas as pd
from sklearn.tree import DecisionTreeClassifier

df = pd.read_csv('/df_folder/model_train_data.csv')

features = df.drop(['target_col'], axis=1)
target = df['target_col']

model = DecisionTreeClassifier(random_state=5678)

model.fit(features, target)

control_df = pd.read_csv('/df_folder/control_data.csv')

control_features = control_df.drop(['target_col'], axis=1)
control_target = control_df['target_col']
control_predictions = model.predict(control_features)

Функция подсчета количества ошибок.

Функция принимает на вход правильные ответы и предсказания модели.

def count_errors(answers, predictions):
    # cоздаем переменную-счётчик 
    count = 0

    # cоздаем цикл по длине ответов, и, если ответ не совпадает с предсказанием, то прибавляем к счетчику 1

    for i in range(len(answers)):
        if answers[i] != predictions[i]:
            count+=1

    # функция возвращает количество расхождений между контрольными ответами и предсказаниями

    return count

print("Ошибок в предикции:", count_errors(control_target, control_predictions))

Функция целиком без комментариев:

def count_errors(answers, predictions)

----count = 0

----for i in range(len(answers)):
--------if answers[i] != predictions[i]:

------------count+=1

----return count

Собственно метрики качества.

Функция для подсчета доли правильных ответов.

def accuracy_correct_part(answers, predictions):
    correct_answers = 0
    for i in range(len(answers)):
        if answers[i] == predictions[i]:
            correct_answers += 1
    return correct_answers / len(answers) 

print("Доля правильных ответов:", accuracy_correct_part(control_target, control_predictions))

 

II. Точность (precision), доля правильных ответов,  доля экземпляров, отмеченных моделью как положительные, действительно являщаяся такой, отношение tp / (tp + fp).

Точность показывает, не присваивает ли модель лишние положительные метки.

tp / (tp + fp)

from sklearn.metrics import precision_score

precision_score(y_true, y_pred, average=None)

или

precision_score(target_validation, predicted_validation)

 

III. Полнота (recall) показывает, какую часть ответов с определенной характристикой выбрала модель, какую долю положительных среди всех ответов выбрала модель. Полнота -  отношение tp / (tp + fn), т.е. доля TP-ответов среди TP + FN (т.е. среди всех, у которых верна метка "1").

Полнота показывает, как хорошо модель распознает класс. 

При малых значениях полноты настройки модели нужно корректировать. 

Другая крайность: если модель всегда будет отвечать «1», то полнота будет максимлаьной, равной 1.

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

Полнота (recall)

tp / (tp + fn)

from sklearn.metrics import recall_score

recall_score(target_validation, predicted_validation)

 

Агрегирующие метрики.

IV.  F-мерагармоническое среднее между точностью и полнотой.

F=(β2+1)Precision×Recall / β2Precision+Recall

β  от 0 до 1, если нужно отдать приоритет точности, 
β>1, если нужно отдать приоритет полноте. 

При β=1 

f1 = 2 * precision * recall / (precision + recall) 

Функция sklearn:

from sklearn.metrics import f1_score

f1_score(y_true, y_pred, average=None)

 

V. Precision Recall кривая.

Если вероятность "1" выше заданного порога (по умолчанию 0.5, но его можно менять), то объект положительный, в противном случае - отрицательный.

При каждом из заданных значений порога полнота и точность будут отличаться.

На Precision Recall кривой (PR-кривой) по оси y - значение точности, по оси x, т.е. по горизонтали — значение полноты при выбранном пороге.

Чем выше кривая, тем лучше модель.

from sklearn.metrics import precision_recall_curve

...

precision, recall, thresholds = precision_recall_curve(target_validation, probabilities_validation[:, 1])
plt.figure()
plt.step(recall, precision, where='post')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show() 

V. Доля истинно положительных ответов TPR (True Positive Rate):

TPR = TP / P

 

VI. Доля ложноположительных ответов FPR (False Positive Rate)

FPR = FP / N

При уменьшении порога в логистической регрессии TPR и FPR увеличатся.

 

VII. Площадь под ROC-кривой AUC-ROC (Area Under Curve ROC), в случайной моделе равна 0.5.

ROC-кривая ошибок (receiver operating characteristic, термин из теории обработки сигналов)
По горизонтали - доля FPR, по вертикали — доля TPR.

Чем выше график, тем лучше качество модели.

1)roc_curve 
на вход принимает значения целевого признака и вероятности положительного класса
from sklearn.metrics import roc_curve 
fpr, tpr, thresholds = roc_curve(target, probabilities) 

2)roc_auc_score

на вход принимает вероятности положительного класса

from sklearn.metrics import roc_auc_score #(оценка AUC-ROC)

roc_auc_score(target_valid, probabilities_positive_class_one_valid)

 

Команды:

Тип команды, объекта: