Juntando meu background em medicina e minha paixão por Machine Learning, resolvi desenvolver um modelo que faz a análise de sentimentos envolvidos nos depoimentos de pacientes que ficaram internados em hospitais. O dataset utilizado foi retirado do Kaggle, e é chamado Hospital Reviews Dataset (https://www.kaggle.com/datasets/junaid6731/hospital-reviews-dataset), onde os dados coletados são de Google Reviews de hospitais em Bengaluru, India.
O dataset está disponível em formato .csv e é composto apenas por 3 colunas e 996 entradas:
| Feedback | Sentiment Label | Ratings |
|---|---|---|
| Object - O texto do review em si | Int64 - 0 (negativo) ou 1 (positivo) | Int64 - Valores de 1 a 5 |
Informação também presente no arquivo requirements.txt, mas o projeto requer as seguintes bibliotecas e versões:
- nlpaug
- nltk
- tabulate
- kagglehub~=0.3.13
- numpy~=2.3.2
- pandas~=2.3.2
- seaborn~=0.13.2
- matplotlib~=3.10.6
- spacy~=3.8.7
- scikit-learn~=1.7.1
Como se trata de um problema de classificação binária, optei por treinar um modelo de Regressão Logística, utilizando validação cruzada para otimizar o treinamento. Foram duas tentativas, com o primeiro modelo sendo treinado no dataset desbalanceado e o segundo após o balanceamento das classes.
O pipeline do projeto é composto pelas seguintes etapas:
- Análise exploratória dos dados (EDA)
- Separação em treino e teste (para evitar data leak)
- Balanceamento das classes do conjunto de treino com dados sintéticos (usando nlpaug e NLTK)
- Pré-processamento do texto (lemmatização e remoção de stopwords usando spaCy)
- Vetorização do texto pré-processado usando TF-IDF
- Redução de dimensionalidade com PCA
- Treinamento do modelo de Regressão Logística com validação cruzada
- Avaliação das métricas: Acurácia, Precisão, Recall, F1-Score, Curva ROC
- Plotagem dos resultados com Matplotlib e Seaborn
O modelo treinado no dataset desbalanceado obteve os seguintes resultados no conjunto de teste:
- Acurácia: 78%
- Precisão: 88%
- Recall: 63%
- F1-Score: 64%
- AUC-ROC: 91%
Embora as métricas podem ser consideradas boas, neste primeiro cenário o modelo apresentou um viés para a classe majoritária (positiva), visto que o dataset estava desbalanceado. Alcançou uma precisão de 100% na classe negativa, mas foi porque quase não classificou nenhum review como negativo, resultando em um recall muito baixo (26%).
Após o balanceamento das classes, o modelo apresentou uma melhora significativa:
- Acurácia: 85%
- Precisão: 82%
- Recall: 81%
- F1-Score: 81%
- AUC-ROC: 91%
Esta melhoria se deu principalmente no Recall (e consequentemente no F1-Score), indicando que o modelo ficou mais apto a identificar reviews negativos. Consequentemente, conseguimos reduzir o número de falsos positivos, às custas de um discreto aumento nos falsos negativos. Porém, neste caso, podemos considerar que o modelo está mais balanceado e justo na classificação das duas classes, perdendo o viés positivo que possuía anteriormente.
Mais detalhes sobre o projeto, incluindo o código completo, podem ser encontrados no notebook deste repositório."