Giter Site home page Giter Site logo

allanfoppa / world-happiness-report Goto Github PK

View Code? Open in Web Editor NEW

This project forked from salatielbairros/world-happiness-report

0.0 1.0 0.0 19.63 MB

Trabalho de conclusão da pós-graduação em Inteligência Artificial e Aprendizado de Máquina na PUC-MG.

Python 0.42% HTML 65.89% Jupyter Notebook 33.69% Dockerfile 0.01%

world-happiness-report's Introduction

World Happines Report Regression Model

TOC gerado com markdown-toc

Agradecimentos

Ao meu colega de projeto Salatiel Bairros pela dedicação e paciência para explicar o que ainda não estava em meus conhecimentos. O conhecimento dele fez grande diferença no resultado final deste trabalho.

Badges

Badge em Desenvolvimento

Descrição do projeto

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.

Arquitetura

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.

Dependências

Rodando ou acessando o projeto

Publicação Azure

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:

  1. Azure Container Registry - armazena os containers Docker gerados.
  2. 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.

Rodando API localmente

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

Gerando imagem do Docker

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

Executando via console

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

Gerando exemplos de retorno

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

Variáveis de ambiente

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/allanfoppa/world-happiness-report/raw/main/docs/used_data/original/HistoricData.xls",
    "Data2021Url": "https://github.com/allanfoppa/world-happiness-report/raw/main/docs/used_data/original/Data_2021.xls",
    "Kaggle2015Url": "https://raw.githubusercontent.com/allanfoppa/world-happiness-report/main/docs/used_data/original/kaggle_2015.csv",
    "Kaggle2016Url": "https://raw.githubusercontent.com/allanfoppa/world-happiness-report/main/docs/used_data/original/kaggle_2016.csv",
    "CountriesUsaDatabaseUrl": "https://raw.githubusercontent.com/allanfoppa/world-happiness-report/main/docs/used_data/original/countries_usa_database.csv"
}

Modelos utilizados

A versão final do projeto na API utiliza os seguintes modelos tanto para classificação quanto para regressão:

É 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:

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 das features, realizada através da lib eli5, mencionada acima.

Endpoints

/data-ingestion

POST /ingest

Realiza a ingestão dos dados.

GET /ingested/processed-data

Retorna os dados processados.

GET /ingested/pandemic-data

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.

/region-classification/{knn|random-forest}

GET /evaluate

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.

GET /balanced/evaluate

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.

PUT /predict

Realiza a predição de uma região através dos dados informados de score e métricas.

/score-regression/{knn|random-forest}

GET /evaluate

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 $n$ vezes, onde $n$ é o número de anos de pesquisa e em cada treinamento um dos anos é selecionado como teste. O resultado é a performance do modelo para cada ano quando ele foi selecionado como teste. O objeto de retorno desse endpoint é uma lista da classe RegressionModelEvaluationResponse.

PUT /predict

Realiza a predição de um score através dos dados informados.

Melhorias futuras

  • 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.

world-happiness-report's People

Contributors

salatielbairros avatar allanfoppa avatar allan-fagundes-eldorado avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.