ROC-кривые
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 25 из 58.
Для каждого порога есть свои полнота и количество ложных срабатываний. ROC-кривая показывает их все сразу:
По горизонтали: доля ложноположительных результатов — доля здоровых пациентов, отмеченных как больные. По вертикали: полнота. При снижении порогов кривая поднимается к точке (1, 1).
from sklearn.metrics import roc_curve, roc_auc_score
proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, proba) # tpr — это полнота
ax.plot(fpr, tpr)
print(f"{roc_auc_score(y_test, proba):.3f}")Это выводит 0.914 — AUC: площадь под кривой. 1 — идеальный результат, 0.5 — подбрасывание монеты. Более высокая кривая позволяет выявить больше случаев при том же количестве ложных срабатываний.
Задание
СреднеНа вишнёвой ферме зажигают костры для защиты от заморозков в ночи, когда температура может опуститься ниже нуля. В стартовом коде обучаются две модели для прогнозирования заморозков, logistic и knn, и настраивается график.
- Напиши
draw_roc(model, name): функция рисует ROC-кривую модели наax, помечает её какnameи выводит её AUC, как показано ниже. - Вызови её для обеих моделей, добавь пунктирную диагональ с меткой
coin tossи легенду, а затем покажи график.
Для моделей прогнозирования оползней:
logistic AUC: 0.869
k-NN AUC: 0.924Затем Coddy описывает твой график. Вот как выглядит график Coddy:
Попробуйте сами
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, roc_auc_score
# Одна строка на каждую весеннюю ночь в черешневом саду: 1 в frost означает, что заморозки наступили до рассвета
nights = pd.read_csv("frost.csv")
features = ["temp_6pm_c", "humidity_pct", "wind_kmh", "cloud_pct"]
X_train, X_test, y_train, y_test = train_test_split(
nights[features], nights["frost"], test_size=0.25, random_state=0, stratify=nights["frost"])
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Две модели прогнозирования заморозков
logistic = LogisticRegression(max_iter=1000)
logistic.fit(X_train, y_train)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
fig, ax = plt.subplots()
ax.set_title("Frost Warnings")
ax.set_xlabel("False positive rate")
ax.set_ylabel("Recall")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python