Menu
CoddyTech

Curvas ROC

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 25 de 58.

Cada limiar produz sua própria revocação e seus próprios falsos alarmes. A curva ROC mostra todos eles de uma só vez:

Uma curva azul em degraus que sobe do canto inferior esquerdo ao canto superior direito, bem acima de uma diagonal tracejada cinza de cara ou coroa. Pontos laranja marcam os limiares 0.8, 0.5 e 0.2, movendo-se para cima e para a direita. A área abaixo dela está sombreada: AUC = 0.914

Na horizontal: a taxa de falsos positivos, a proporção de pacientes saudáveis sinalizados. Na vertical: a revocação. Limiares mais baixos avançam em direção a (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 é a revocação
ax.plot(fpr, tpr)
print(f"{roc_auc_score(y_test, proba):.3f}")

Isso imprime 0.914, a AUC: a área sob a curva. 1 é perfeito, 0.5 é como jogar uma moeda. Uma curva mais alta detecta mais casos para a mesma quantidade de falsos alarmes.

challenge icon

Desafio

Médio

Uma fazenda de cerejas acende fogueiras para evitar geadas nas noites em que pode congelar. O código inicial treina dois modelos de geada, logistic e knn, e configura o gráfico.

  1. Escreva draw_roc(model, name): ela desenha a curva ROC do modelo em ax, identificada por name, e imprime sua AUC, como abaixo.
  2. Chame-a para ambos os modelos, adicione uma diagonal tracejada identificada por coin toss e uma legenda e, em seguida, exiba o gráfico.

Para os modelos de deslizamento de terra:

logistic AUC: 0.869
k-NN AUC: 0.924

Então, o Coddy descreve seu gráfico. O gráfico dele é assim:

Curvas ROC intituladas Alertas de deslizamento de terra: uma curva logística azul em degraus e uma curva k-NN laranja com poucos cantos, ambas bem acima de uma diagonal tracejada verde de cara ou coroa, com uma legenda

Experimente você mesmo

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

# Uma linha para cada noite de primavera em uma fazenda de cerejas: 1 em frost significa que houve geada antes do amanhecer
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)

# Dois modelos de previsão de geada
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")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online