Machine Learning na Saúde: Prevendo a Necessidade de Internação em Leitos de UTI Durante a Pandemia de COVID-19

Valquíria Alencar
10 min readAug 8, 2021

--

Projeto final do Bootcamp de Data Science Aplicada da Alura

Após 12 semanas muito intensas o Bootcamp chegou ao final e um projeto final de Machine Learning foi realizado!!!

Se você quiser conferir tudo o que foi feito e olhar os códigos o projeto foi inserido em um repositório do meu GitHub: basta clicar aqui!

Dentro deste repositório eu disponibilizei 3 Notebooks:

🧹 Notebook da Limpeza dos Dados

🤿 Notebook da Análise Exploratória dos Dados

🔮 Notebook das Previsões com Machine Learning

Contexto

Com sua rápida disseminação, a COVID-19 criou uma forte demanda por hospitais e leitos nas UTIs (Unidades de Terapia Intensiva). Esta maior necessidade de recursos hospitalares levou ao colapso dos sistemas de saúde em todo o mundo, o que pode ter contribuído para as maiores taxas de mortalidade relatadas. Em países com sistemas de saúde já sobrecarregados, como é o caso do Brasil, não havia recursos suficientes de equipamentos médicos, medicamentos e pessoal treinado para lidar com o aumento no número de pacientes com COVID-19 que precisavam de suporte hospitalar.

Pensando nisso, o Hospital Sírio Libanês disponibilizou um dataset no Kaggle, contendo informações sobre vários pacientes, com os seguintes objetivos:

  • Prever admissão na UTI de casos confirmados de COVID-19, com base nos dados disponíveis, para fornecer aos hospitais terciários e trimestrais a resposta mais precisa, para que os recursos da UTI possam ser arranjados ou a transferência do paciente possa ser agendada.
  • Prever NÃO admissão à UTI de casos COVID-19 confirmados, para fornecer aos hospitais locais e temporários uma resposta boa o suficiente, para que os médicos de linha de frente possam dar alta com segurança e acompanhar remotamente esses pacientes.

Métodos

Coleta dos dados 🎲

Os dados utilizados neste projeto foram obtidos da base de dados da COVID-19, disponibilizada pelo Hospital Sírio Libanês no Kaggle, e foram armazenados na pasta Data do meu repositório do GitHub.

Após, a etapa de limpeza dos dados, o arquivo final foi salvo na pasta Clean deste repositório.

Nesta base de dados encontramos diversos tipos de informações que foram separadas em 4 grupos:

  • Informações demográficas: 3 variáveis do tipo categórica;
  • Doenças pré-existentes : 9 variáveis do tipo categórica;
  • Resultados do exame de sangue: 36 variáveis, do tipo contínua: quando necessário, expandidas em média, mediana, max, min, diff(max-min) e diff relativa (diff/mediana);
  • Sinais vitais: 6 variáveis do tipo contínua: quando necessário, expandidas em média, mediana, max, min, diff(max-min) e diff relativa (diff/mediana)
  • Neste dataset também temos algumas janelas de tempo na coluna denominada como WINDOW, onde os pacientes foram agregados por janelas em ordem cronológica, que contam a história do paciente após a admissão no hospital:
  • No dataset também temos uma coluna denominada ICU, que corresponde à entrada ou não do paciente na UTI, onde:

0: indica que o paciente não foi para UTI

1: indica que o paciente foi para UTI

Então, foi um critérios obrigatórios neste projeto: não utilizar os dados quando o paciente deu entrada na UTI: ICU = 1, na primeira janela (0–2 horas), pois não sabemos se os dados dos exames de sangue foram coletados antes ou depois do paciente ter sido encaminhado para UTI.

Além disso, somente a janela de 0–2 horas foi utilizada, já que quanto mais cedo a previsão for feita é melhor, tornando-se clinicamente mais relevante.

Após a importação das bibliotecas e dos dados, as seguintes etapas foram realizadas:

  • Limpeza dos Dados
  • Análise Exploratória
  • Análise de Modelos de Machine Learning

Limpeza dos Dados 🧹

As seguintes etapas foram realizadas:

  1. Preenchimento das células vazias das variáveis contínuas: As células com dados nulos que vão da coluna 13 até até a antepenúltima coluna, que correspondem aos resultados de exames de sangue e sinais vitais, foram preenchidas utilizando o método fillna.
  2. Remoção dos pacientes que deram entrada no hospital e foram para a UTI na primeira janela (0–2). Esses dados não contribuem para nosso modelo, pois não sabemos se os dados coletados nessa janela refletem valores de exames feitos antes ou depois do paciente ter dado entrada na UTI.
  3. Manter apenas os dados referentes à janela 0–2 de cada paciente, pois quanto mais cedo a previsão for realizada é melhor para o hospital. Dessa maneira, caso o paciente tenha ido para UTI em qualquer uma das janelas posteriores, o “ICU” = 1 foi aplicado e caso o paciente não tenha ido para UTI nas janelas posteriores, o “ICU” se manteve = 0.
  4. Remoção dos dados nulos que não foram preenchidos nas variáveis categóricas
  5. Remoção das colunas PATIENT_VISIT_IDENTIFIER e WINDOW, pois não são necessárias para testar os modelos:
  6. Transformação dos dados da coluna AGE_PERCENTIL em números inteiros

