- World Happines Report Regression Model
Este projeto contém modelos de regressão para prever o nível de felicidade de um país no mundo utilizando os dados do WHR 2021 dataset. Além disso, utiliza modelos de classificação para prever a região de um país no mundo através da relação entre o score de felicidade e as métricas do dataset.
Nota: Os dados utilizados não foram os do Kaggle. O dataset deles não constam os dados originais, apenas dados relativos.
A arquitetura do código do projeto está melhor detalhada aqui. Além disso o próprio código contém diversos comentários para facilitar o entendimento.
- pandas
- xlrd
- pydantic
- scikit-learn
- numpy
- eli5
- fastapi
- joblib
- uvicorn
- wget
- imbalanced-learn
- pandas-profiling
A API do projeto pode ser acessada via https://tcc-world-happines-report.azurewebsites.net/docs.
Ela é publicada através de dois serviços do Azure:
- Azure Container Registry - armazena os containers Docker gerados.
- Azure App Service - Publicação do serviço de API.
Eles são automatizados através da publicação da imagem via Gihub Workflow.
A escolha desses serviços para publicação e a utilização de armazenamento local, não utilizando ferramentas como Hadoop, Spark, etc, foi feita porque (1) o volume de dados utilizado não é tão grande e (2) o custo para criar uma publicação em núvem é muito menor, permitindo até mesmo o uso de serviços gratuitos.
Para rodar o projeto localmente é necessário primeiro instalar as dependências presentes no arquivo requirements.txt
:
pip install -r requirements.txt
Após isso, basta rodar o projeto através do comando:
Obs: Utilizar a versão 3.10 do python
uvicorn main:app --host 0.0.0.0 --port 80
Para gerar a imagem do projeto basta rodar o comando:
docker build -t tccworldhappinessreport.azurecr.io/modelapi .
O nome da imagem informado acima (tccworldhappinessreport.azurecr.io/modelapi
) é o mesmo utilizado no serviço do Azure.
Caso realize alguma alteração no arquivo
Dockerfile
após ter gerado a imagem alguma vez, é necessário remover a imagem anterior e apagar a cache dos comandos:
docker builder prune
docker rmi tccworldhappinessreport.azurecr.io/modelapi
Para rodar a imagem basta rodar o comando:
docker run -p 80:80 tccworldhappinessreport.azurecr.io/modelapi
Por fim, para publicar manualmente uma imagem no serviço de registro de containers do Azure basta rodar os comandos:
docker login tccworldhappinessreport.azurecr.io
docker push tccworldhappinessreport.azurecr.io/modelapi
O arquivo console_main.py
tem como objetivo permitir a execução de comandos individuais do projeto via console. Basta chamar a função desejada nesse arquivo e executá-lo:
python console_main.py
Uma outra funcionalidade implementada é a geração dos exemplos de retorno dos endpoints implementados. Eles são salvos na pasta docs/api_return_samples
. Para executar basta rodar o comando:
python generate_samples.py
Para que a API rode corretamente algumas variáveis de ambiente são necessárias. Essas variáveis podem ser configuradas tanto a nível de ambiente quando em um arquivo appsettings.json
no diretório raiz do projeto. O valor default desses parâmetros é:
{
"OriginalHistoricDataUrl": "https://github.com/SalatielBairros/world-happiness-report/raw/main/docs/used_data/original/HistoricData.xls",
"Data2021Url": "https://github.com/SalatielBairros/world-happiness-report/raw/main/docs/used_data/original/Data_2021.xls",
"Kaggle2015Url": "https://raw.githubusercontent.com/SalatielBairros/world-happiness-report/main/docs/used_data/original/kaggle_2015.csv",
"Kaggle2016Url": "https://raw.githubusercontent.com/SalatielBairros/world-happiness-report/main/docs/used_data/original/kaggle_2016.csv",
"CountriesUsaDatabaseUrl": "https://raw.githubusercontent.com/SalatielBairros/world-happiness-report/main/docs/used_data/original/countries_usa_database.csv"
}
A versão final do projeto na API utiliza os seguintes modelos tanto para classificação quanto para regressão:
- Random Forest regressor | classifier
- KNN regressor | classifier
É destacável que o KNN é utilizado também pela biblioteca de
data-balancing
para classificação, através do algoritmo SMOTE.
A escolha desses modelos foi devido ao seu desempenho na etapa de estudo e análise dos modelos. Na etapa de estudo alguns outros modelos foram considerados, como:
- Linear regressor | classifier
- SVM regressor | classifier
- Decision Tree regressor | classifier
Não foram utilizados algoritmos de Redes Neurais pois os resultados de algoritmos mais simples e mais explicáveis foram satisfatórios.
Inclusive, a preocupação com a explicabilidade dos algoritimos utilizados na versão final se mostra presente ao retornamos nos endpoints de
evaluate
dos modelos a lista de importância dasfeatures
, realizada através da lib eli5, mencionada acima.
Realiza a ingestão dos dados.
Retorna os dados processados.
Retorna os dados processados mas apenas com os países presentes na pesquisa de 2020. O propósito é permitir uma análise correta do impacto da pandemia nos dados, visto que houve uma queda no número de países presentes na pesquisa de 2020.
Retorna os resultados da avaliação dos modelos, como acurácia, importância das features, precisão, recall, f1-score e a matriz de confusão. A avaliação é feita em separação simples de treino e teste, selecionando 20% dos dados para teste aleatoriamente a partir dos dados originais processados.
Retorna as mesmas métricas do endpoint /evaluate
mas utilizando para treinamento do modelo os dados balanceados com o algoritmo SMOTE. Nesse endpoint são retornadas as avaliações de teste e de validação, onde os dados de teste são oriuntos da separação simples de treino e teste dos dados balanceados, enquanto os dados de validação foram separados antes do balanceamento.
Realiza a predição de uma região através dos dados informados de score e métricas.
Retorna os resultados da avaliação dos modelos de regressão, como R² e R² ajustado, MSE e SMSE, além da relação de importância dos atributos para o respectivo modelo. O retorno é por ano de pesquisa. Dessa forma o modelo é treinado RegressionModelEvaluationResponse
.
Realiza a predição de um score através dos dados informados.
- Criação de um Frontend para a visualização dos dados e dos resultados;
- Utilização de um banco de dados para armazenar o dataset ingerido e os resultados obtidos;
- Paralelizar algumas etapas das transformações dos dados;
- Utilizar Azure files para armazenar os dados ingerido;
- Criar testes unitários;
- Adicionar Azure Application Insights para monitorar o desempenho do serviço.