Метрики качества.
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)