Classes Desbalanceadas
Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 24 de 58.
Quando 95 de 100 pacientes estão saudáveis, um modelo que sempre diz “saudável” alcança 95% de acurácia e não identifica ninguém. Em classes desbalanceadas, a acurácia pode ser enganosa:
Duas correções. stratify=y mantém a proporção de 95 para 5 em ambos os conjuntos, então o conjunto de teste tem pacientes doentes para detectar. class_weight="balanced" faz cada linha rara contar mais:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")O modelo balanceado troca um pouco de precisão por muitos mais casos detectados. Em casos raros, observe a revocação e a precisão, não a acurácia.
Desafio
MédioCerca de 5% dos rolamentos de uma fábrica falham precocemente. O código inicial divide os registros de uma bancada de testes e avalia um modelo simples, mas seu conjunto de teste contém apenas 2 rolamentos defeituosos, então seu 0.993 significa pouco.
- Corrija a divisão para que ambos os conjuntos mantenham a mesma proporção de rolamentos defeituosos.
- Treine um segundo modelo que atribua mais peso às linhas defeituosas e imprima sua linha como abaixo.
Para outra bancada:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833Experimente você mesmo
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score
# Uma linha por rolamento da bancada de testes: 1 em faulty significa que ele apresentou falha logo depois
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# Corrija esta divisão
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")
# Escreva seu código abaixo
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
1Seu primeiro modelo
Aprendendo com exemplosConjuntos de treino e testeAjustar e preverAvaliar um modeloRecapitulação: classificador de sementes4Regressão logística
Previsões de sim ou nãoO limiar de decisãoPesos como evidênciasVárias classesRevisão: filtro de spam2Vizinhos Mais Próximos
Como o k-NN DecideEscolhendo kLimites de DecisãoEscalonamento para VizinhosRevisão: Vizinhos do Vinho5Avaliando Classificadores
A Matriz de ConfusãoPrecisão e RevocaçãoA Pontuação F1Classes DesbalanceadasCurvas ROCRecapitulação: Teste de Triagem8Validação Cruzada
Validação K-FoldComparando Modelos de Forma JustaBusca em GradeRevisão: Consertos de Skate11Projeto: Espécies de Pinguins
Conheça os PinguinsPrepare os DadosEscolha um ModeloAjuste o VencedorColoque o Modelo em Produção3Regressão Linear
Prevendo númerosVárias característicasMedindo errosGráficos de resíduosRevisão: aluguel de bicicletas6Árvores de Decisão
Árvores fazem perguntasLendo uma árvoreProfundidade da árvoreImportância das característicasRevisão: decisões de empréstimoPratique por conta própria: Compilador de Python online