O ObesityPredict é um sistema de apoio à decisão médica desenvolvido para classificar pacientes em 7 níveis de obesidade com base exclusivamente em hábitos de vida e dados comportamentais — sem utilizar altura ou peso como entrada.
Diferente de sistemas baseados em IMC, este projeto foca na realidade clínica da triagem: um médico já conhece o peso do paciente; o valor está em identificar risco de obesidade a partir de comportamentos modificáveis, permitindo intervenções mais eficazes antes do agravamento.
- Exclusão Intencional de Altura e Peso: Proxies diretos do IMC foram removidos para que o modelo aprenda
hábitos → classe, nãoIMC → classe. Com 84% de acurácia sem biométricas, o sistema tem valor real de triagem comportamental. - Engenharia de Features Comportamentais: Criação de
activity_hydration(faf × ch2o) elifestyle_score(faf + ch2o − ncp + fcvc) para capturar sinergias não-lineares entre hábitos. - Prevenção de Data Leakage: Divisão estratificada (StratifiedKFold 5-folds + hold-out 20%) garante representatividade das 7 classes em cada fold sem contaminar o conjunto de teste.
- Pipeline Completo em Produção: Dados no Supabase → treinamento offline → artefatos versionados → inferência em tempo real via Streamlit Cloud.
Com o modelo RandomForest e engenharia de atributos refinada, atingimos resultados expressivos no conjunto de teste:
| Métrica | Resultado | Descrição |
|---|---|---|
| Acurácia (Teste) | 84,45% | Taxa de acerto em dados inéditos, sem altura/peso. |
| Macro-F1 | 83,43% | Métrica primária para triagem clínica — penaliza erros em classes raras igualmente. |
| ROC-AUC (Macro OvR) | 0,9721 | Separabilidade entre as 7 classes sem variáveis biométricas. |
| Acurácia CV (5-fold) | 80,63% ± 1,49% | Consistência em validação cruzada estratificada. |
| Melhor modelo | RandomForest | 150 árvores, max_depth=15, class_weight=balanced. |
O projeto segue um pipeline linear e auditável:
- Fonte: Supabase PostgreSQL — tabela
obesity_data(2.111 registros, paginação automática). - Origem: UC Irvine ML Repository — Estimation of Obesity Levels Based on Eating Habits and Physical Condition (23% dados reais do México, Peru e Colômbia + 77% sintéticos via SMOTE).
- Tratamento: Normalização de nomes de colunas, renomeação de aliases históricos (
nobeyesdad,family_history_with_overweight).
Transformamos dados brutos em indicadores comportamentais preditivos com blindagem total contra vazamento de dados:
- Atividade física: FAF (dias/semana), TUE (tempo em telas).
- Nutrição: FCVC (frequência de vegetais), NCP (refeições/dia), CH2O (consumo de água), CAEC (lanches), CALC (álcool), FAVC (hipercalóricos).
- Histórico: Predisposição familiar, tabagismo, monitoramento calórico.
- Interações engineeradas:
activity_hydration = faf × ch2o,lifestyle_score = faf + ch2o − ncp + fcvc.
StratifiedKFold(5)garante que cada fold tenha as 7 classes representadas.- Hold-out de 20% separado antes do treino para avaliação final ("Prova Real").
- Artefatos versionados por timestamp — mantidas as 2 versões mais recentes.
- Pipeline sklearn:
ColumnTransformer(StandardScaler + OneHotEncoder) +RandomForestClassifier. - Métricas avaliadas: Acurácia, Macro-F1, ROC-AUC (One-vs-Rest), Matriz de Confusão, Relatório por classe.
- Artifact versioning:
ml/model.pkl+ml/metrics.json+ snapshotsmodel_YYYYMMDD_HHMMSS.pkl.
- RandomForest (Melhor modelo — 84,45% de acurácia no hold-out)
- Robusto a features correlacionadas;
class_weight="balanced"compensa desbalanceamento residual entre as 7 classes.
O modelo final classifica pacientes em 7 níveis sem balança ou fita métrica:
- Acurácia em Teste: 84,45% (dados comportamentais puros, sem altura/peso).
- ROC-AUC: 0,9721 — excelente separabilidade para problema multiclasse de 7 categorias.
- Macro-F1: 83,43% — critério primário para sistemas de triagem clínica.
- Consistência: Baixo overfitting (CV 80,63% vs hold-out 84,45%).
app/ Frontend Streamlit (multi-página)
ml/ Pipeline de ML: treinamento, inferência, versionamento
db/ Cliente Supabase (singleton) + schema SQL
data/ CSV de treinamento (git-ignored)
Fluxo de dados:
- Treino (offline):
data/Obesity.csv→ Supabaseobesity_data→ml/train.py→ml/model.pkl+ml/metrics.json - Inferência (runtime): Formulário Streamlit →
ml/predict.py(cached) → probabilidades por classe → log empredictions_log
- Python 3.12+
- Credenciais Supabase (
SUPABASE_URLeSUPABASE_KEY)
-
Clone o repositório:
git clone https://github.com/DeleteTableSemWhere/Preditor_Obesidade-FIAP_Chall.git cd Preditor_Obesidade-FIAP_Chall -
Instale as dependências:
pip install -r requirements.txt
-
Configure as credenciais (crie um
.envna raiz):SUPABASE_URL=sua_url_aqui SUPABASE_KEY=sua_chave_aqui
# Ingerir dados (apenas na primeira vez)
python -m db.ingest_csv
# Treinar o modelo
python -m ml.train
# Rodar a aplicação
streamlit run app/Home.pyA aplicação estará disponível em http://localhost:8501.
docker-compose up --build| Página | Descrição |
|---|---|
| Home | Contexto do problema e navegação |
| Análise | Dashboard EDA: distribuições, correlações, balanço de classes |
| Previsão | Formulário de predição com gauge e probabilidades por classe |
| Logs | Histórico de predições com KPIs de uso |
| Sobre | Arquitetura, métricas, feature importance e limitações |
Desenvolvido como parte do Tech Challenge (Fase 2) da Pós-Tech Data Analytics (FIAP).
Bruno Assis 🚀 Data Scientist |
Gabriel Nunes ⚙️ Data Architect |
Jonathan Paixão 🐍 Python Dev |
Rafael Vieira 📉 Quant |
Wagner da Silva 🧠 AI Engineer |
Este projeto tem fins estritamente educacionais e acadêmicos. As classificações geradas pelo modelo de Machine Learning possuem margem de erro e não constituem diagnóstico médico. Qualquer resultado deve ser interpretado por um profissional de saúde qualificado com acesso ao histórico completo do paciente.