7. Remoção das colunas altamente correlacionadas, para dar maior fluidez na hora de testar os modelos de Machine Learning e evitar problemas de Overfitting.

Após estas etapas o dataset final ficou assim:

Análise de Modelos de Machine Learning 🔮

Após definir X como todas as 98 colunas contendo as variáveis categóricas e contínuas e Y como a coluna ICU, que é a coluna que queremos prever, o conjunto de dados foi dividido em treinamento e teste e a biblioteca LazyPredict foi utilizada para identificar quais seriam os melhores classificadores possíveis para esses dados:

A tabela abaixo mostra o output do LazyClassifier, onde 29 modelos foram obtidos.

  • Após testar todos os classificadores disponíveis na biblioteca LazyClassifier, vemos que aquele com maior valor de acurácia foi o XGBClassifier.
  • Em seguida, eu testei três classificadores, que apresentaram maiores valores Accuracy, Balanced Accuracy, ROC AUC e F1 Score:
  • XGBClassifier
  • ExtraTreesClassifier
  • LogisticRegression

Além disso, também testei o RandomForestClassifier, que não apresentou um bom desempenho nessa análise, mas que trouxe resultados melhores nas aulas.

  • Os classificadores que apresentaram melhor desempenho foram estudados individualmente, passando por análises de métricas e Cross-Validation.

Quando separamos os dados para Treino e Teste, o efeito de aleatoriedade é muito grande. Então, a escolha do algoritmo passa a ter um nível de incerteza um pouco maior. Portanto, é ideal fazer a divisão dos dados de uma forma mais estratégica, utilizando o Cross-Validation. Usando essa abordagem o conjunto de dados é dividido em várias partes. A cada momento uma parte desses dados será utilizada como teste e o restante como treino, garantindo que todos os dados sejam testados e treinados

  • Dois classificadores se mostraram mais adequados: XGBClassifier e RandomForestClassifier, e a partir deles os hiperparâmetros foram testados, através do GridSearchCV.

No modelo XGBClassifier os seguintes hiperparâmetros foram selecionados pelo GridSearchCV,:

  • colsample_bytree: 0.6
  • gamma: 1
  • max_depth: 4
  • min_child_weight: 1
  • subsample: 1.0

Os hiperparâmetros foram modificados após alguns testes e o modelo final ficou com esses parâmetros:

XGBClassifier(learning_rate=0.02, colsample_bytree=0.6, gamma=1, max_depth=6, min_child_weight=1, subsample = 1.0)

  • O modelo escolhido, por apresentar as melhores métricas, após o ajuste de hiperparâmetros, foi o XGBClassifier.
  • O modelo apresentou, nos dados de teste, 83.10% de acurácia . Portanto, se o paciente realmente precisa de UTI, o modelo tem 82% de chance de acertar. Enquanto isso, no caso do paciente não necessitar de internação em leito de UTI o modelo acerta em 84%. Abaixo podemos ver a matriz de confusão que mostra esses resultados:
Matriz de confusão normalizada do modelo XGBClassifier, que teve o melhores resultados nas métricas

Após analisar o Classification Report desse modelo, é possível observar que:

  • Para valores iguais a 0 (pacientes que não precisam de UTI), possuímos uma precisão de 79% e para valores iguais a 1 (pacientes que precisam de UTI) a precisão é de 83%.

Essa métrica mostra quantos positivos (VP e FP) estão corretos, para ter certeza do que estamos acertando. É ótima para ser analisada quando o falso positivo é pior que o falso negativo.

  • O Recall apresentou um desempenho ótimo para valores iguais a 0 (de 87%) e de 73% para valores iguais a 1.

O Recall mostra a proporção dos Verdadeiros Positivos entre todas as observações que realmente são positivas no seu conjunto de dados. É uma métrica que apresenta maior sensibilidade e representa a capacidade de um modelo em prever a classe positiva.

  • O F1 score nos mostra uma média harmônica entre precisão e recall. Para 0, apresentou 82% e para 1 apresentou 77%.

Pelo F1 é possível ver se a precisão ou recall estão muito baixos.

  • O AUC desse modelo foi de 0.84, sendo um bom resultado. Abaixo vemos a curva ROC do modelo:

A pontuação ROC AUC é extremamente útil, pois mostra o quão bom é o seu modelo nas previsões de classificação. Ele informa qual é a probabilidade de uma instância positiva escolhida aleatoriamente ter uma classificação mais alta do que uma instância negativa escolhida aleatoriamente. É um gráfico que visualiza a compensação entre a taxa de verdadeiro positivo (TPR) e a taxa de falso positivo (FPR). Basicamente, para cada limite, calculamos TPR e FPR e os plotamos em um gráfico. Obviamente, quanto maior o TPR e o menor FPR para cada limite, melhor e, portanto, os classificadores que têm curvas mais no canto superior esquerdo são melhores. Quanto mais alto o valor de AUC (Area Under the Curve), que é a área que está abaixo da curva ROC: melhor está a performance do modelo.

