Introdução
Neste laboratório, utilizaremos o scikit-learn para demonstrar como calcular as razões de verossimilhança positiva e negativa (LR+, LR-) para avaliar o poder preditivo de um classificador binário. Estas métricas são independentes da proporção entre as classes no conjunto de teste, o que as torna muito úteis quando os dados disponíveis para um estudo têm uma proporção de classes diferente da aplicação alvo. Iremos percorrer os seguintes passos:
Dicas da Máquina Virtual
Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.
Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.
Preparando os Dados
Vamos gerar um conjunto de dados sintético utilizando a função make_classification do scikit-learn. Este conjunto de dados simulará uma população com uma minoria de indivíduos com uma doença.
Análise Pré-teste vs. Pós-teste
Ajustaremos um modelo de regressão logística aos dados e avaliaremos seu desempenho em um conjunto de teste separado. Calcularemos a razão de verossimilhança positiva para avaliar a utilidade deste classificador como ferramenta de diagnóstico de doenças.
Validação Cruzada das Razões de Verossimilhança
Avaliaremos a variabilidade das medidas das razões de verossimilhança das classes em alguns casos específicos usando validação cruzada.
Invariância em Relação à Prevalência
Vamos mostrar que as razões de verossimilhança das classes são independentes da prevalência da doença e podem ser extrapoladas entre populações, independentemente de qualquer possível desequilíbrio de classes.
Preparando os Dados
Vamos gerar um conjunto de dados sintético usando a função make_classification do scikit-learn. Este conjunto de dados simulará uma população com uma minoria de indivíduos portadores de uma doença.
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=10_000, weights=[0.9, 0.1], random_state=0)
print(f"Porcentagem de pessoas portadoras da doença: {100*y.mean():.2f}%")
Análise Pré-teste vs. Pós-teste
Ajustaremos um modelo de regressão logística aos dados e avaliaremos seu desempenho em um conjunto de teste separado. Calcularemos a razão de verossimilhança positiva para avaliar a utilidade deste classificador como ferramenta de diagnóstico de doenças.
from sklearn.model_selection import train_test_split
from sklearn.metrics import class_likelihood_ratios
from sklearn.linear_model import LogisticRegression
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
estimator = LogisticRegression().fit(X_train, y_train)
y_pred = estimator.predict(X_test)
pos_LR, neg_LR = class_likelihood_ratios(y_test, y_pred)
print(f"LR+: {pos_LR:.3f}")
Validação Cruzada das Razões de Verossimilhança
Avaliaremos a variabilidade das medidas das razões de verossimilhança das classes em alguns casos específicos usando validação cruzada.
import pandas as pd
from sklearn.model_selection import cross_validate
from sklearn.dummy import DummyClassifier
def scoring(estimator, X, y):
y_pred = estimator.predict(X)
pos_lr, neg_lr = class_likelihood_ratios(y, y_pred, raise_warning=False)
return {"positive_likelihood_ratio": pos_lr, "negative_likelihood_ratio": neg_lr}
def extract_score(cv_results):
lr = pd.DataFrame(
{
"positive": cv_results["test_positive_likelihood_ratio"],
"negative": cv_results["test_negative_likelihood_ratio"],
}
)
return lr.aggregate(["mean", "std"])
estimator = LogisticRegression()
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))
estimator = DummyClassifier(strategy="stratified", random_state=1234)
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))
estimator = DummyClassifier(strategy="most_frequent")
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))
Invariância em Relação à Prevalência
Vamos mostrar que as razões de verossimilhança das classes são independentes da prevalência da doença e podem ser extrapoladas entre populações, independentemente de qualquer possível desequilíbrio de classes.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
from collections import defaultdict
## ... (restante do código Python)
Resumo
Neste laboratório, aprendemos a calcular as razões de verossimilhança positiva e negativa para avaliar o poder preditivo de um classificador binário. Essas métricas são independentes da proporção entre as classes no conjunto de teste, tornando-as muito úteis quando os dados disponíveis para um estudo têm uma proporção de classes diferente da aplicação alvo. Também aprendemos a avaliar a variabilidade das medidas das razões de verossimilhança das classes em alguns casos específicos usando validação cruzada e como demonstrar que as razões de verossimilhança das classes são independentes da prevalência da doença.