🇧🇷 Português | 🇺🇸 English
Este projeto aplica técnicas de Machine Learning para classificar a presença ou ausência de doenças cardíacas utilizando o conjunto de dados Heart Disease do UCI Machine Learning Repository.
O objetivo é prever o diagnóstico de um paciente com base em variáveis clínicas e laboratoriais, demonstrando conceitos fundamentais de classificação supervisionada, análise exploratória, pré-processamento de dados e avaliação comparativa de modelos.
Desenvolver um modelo capaz de identificar a presença de doença cardíaca (estenose coronariana > 50%) a partir de dados clínicos coletados antes do procedimento de angiografia.
As classes presentes no dataset são:
- 0 — Sem doença cardíaca
- 1 — Com doença cardíaca
O projeto utiliza o Heart Disease Dataset, disponível no UCI Machine Learning Repository (ID 45).
Fonte: https://archive.ics.uci.edu/dataset/45/heart+disease
| Variável | Descrição | Tipo |
|---|---|---|
| age | Idade do paciente (anos) | Numérica contínua |
| sex | Sexo (1 = masculino, 0 = feminino) | Categórica binária |
| cp | Tipo de dor torácica (1 a 4) | Categórica ordinal |
| trestbps | Pressão arterial em repouso (mmHg) | Numérica contínua |
| chol | Colesterol sérico (mg/dL) | Numérica contínua |
| fbs | Glicemia em jejum > 120 mg/dL (1 = sim, 0 = não) | Categórica binária |
| restecg | Resultado do ECG em repouso (0, 1, 2) | Categórica ordinal |
| thalach | Frequência cardíaca máxima atingida (bpm) | Numérica contínua |
| exang | Angina induzida por exercício (1 = sim, 0 = não) | Categórica binária |
| oldpeak | Depressão do segmento ST (mm) | Numérica contínua |
| slope | Inclinação do segmento ST (1, 2, 3) | Categórica ordinal |
| ca | Número de vasos principais (0–3) | Numérica discreta |
| thal | Talassemia (3 = normal, 6 = fixo, 7 = reversível) | Categórica ordinal |
| Variável | Descrição |
|---|---|
| target | 0 = sem doença cardíaca / 1 = com doença cardíaca |
Foram realizadas etapas de exploração dos dados, incluindo:
- Visualização da distribuição da variável-alvo;
- Análise descritiva das variáveis numéricas e categóricas;
- Histogramas comparativos por classe;
- Boxplots das variáveis numéricas por classe;
- Gráficos de proporção das variáveis categóricas;
- Matriz de correlação entre todas as variáveis.
Essas análises ajudam a compreender a estrutura dos dados e identificar as variáveis mais relevantes antes do treinamento dos modelos.
Foram realizadas as seguintes etapas de pré-processamento:
- Imputação de valores ausentes com a mediana, nas colunas
caethal; - Divisão estratificada dos dados em treino (80%) e teste (20%);
- Padronização com
StandardScaler, ajustado exclusivamente no conjunto de treino.
Foram treinados e comparados 7 algoritmos de classificação:
| Modelo | Biblioteca |
|---|---|
| Regressão Logística | Scikit-Learn |
| Árvore de Decisão | Scikit-Learn |
| Random Forest | Scikit-Learn |
| Gradient Boosting | Scikit-Learn |
| SVM (kernel RBF) | Scikit-Learn |
| KNN (k=7) | Scikit-Learn |
| Naive Bayes | Scikit-Learn |
Os dados foram divididos em:
- 80% para treinamento;
- 20% para teste.
A divisão foi realizada com estratificação pela variável-alvo, utilizando a função train_test_split() do Scikit-Learn.
O desempenho foi avaliado utilizando Validação Cruzada Estratificada de 10 folds no conjunto de treino e as seguintes métricas no conjunto de teste:
Mede a porcentagem de classificações corretas realizadas pelo modelo.
Média harmônica entre Precision e Recall, útil para avaliar o equilíbrio entre falsos positivos e falsos negativos.
Área sob a Curva ROC. Métrica principal do projeto por medir a capacidade discriminativa do modelo independentemente do limiar de decisão — especialmente relevante em contexto clínico.
Apresenta métricas de Precision, Recall e F1-Score para cada classe.
Permite visualizar os acertos e erros de classificação para cada classe.
O melhor modelo foi selecionado com base no maior ROC AUC obtido no conjunto de teste. As curvas ROC de todos os modelos foram plotadas para comparação visual.
A importância das features foi analisada para o modelo vencedor, identificando as variáveis clínicas mais relevantes para o diagnóstico.
O projeto demonstrou que é possível construir classificadores com alto desempenho para diagnóstico de doenças cardíacas utilizando apenas variáveis clínicas não invasivas.
A comparação entre múltiplos algoritmos evidenciou a importância de avaliar modelos com métricas adequadas ao problema, sendo o ROC AUC a métrica mais apropriada para aplicações médicas onde o equilíbrio entre sensibilidade e especificidade é crítico.
This project applies Machine Learning techniques to classify the presence or absence of heart disease using the Heart Disease dataset from the UCI Machine Learning Repository.
The objective is to predict a patient's diagnosis based on clinical and laboratory variables, demonstrating supervised classification, exploratory data analysis, preprocessing, and comparative model evaluation.
Build a model capable of identifying the presence of heart disease (coronary stenosis > 50%) from clinical data collected prior to angiography.
The dataset contains two classes:
- 0 — No heart disease
- 1 — Heart disease present
The project uses the Heart Disease Dataset, available at the UCI Machine Learning Repository (ID 45).
Source: https://archive.ics.uci.edu/dataset/45/heart+disease
| Feature | Description | Type |
|---|---|---|
| age | Patient age (years) | Continuous |
| sex | Sex (1 = male, 0 = female) | Binary categorical |
| cp | Chest pain type (1 to 4) | Ordinal categorical |
| trestbps | Resting blood pressure (mmHg) | Continuous |
| chol | Serum cholesterol (mg/dL) | Continuous |
| fbs | Fasting blood sugar > 120 mg/dL (1 = yes, 0 = no) | Binary categorical |
| restecg | Resting ECG results (0, 1, 2) | Ordinal categorical |
| thalach | Maximum heart rate achieved (bpm) | Continuous |
| exang | Exercise-induced angina (1 = yes, 0 = no) | Binary categorical |
| oldpeak | ST depression induced by exercise (mm) | Continuous |
| slope | Slope of the peak exercise ST segment (1, 2, 3) | Ordinal categorical |
| ca | Number of major vessels colored by fluoroscopy (0–3) | Discrete numeric |
| thal | Thalassemia (3 = normal, 6 = fixed, 7 = reversible) | Ordinal categorical |
| Variable | Description |
|---|---|
| target | 0 = no heart disease / 1 = heart disease present |
The project includes:
- Target variable distribution analysis;
- Descriptive statistics for numerical and categorical variables;
- Comparative histograms by class;
- Boxplots of numerical variables by class;
- Categorical variable proportion charts;
- Correlation matrix heatmap.
The following preprocessing steps were performed:
- Missing value imputation using the median, applied to columns
caandthal; - Stratified train/test split (80% training / 20% testing);
- Feature scaling with
StandardScaler, fitted exclusively on the training set.
Seven classification algorithms were trained and compared:
| Model | Library |
|---|---|
| Logistic Regression | Scikit-Learn |
| Decision Tree | Scikit-Learn |
| Random Forest | Scikit-Learn |
| Gradient Boosting | Scikit-Learn |
| SVM (RBF kernel) | Scikit-Learn |
| KNN (k=7) | Scikit-Learn |
| Naive Bayes | Scikit-Learn |
The dataset was divided into:
- 80% training data;
- 20% testing data.
The split was stratified by the target variable using Scikit-Learn's train_test_split() function.
Models were evaluated using Stratified 10-Fold Cross-Validation on the training set and the following metrics on the test set:
Measures the percentage of correct predictions.
Harmonic mean of Precision and Recall, useful for assessing the balance between false positives and false negatives.
Area Under the ROC Curve. The primary metric of this project, measuring the model's discriminative ability regardless of the decision threshold — especially relevant in clinical settings.
Provides Precision, Recall, and F1-Score for each class.
Displays classification performance for each class.
The best model was selected based on the highest ROC AUC on the test set. ROC curves for all models were plotted for visual comparison.
Feature importance was analyzed for the winning model to identify the most relevant clinical variables for diagnosis.
The project demonstrated that high-performance classifiers for heart disease diagnosis can be built using only non-invasive clinical variables.
The comparison between multiple algorithms highlighted the importance of selecting evaluation metrics appropriate to the problem, with ROC AUC being the most suitable metric for medical applications where the balance between sensitivity and specificity is critical.
- Python
- Pandas
- NumPy
- Scikit-Learn
- Seaborn
- Matplotlib
- ucimlrepo
Flávia Vitória de Queiroz