<jupyter_start><jupyter_text>Метрики: LogLoss<jupyter_code>%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (12,8)

from ipywidgets import interact, IntSlider, FloatSlider<jupyter_output><empty_output><jupyter_text>Метрики классификации* Как правило, классификаторы выдают не просто предсказанную метку класса, но и степень уверенности в ней* Основные меры качества    * Accuracy    * Precision, Recall, F-мера    * ROC-AUC    * **Log-loss**  Precision / Recall* Вычисляются на бинарных предсказания   ROC кривая* Выбор порога классификации - отдельная большая задача* Можно ли как-то обойтись без него и сравнить неколько моделей?* ROC кривая - показывает зависимость между TPR (верным предсказанием) и FPR (ложным срабатыванием)  LogLoss Метрика бинарной классификации, требует от классификатора вероятностей.* Классификатор $a(x)$ возвращает степень принадлежности к классу "+1" - prob(x).* prob(x) удовлетворяет ограничениям вероятности: 0 <= prob(x) <= 1Будем учитывать степень увернности классификатора и сильнее штрафовать за уверенный неправильный ответ<jupyter_code>def log_loss(y_true, y_pred, eps = 1e-5):
    y_clipped = np.clip(y_pred, eps, 1-eps)
    return - (y_true * np.log(y_clipped) + (1-y_true)*np.log(1 - y_clipped))
y_preds = np.linspace(0, 1, 100)
y_true = np.ones_like(y_preds)

loss = log_loss(y_true, y_preds)
plt.plot(y_preds, loss)
plt.xlabel("predicted probability")
plt.ylabel("loss value")
plt.title("log loss")<jupyter_output><empty_output><jupyter_text>Свойства* Для задач бинарной классификации* Оперирует веротяностями принадлежности к классу* Зависит от абсолютных значений (в отличие от ROC-AUC)* Сильно штрафует уверенные неправильные предсказания  Примеры<jupyter_code># python: а что произойдет тут с нашей функцией log_loss?
from sklearn.metrics import log_loss

y_true = np.random.uniform(low=0.0, high=1.0, size=10000) > 0.5
y_random = np.random.uniform(low=0.0, high=1.0, size=10000)
y_true
y_random
log_loss(y_true, y_random)
for alpha in np.linspace(0, 1, 20):
    y_mix = y_true * alpha + y_random * (1-alpha)
    ll = log_loss(y_true, y_mix)
    print("alpha: {:.2f}, logloss: {:.4f}".format(alpha, ll))
# Лик: определение баланса классов
# Лик: определение меток через точность<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10360934182590234, 'fraction_numerical': 0.018259023354564755, 'mean_word_length': 5.868804664723032, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 14, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '457170', 'license': 'MIT', 'n_tokens_mistral': 996, 'n_tokens_neox': 1094, 'n_words': 227, 'path': '1_term/made_2019_ml/seminars/week04_metrics/log_loss.ipynb', 'repo_name': 'Ilyabasharov/made_mail.ru', 'size': '2355'}