Experimento Prático no Wisconsin Breast Cancer Dataset
- Motivação
- Fundamentos Teóricos
- Dataset & Estratificação
- Análise Exploratória (EDA)
- Pré-processamento
- Particionamento Estratificado
- Baseline & Tuning
- Avaliação
- Interpretabilidade
- Reflexão Crítica
- Reproduzindo o Estudo
- Artefatos
- Referências
Objetivo principal: mostrar, na prática, todo o pipeline com XGBoost, compará-lo ao SVM (seminário anterior) e discutir resultados, interpretabilidade e trade-offs de uso em produção.
O XGBoost (eXtreme Gradient Boosting) implementa gradient boosting com:
- Regularização L1/L2 para conter overfitting.
- Paralelização por bloco + suporte a GPU.
- Early Stopping nativo.
Onde:
| Parâmetro | Papel | Pontos de partida |
|---|---|---|
n_estimators |
Nº de árvores | 200 – 400 + early_stopping_rounds |
learning_rate |
Contribuição por árvore | 0.01 – 0.1 |
max_depth |
Profundidade máxima | 3 – 6 |
subsample |
% linhas por árvore | 0.7 – 1.0 |
colsample_bytree |
% colunas por árvore | 0.7 – 1.0 |
gamma |
Ganho mínimo p/ split | 0 – 5 |
lambda, alpha |
Regularização L2 / L1 | 0 – 10 |
- Fonte: Breast Cancer Wisconsin (
sklearn.datasets.load_breast_cancer) - Classes: 0 = Maligno · 1 = Benigno
- Estratificação garantiu a mesma proporção de classes em treino e teste:
| Split | Amostras | % Benigno |
|---|---|---|
| Treino | 910 | 63 % |
| Teste | 114 | 63 % |
import seaborn as sns, matplotlib.pyplot as plt
sns.countplot(x='target', data=df); plt.title('Distribuição das Classes')- Correlações fortes entre
mean_*eworst_*. - Nenhum valor ausente.
- Algumas features altamente colineares → regularização lida bem, mas vale monitorar.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)Embora árvores não exijam escala, mantivemos para comparabilidade com o SVM.
from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.111, random_state=42)- Proporções conservadas (ver tabela acima).
random_statefixado → reprodutibilidade.
from xgboost import XGBClassifier
clf0 = XGBClassifier(
n_estimators=200, max_depth=4, learning_rate=0.05,
eval_metric='logloss', use_label_encoder=False)
clf0.fit(X_train, y_train)param_grid = { ... } # ver notebook
cv = StratifiedKFold(10, shuffle=True, random_state=42)
search = RandomizedSearchCV(
XGBClassifier(eval_metric='logloss', use_label_encoder=False),
param_grid, n_iter=50, cv=cv, scoring='roc_auc', random_state=42,
n_jobs=-1, verbose=0)
search.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
early_stopping_rounds=30, verbose=False)
best_clf = search.best_estimator_from sklearn.metrics import (classification_report, confusion_matrix,
RocCurveDisplay, PrecisionRecallDisplay)
y_pred = best_clf.predict(X_test)
print(classification_report(y_test, y_pred, digits=4))
RocCurveDisplay.from_estimator(best_clf, X_test, y_test)
PrecisionRecallDisplay.from_estimator(best_clf, X_test, y_test)| Métrica | Valor |
|---|---|
| AUC-ROC | 0.99 |
| Precisão | 0.96 |
| Recall | 0.95 |
| F1-score | 0.95 |
Confusion Matrix: 2 FP · 3 FN.
from xgboost import plot_importance
plot_importance(best_clf, max_num_features=10)import shap
explainer = shap.TreeExplainer(best_clf)
shap_vals = explainer.shap_values(X_test)
shap.summary_plot(shap_vals, X_test, plot_type="dot")worst_area,worst_radiuseworst_concave_pointsdominam a contribuição.- Valores altos dessas variáveis aumentam probabilidade de maligno.
| Questão | Insight |
|---|---|
| Overfitting | Não foi observado: early stopping + regularização mantiveram gap < 1 pp entre treino e validação. |
| Comparação com SVM (seminário) | XGBoost ↓ AUC (-0.0264), ↓ tempo de predição (~4×). |
| Limitações | Tuning extenso; riscos de data leakage se pipeline não for bem fechado. |
| Próximos Passos | LightGBM / CatBoost; stacking com SVM; calibração de probabilidades (CalibratedClassifierCV). |
# 1 · Clone o repositório
git clone https://github.com/thalesfb/machine_learning.git
cd machine_learning/seminar/xgboost
# 2 · Ambiente
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 3 · Execute
jupyter lab xgboost.ipynbVersão Python ≥ 3.10 recomendada.
| Arquivo | Propósito |
|---|---|
xgboost.ipynb |
Notebook completo (código + gráficos). |
slides |
Apresentação de 15 min. |
requirements.txt |
Lista de dependências (≈ 80 MB instalação clean). |
| Dataset | Carregado diretamente via scikit-learn (sem download manual). |
- 🔗XGBoost: A Scalable Tree Boosting System
- 🔗Breast Cancer Wisconsin Dataset - Kaggle
- 🔗XGBoost Docs
- 🔗StatQuest: Gradient Boosting Explained
- 🔗Kaggle XGBoost Tutorials
- 🔗Scikit-learn Docs
- 🔗Bias-Variance Tradeoff
“All models are wrong, but some are useful.” – George Box
Faça a validação cruzada sempre.