Desenvolvimento de um experimento que contempla análise e compreensão dos dados, desde pré-processamento à definição de uma metodologia experimental adequada para a classificação de pacientes com Diabetes.
Disciplina: Inteligência Computacional
Instituição: Centro Federal de Educação Tecnológica de Minas Gerais (CEFET-MG) - Campus V Divinópolis
Professor: Alisson Marques da Silva
Projeto: "Atividade Prática 01 - Metodologia Experimental"
Segundo José Antonio Miguel Marcondes (2003), o diabete afeta aproximadamente dez milhões de brasileiros e sua incidência vem aumentando, sobretudo no diabetes tipo 2. Nesse contexto, a classificação de pacientes é relevante para apoiar ações de prevenção e acompanhamento.
Este trabalho, desenvolvido na disciplina de Inteligência Computacional, utiliza a base pública Diabetes Health Indicators Dataset (Kaggle), com 100.000 registros e 31 atributos, para um problema de classificação binária cujo alvo é diagnosed_diabetes (0 ou 1). A base reúne variáveis sociodemográficas, hábitos de vida, histórico clínico e biomarcadores, o que a torna adequada ao enunciado por conter atributos heterogêneos e permitir uma metodologia experimental realista.
Com base nas dificuldades que serão apresentadas posteriormente, necessitou-se da aplicação de etapas de pré-processamento, dentre elas a codificação de atributos categóricos (através do OneHotEncoder da biblioteca sklearn), a separação estratificada entre treino e teste, a padronização de atributos numéricos para modelos sensíveis à escala (KNN e SVM) e a seleção embarcada de atributos com SelectFromModel + RandomForestClassifier. Em conjunto, essas etapas reduziram ruído, preservaram representatividade da classe-alvo e melhoraram a comparabilidade entre os classificadores.
As implementações principais estão em Diabetes-Classification/src/preprocessing.py, Diabetes-Classification/src/models.py e Diabetes-Classification/src/main.py. O fluxo foi simplificado para priorizar o que o enunciado e a orientação docente cobram com maior ênfase: processamento dos dados e modelagem, mantendo avaliação objetiva e reprodutível. No pré-processamento, foi mantida a amostragem estratificada (quando aplicável), garantindo representatividade da classe-alvo ao reduzir a base:
if n_samples < len(df):
df, _ = train_test_split(
df,
train_size=n_samples,
stratify=df["diagnosed_diabetes"],
random_state=42,
)Para atender ao enunciado sem inflar a quantidade de artefatos, foi implementada uma EDA mínima com um resumo tabular da base e um gráfico de distribuição da classe-alvo. Essa visão inicial já caracteriza a base e o balanceamento do alvo, servindo de suporte para as decisões de modelagem apresentadas a seguir:
resumo_exploratorio = pd.DataFrame(
[{
"total_registros": int(len(df)),
"total_atributos": int(df.shape[1]),
"atributos_numericos": int(df.select_dtypes(include=[np.number]).shape[1]),
"atributos_categoricos": int(df.select_dtypes(exclude=[np.number]).shape[1]),
"classe_positiva_pct": float((df["diagnosed_diabetes"] == 1).mean() * 100),
}]
)No main.py, a função _run_data_quality_assessment consolida a integridade da base em um único resumo com total de ausentes, total de duplicados, proporção da classe positiva e maior percentual de outliers por IQR. A avaliação de qualidade continua formal, mas enxuta, reduzindo excesso de artefatos e mantendo rastreabilidade para decisões de processamento. Quando aplicável, as decisões de tratamento são tomadas a partir desses indicadores; nesta base/amostra atual, os resultados indicaram ausência de valores faltantes e duplicatas, não exigindo imputação ou deduplicação adicional nesta etapa.
quality_summary = {
"total_ausentes": float(missing_total),
"total_duplicados": float(duplicate_count),
"proporcao_classe_positiva_pct": float(positive_class_ratio),
"atributo_maior_outlier": feature_with_max_outlier,
"maior_outlier_pct_iqr": float(max_outlier_pct),
}A função _evaluate_models treina KNN, SVM e DecisionTree sob o mesmo protocolo, calcula accuracy, precision, recall, f1-score, componentes da matriz de confusão e adiciona validação cruzada estratificada para robustez. Para justiça experimental, cada modelo é avaliado em 3 repetições com sementes distintas e as métricas finais são reportadas por média, reduzindo viés de uma única partição treino/teste.
repeat_seed = 42 + repeat_index
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=repeat_seed)
cv_scores = cross_val_score(
pipeline,
X_train,
y_train,
cv=cv,
scoring="f1",
) rows.append(
{
"modelo": model_name,
"f1_cv_media": float(np.mean(stats["f1_cv_media"])),
"f1_cv_desvio": float(np.mean(stats["f1_cv_desvio"])),
"accuracy": float(np.mean(stats["accuracy"])),
"precision": float(np.mean(stats["precision"])),
"recall": float(np.mean(stats["recall"])),
"f1_score": float(np.mean(stats["f1_score"])),
"verdadeiro_negativo": int(cm_sum[0, 0]),
"falso_positivo": int(cm_sum[0, 1]),
"falso_negativo": int(cm_sum[1, 0]),
"verdadeiro_positivo": int(cm_sum[1, 1]),
}
)Para manter o foco pedagógico em modelagem, a discussão final é feita a partir das tabelas e matrizes de confusão geradas, com comparação dos f1_cv_media e f1_score, análise de falsos positivos/falsos negativos e leitura dos top3_atributos por modelo. Isso mantém a entrega enxuta e suficiente para discutir decisões metodológicas sem excesso de visualizações.
Para reduzir viés de avaliação, todos os modelos são submetidos ao mesmo protocolo: mesma base amostrada, mesma estratégia de divisão estratificada e mesma rotina de validação cruzada. Além disso, são feitas 3 repetições com sementes diferentes (42, 43, 44), e as métricas finais são reportadas por média. Dessa forma, evita-se que a comparação entre algoritmos dependa de uma única partição favorável/desfavorável.
Os resultados abaixo referem-se à execução com n_samples=5000 e n_repeats=3, seguindo o protocolo implementado no main.py.
- Total de registros analisados:
5000 - Valores ausentes:
0 - Registros duplicados:
0 - Proporção da classe positiva (
diagnosed_diabetes = 1):60.0% - Atributo com maior percentual de outliers (IQR):
hypertension_history(24.94%)
| Modelo | F1 (CV média) | F1 (teste) | Accuracy | Precision | Recall |
|---|---|---|---|---|---|
| SVM | 0.8816 | 0.8858 | 0.8680 | 0.9198 | 0.8544 |
| DecisionTree | 0.8863 | 0.8800 | 0.8543 | 0.8702 | 0.8900 |
| KNN | 0.8313 | 0.8376 | 0.8063 | 0.8426 | 0.8328 |
Top-3 atributos mais relevantes (comum aos modelos nesta execução): hba1c, glucose_postprandial, glucose_fasting.
SVMapresentou o melhor equilíbrio nas métricas médias de teste, com maiorF1-scoree maioraccuracyapós 3 repetições.DecisionTreeteve melhor média deF1na validação cruzada e maiorrecall, indicando maior sensibilidade para detectar casos positivos.KNNficou abaixo dos demais nas métricas médias para este cenário.- A consistência dos atributos
hba1c,glucose_postprandialeglucose_fastingreforça sua relevância clínica na predição. - Como encaminhamento metodológico, a escolha final do modelo deve considerar o trade-off entre
precisionerecallconforme o objetivo prático (minimizar falsos positivos ou falsos negativos).
Use o script run_project.sh, que instala as dependências automaticamente via requirements.txt e executa o projeto.
Execução padrão:
./run_project.shExecução com parâmetros (opcional):
./run_project.sh --n-samples 5000 --n-repeats 3Obs.: se necessário, garanta permissão de execução do script:
chmod +x run_project.shAo final da execução, são gerados artefatos em Diabetes-Classification/outputs/:
tables/resumo_exploratorio.csvtables/resumo_qualidade_dados.csvtables/comparacao_modelos.csvplots/distribuicao_classe_alvo.pngplots/cm_KNN.png,plots/cm_SVM.png,plots/cm_DecisionTree.png
MARCONDES, José Antonio Miguel. Diabete melito: fisiopatologia e tratamento. Revista da Faculdade de Ciências Médicas de Sorocaba, [S. l.], v. 5, n. 1, p. 18–26, 2007. Disponível em: https://revistas.pucsp.br/index.php/RFCMS/article/view/117. Acesso em: 24 mar. 2026.
Rakesh Kolipaka, and Ranjith Kumar Digutla. (2025). Diabetes Health Indicators Dataset [Data set]. Kaggle. https://doi.org/10.34740/KAGGLE/DSV/13128284




