ML/estatística essencial
Você treinará um classificador, comparará com uma baseline e explicará os erros com matriz de confusão. O exercício começa com dados sintéticos para controlar split e leakage, depois exige uma proposta de features para chamados reais. O objetivo é demonstrar validação correta e leitura das métricas, sem alegar utilidade comercial a partir de dados artificiais.
Use Python 3 em ambiente virtual e instale numpy e scikit-learn. Registre versões e a semente. Não é necessário baixar dados nem usar serviço externo. Antes de executar, calcule à mão precision, recall e F1 para TP=8, FP=2 e FN=12; compare com a resolução somente depois. Esse passo impede tratar a biblioteca como uma caixa que decide o significado do resultado.
PythonIA & MLAvaliaçãoMatemáticaAo terminar esta aula
- Validação correta vem antes do score.
- Métricas devem refletir classe positiva e custos de erro.
- Modelos simples são baselines, não escolhas inferiores por definição.
Antes de continuar: Leitura: ML/estatística essencial
Definir alvo, features e momento de previsão
FundamentosEscreva a definição de urgente e o instante em que a previsão seria usada. Liste cinco features possíveis e rejeite qualquer uma conhecida somente após resolução, como SLA violado no fim do atendimento. Identifique registros repetidos por cliente e dependência temporal. Para o dataset sintético, registre que os oito números não representam features de negócio. Declare a classe positiva e o custo qualitativo de falso negativo e falso positivo. O relatório precisa ter essa definição antes das métricas, porque recall de uma classe invertida pode contar uma história diferente.
Executar o Pipeline e revisar as divisões
FundamentosRode classifier.py e conserve shapes, proporções e matriz de confusão. Confira que X_test tem 150 exemplos e não entra em cross_val_score. Inspecione o Pipeline para garantir que StandardScaler é ajustado dentro de cada fold. Em uma cópia de demonstração, padronize tudo antes do split e explique por que o protocolo fica inválido, mesmo se o score mudar pouco. Não apresente a diferença desse único experimento como tamanho universal de leakage. O erro conceitual é usar informação que não estaria disponível na previsão futura.
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split,StratifiedKFold,cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
from sklearn.metrics import confusion_matrix,classification_report,roc_auc_score
X,y=make_classification(n_samples=600,n_features=8,n_informative=5,
n_redundant=0,weights=[0.85,0.15],random_state=42)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,
stratify=y,random_state=42)
model=make_pipeline(StandardScaler(),LogisticRegression(max_iter=1000))
cv=StratifiedKFold(n_splits=5,shuffle=True,random_state=42)
scores=cross_val_score(model,X_train,y_train,cv=cv,scoring='f1')
print('CV F1 mean/std:',scores.mean(),scores.std())
for name,estimator in [('baseline',DummyClassifier(strategy='most_frequent')),('logistic',model)]:
estimator.fit(X_train,y_train)
pred=estimator.predict(X_test)
print(name,confusion_matrix(y_test,pred,labels=[0,1]))
print(classification_report(y_test,pred,zero_division=0))
model.fit(X_train,y_train)
prob=model.predict_proba(X_test)[:,1]
assert len(prob)==len(y_test) and np.all((prob>=0)&(prob<=1))
print('Test ROC AUC:',roc_auc_score(y_test,prob))Interpretar baseline, precision e recall
FundamentosConfronte a baseline sempre negativa com o classificador. Calcule as métricas da matriz, identificando TP, FP, FN e TN pela ordem labels=[0,1]. Para os cem chamados do enunciado, confirme precision 0,8, recall 0,4 e F1 aproximadamente 0,533. Explique por que acurácia 0,86 não implica que a maioria dos urgentes foi encontrada. Faça um caso com zero alertas e registre a convenção zero_division=0, distinguindo ausência de alertas de precisão perfeita. Essa leitura deve aparecer em palavras no relatório, não apenas em uma tabela automática.
↗ Metrics and scoring: quantifying the quality of predictions
Escolher limiar e comparar alternativas corretamente
FundamentosDivida o treino em subtreino e validação para escolher limiar, ou use um protocolo de validação que preserve o teste. Compare 0,3 e 0,5 e observe a troca entre falsos alertas e omissões. Não ajuste limiar olhando y_test. Experimente uma árvore com profundidade limitada e uma Random Forest usando o mesmo protocolo; XGBoost é extensão opcional com dependência e objetivo registrados. Execute K-Means somente como exploração, escalando features e sem chamar os clusters de previsões urgentes. Compare estabilidade e utilidade, não apenas uma métrica de algoritmo isolada.
↗ Metrics and scoring: quantifying the quality of predictions↗ Decision Trees↗ Ensembles: gradient boosting, random forests, bagging, voting, stacking
Entregar uma conclusão com limites e próximos dados
FundamentosApresente semente, versões, split, baseline, métricas por classe e distribuição entre folds. Inclua uma análise de três erros, explicando o que o experimento permite concluir e o que exigiria dados reais. Proponha avaliação por tempo e grupo se o uso futuro envolver novos clientes ou datas. Diferencie correlação, score e probabilidade calibrada. A entrega deve justificar por que o modelo escolhido merece investigação e quais resultados bloqueariam publicação, como recall insuficiente em casos críticos. Evite afirmar superioridade geral de um algoritmo a partir deste pequeno conjunto sintético.
Exercício aplicado
Um classificador mostra 86% de acurácia em cem chamados, com TP=8, FP=2, FN=12 e TN=78. O gestor quer publicá-lo porque supera a baseline de 80%.
- Calcule precision, recall e F1 para urgente.
- Compare os falsos negativos com o objetivo do produto.
- Verifique split, leakage e escolha de limiar.
- Proponha critério e validação antes da publicação.
Abrir resolução comentada
Precision é 8/10=0,8; recall é 8/20=0,4; F1 é 2×0,8×0,4/1,2≈0,533. Acurácia é 86/100, mas doze urgentes foram perdidos. A melhora global não demonstra que o requisito de triagem foi atendido.
Se omitir urgentes é caro, avalie outro limiar na validação, com capacidade de revisão dos falsos alertas. Preserve o teste final e investigue disponibilidade das features. A decisão depende do risco e do regime de dados, não só de superar a baseline.
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split,StratifiedKFold,cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
from sklearn.metrics import confusion_matrix,classification_report,roc_auc_score
X,y=make_classification(n_samples=600,n_features=8,n_informative=5,
n_redundant=0,weights=[0.85,0.15],random_state=42)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,
stratify=y,random_state=42)
model=make_pipeline(StandardScaler(),LogisticRegression(max_iter=1000))
cv=StratifiedKFold(n_splits=5,shuffle=True,random_state=42)
scores=cross_val_score(model,X_train,y_train,cv=cv,scoring='f1')
print('CV F1 mean/std:',scores.mean(),scores.std())
for name,estimator in [('baseline',DummyClassifier(strategy='most_frequent')),('logistic',model)]:
estimator.fit(X_train,y_train)
pred=estimator.predict(X_test)
print(name,confusion_matrix(y_test,pred,labels=[0,1]))
print(classification_report(y_test,pred,zero_division=0))
model.fit(X_train,y_train)
prob=model.predict_proba(X_test)[:,1]
assert len(prob)==len(y_test) and np.all((prob>=0)&(prob<=1))
print('Test ROC AUC:',roc_auc_score(y_test,prob))Como conferir seu resultado
- Teste permanece separado de transformações e escolhas.
- Matriz de confusão tem classe positiva explícita.
- Baseline e recall da classe rara são interpretados.
- Features só usam dados disponíveis na previsão.
Aplique em um problema novo
Primeiro resolva sem consultar a resposta. Explique suas decisões e guarde a evidência. A conclusão de leitura é independente desta autoavaliação.
Confira seus pré-requisitos
- Calcular matriz de confusão e proporções.
- Separar treino/validação/teste e leakage.
Uma feature 'resolução final' é usada ao prever urgência; split random mistura chamados do mesmo cliente. Corrija avaliação.
Conferir raciocínio e critérios de domínio
A feature resolução final é indisponível no instante de prever urgência e deve sair: usá-la seria ensinar ao modelo uma informação do futuro.
Split random permite chamados do mesmo cliente em treino/teste. Para uso em novos clientes, o desenho adequado é split por grupo; para futuro temporal, também preservar a ordem de tempo.
Fit-transform é ajustado só no treino e CV fica dentro dele. A decisão é invalidar a estimativa anterior e refazer baseline/matriz por classe; o dado sintético não demonstra desempenho de clientes reais.
Evidências para autoavaliação ou revisão por pares
- Vazamento temporal: A feature resolução final é indisponível no instante de prever urgência e deve sair: usá-la seria ensinar ao modelo uma informação do futuro.
- Separação por grupo e tempo: Split random permite chamados do mesmo cliente em treino/teste. Para uso em novos clientes, o desenho adequado é split por grupo; para futuro temporal, também preservar a ordem de tempo.
- Pipeline e nova avaliação: Fit-transform é ajustado só no treino e CV fica dentro dele. A decisão é invalidar a estimativa anterior e refazer baseline/matriz por classe; o dado sintético não demonstra desempenho de clientes reais.
Um erro frequente
Cross-validation corrige qualquer vazamento.
Cross-validation não remove features vazadas nem corrige split inadequado.
Teste sua compreensão
Responda com suas palavras antes de abrir o comentário. Saber explicar uma decisão é parte do domínio.
1. F1 alto elimina necessidade de discutir custos?
Não.
A métrica combina precision e recall, mas não representa todo custo de erro.
↗ Metrics and scoring: quantifying the quality of predictions
2. Cross-validation corrige duplicatas entre clientes?
Não automaticamente.
Divisão por grupo pode ser necessária para preservar independência.
3. K-Means é um classificador supervisionado?
Seu progresso fica salvo neste navegador. Concluir a leitura não substitui demonstrar o domínio nos exercícios.
Referências e aprofundamento
Documentação oficial e trabalhos originais. As referências registram o escopo e as limitações para você conferir o que sustentam.
- Supervised learning
scikit-learn • consulta: 2026-10-06
FundamentosPanorama de regressão e classificação e famílias de estimadores.
Limites: Página de organização; detalhes de algoritmos ficam nas páginas específicas mapeadas.
- Clustering
scikit-learn • consulta: 2026-10-06
FundamentosAprendizado sem rótulos, K-Means, escolha e avaliação de agrupamentos.
Limites: K-Means assume geometria e escala adequadas; clusters não são classes validadas automaticamente.
- Linear Models
scikit-learn • consulta: 2026-10-06
FundamentosRegressão linear, regularização e regressão logística.
Limites: Regressão logística faz classificação; pressupostos e regularização devem ser explicados.
- Cross-validation: evaluating estimator performance
scikit-learn • consulta: 2026-10-06
FundamentosTrain/test split, validação cruzada, estratificação e divisões por tempo/grupo.
Limites: Separar teste final da seleção; evitar vazamento e usar split compatível com estrutura dos dados.
- Validation curves: plotting scores to evaluate models
scikit-learn • consulta: 2026-10-06
FundamentosCurvas de validação/aprendizado, overfitting e underfitting.
Limites: Curvas diagnosticam comportamento amostral, não demonstram generalização a toda distribuição futura.
- Metrics and scoring: quantifying the quality of predictions
scikit-learn • consulta: 2026-10-06
FundamentosPrecision, recall, F1, ROC, AUC, thresholds e métricas de regressão/classificação.
Limites: Escolha depende de tarefa, desbalanceamento e custo dos erros; uma métrica isolada pode esconder falhas.
- Preprocessing data
scikit-learn • consulta: 2026-10-06
FundamentosEscalonamento, codificação e transformações de atributos.
Limites: Ajustar transformações apenas no conjunto de treino; sensibilidade à escala varia por estimador.
- Decision Trees
scikit-learn • consulta: 2026-10-06
FundamentosÁrvores de classificação/regressão, critérios, profundidade e poda.
Limites: Árvores podem sobreajustar; controlar complexidade e avaliar em dados separados.
- Ensembles: gradient boosting, random forests, bagging, voting, stacking
scikit-learn • consulta: 2026-10-06
FundamentosRandom Forest, bagging e boosting e seus trade-offs.
Limites: Ensemble não elimina vazamento nem substitui validação de hiperparâmetros.
- Introduction to Boosted Trees
XGBoost • consulta: 2026-10-06
FundamentosModelo aditivo de árvores, função objetivo, regularização e boosting.
Limites: Introdução conceitual; desempenho depende de dados e tuning, não presumir superioridade.