Conclusões

  • Entre as features que os modelos mais deram importância, podemos destacar: LEUKOCYTES_MEDIAN, PCR_MEDIAN, CALCIUM_MEDIAN e AGE_PERCENTIL. A feature LEUKOCYTES_MEDIAN foi uma das principais em três dos quatro modelos testados.

O aumento da contagem total de leucócitos e contagem diferencial de neutrófilos foi mais comumente observado em pacientes com COVID-19 grave (Yuan et al., 2020; Anurag et al., 2020).

A quantidade de vírus que pode ser encontrada através da análise de PCR afeta diretamente o processo inflamatório agudo que ocorre em diferentes tecidos, especialmente os tecidos dos pulmões, vasos sanguíneos e rins, o que contribui para a deterioração do estado do paciente (Martini et al., 2020).

Estudos realizados por Zhou et al., 2020, mostraram que o equilíbrio de cálcio é um golpe primário de COVID-19 e um biomarcador de gravidade clínica no início do início dos sintomas. O cálcio está intimamente associado a lesões em múltiplos órgãos associadas ao aumento de citocinas inflamatórias.

Em pacientes com COVID-19, a idade tem sido apontada como um importante fator de risco para doença mais grave e mortalidade (Zou et al., 2020).

  • Diversos trabalhos têm mostrado que o uso do modelo XGBClassifier traz bons resultados, já que ele possui um algoritmo de árvore impulsionada, para construir o modelo. Sendo assim, esse modelo pode controlar o overfitting seguindo o princípio do aumento de gradiente e usando a formalização de modelo mais regularizado, o que lhe confere um desempenho aprimorado. Esse modelo foi projetado para portabilidade, desempenho e eficiência, o que o torna um método de aprendizado de máquina de última geração para dados tabulares (Friedman, 2001 , Chen & Guestrin, 2016 , Ezz et al., 2021).
  • Estudos anteriores realizados por Ezz e colaboradores (2021) com o mesmo dataset utilizado neste trabalho e com o mesmo modelo (XGBClassifier), porém empregando os dados coletados nas primeiras 12 horas em quatro estágios de acordo com janelas de tempo, mostraram que na primeira janela (0–2 horas) o modelo o atingiu uma AUC de 0.73 e conforme as análises foram feitas nas janelas seguintes, foi observado que o desempenho do modelo melhora, atingindo valores de AUCs de 0.92 (janela de 2–4 horas), 0.95 (janela de 4–6 horas) e 0.97 (janela de 6–12 horas). Desse modo, vemos que o pré-processamento e hiperparâmetros definidos aqui geraram com esse mesmo modelo um AUC de 0.84 na janela inicial (0–2 horas), o que é algo relevante e que pode ser ainda melhorado utilizando essas janelas seguintes.

Considerações finais

  • Será imprescindível tentar melhorar ainda mais estes resultados, tentando utilizar as janelas seguintes à janela inicial de 0–2 horas.
  • Os valores de acertos para falsos negativos e falsos positivos precisam ser melhorados, pois é extremamente ruim, por exemplo, não conceder o leito de UTI para alguém que precisa, mas que foi marcado como falso negativo.
  • Por último, ferramentas como essa, após possuírem alta sensibilidade e desempenho na classificação, precisam ser difundidas para definir qual a necessidade de leitos de UTI nos hospitais, não só para o COVID-19, mas quem sabe para outras doenças — aumentando a excelência no planejamento de recursos e o nível de atendimento ao paciente.

Para finalizar gostaria de deixar meus agradecimentos…

Esse Bootcamp mudou a minha vida e me deu o desejo de reinventar a minha carreira. Foi durante ele que surgiram oportunidades profissionais para migração de área. Sem dúvidas, hoje uma das minhas maiores alegrias é ter entrado no mundo dos Dados.

Gostaria de deixar meu agradecimento a todos os instrutores do Bootcamp: Thiago Gonçalves, Guilherme Silveira, Allan Spadini e Karoline Penteado. Vocês foram incríveis e trouxeram conteúdos maravilhosos, sempre de forma didática.

Aos amigos que fiz nesse Bootcamp e que levarei para vida: Os Bootcampers Carolina Dias e Junior Torres.

Ao Glaudemias Grangeiro, o nosso Rei dos mapas, com quem eu tive muitas discussões sobre os projetos.

Ao João Vitor pelos cafezinhos e por nos dar dicas valiosas sobre como melhorar as apresentações.

Ao pessoal do ScubaTeam e do Discord, que em todos esses meses tiraram dúvidas, trouxeram discussões e ideias muito interessantes

E é claro, obrigada por terem acreditado no meu potencial e pela bolsa de estudos para esse Bootcamp! ❤️

E obrigada a você que passou aqui pra ler ❤️

Em breve novas publicações sobre o mundo dos dados… 🎲

Até mais!

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Valquíria Alencar
Valquíria Alencar

Written by Valquíria Alencar

Data Science & Analytics | Machine Learning | Python | Instrutora de Data Science na Alura

Responses (1)

Write a response