Menu
CoddyTech

ROC-кривые

Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 25 из 58.

Для каждого порога есть свои полнота и количество ложных срабатываний. ROC-кривая показывает их все сразу:

Синяя ступенчатая кривая поднимается из нижнего левого угла в верхний правый, значительно выше пунктирной серой диагонали подбрасывания монеты. Оранжевые точки отмечают пороги 0.8, 0.5 и 0.2, перемещаясь вверх и вправо. Площадь под кривой закрашена: AUC = 0.914

По горизонтали: доля ложноположительных результатов — доля здоровых пациентов, отмеченных как больные. По вертикали: полнота. При снижении порогов кривая поднимается к точке (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 — подбрасывание монеты. Более высокая кривая позволяет выявить больше случаев при том же количестве ложных срабатываний.

challenge icon

Задание

Средне

На вишнёвой ферме зажигают костры для защиты от заморозков в ночи, когда температура может опуститься ниже нуля. В стартовом коде обучаются две модели для прогнозирования заморозков, logistic и knn, и настраивается график.

  1. Напиши draw_roc(model, name): функция рисует ROC-кривую модели на ax, помечает её как name и выводит её AUC, как показано ниже.
  2. Вызови её для обеих моделей, добавь пунктирную диагональ с меткой coin toss и легенду, а затем покажи график.

Для моделей прогнозирования оползней:

logistic AUC: 0.869
k-NN AUC: 0.924

Затем Coddy описывает твой график. Вот как выглядит график Coddy:

ROC-кривые с заголовком «Предупреждения об оползнях»: ступенчатая синяя кривая logistic и оранжевая кривая k-NN с небольшим количеством углов, обе расположены значительно выше пунктирной зелёной диагонали coin toss; есть легенда

Попробуйте сами

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")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение с учителем

Потренируйтесь самостоятельно: Онлайн-компилятор Python