Logo no inÃcio da pandêmia de Covid-19 em 2020 um fator que ficou claro foi a alta demanda de UTIs para o tratamento dos doentes. Sem um tratamento adquado a taxa de mortalidade aumenta de maneira alarmante.
UTIs são unidades médicas extramamente custosas. Por isso é inviavel que se aumente o número de UTIs de maneira indiscrimina. Tendo isso em vista, uma ferramente que consiga prever a necessidade de internação em UTI de um paciente através de dados clinicos seria uma grande ferramenta para atentar ajustar a disponibilidades de UTIs horas antes delas serem realmente necessarias para salvar a vida do paciente.
Este estudo tem como objetivo escolher um modelo de Machine Learning (ML) que consiga prever se um paciente irá precisar ou não de UTI através de dados clÃnicos apenas.
Através dos dados disponibilidados pelo hospital SÃrio-Libanês serão treinados 6 modelos de Machine Learning (ML). Para escolha do melhor modelo foi utlizado a têcnica de validação crusada (Cross Validation), ajuste de hyperparametros (hyperparameter tuning) e seleção de variaveis explicativas (feature selection). Os modelos foram testados em 4 conjutos de variaveis explicativas possiveis.
Os dados brutos foram tirados do projeto do kaggle SÃrio-Libanês. Este dados podem ser ser achados neste repositório no aqui.
A exploração e limpeza dos dados foi feita neste notebook
O tratamento foi basicamente:
- Retirada de pacientes que já foram para UTI na primeira janela de atendimento (0-2h).
- Preenchimento de dados NaN nas colunas das variaveis continuas.
- Descarte de qualquer linha que ainda tenha valores NaN após a etapa 2.
- Manter apenas informoções dos pacientes da primeira janela. Assim temos uma linha por paciente.
- Transformação da colunas AGE_PERCENTIL para numérica.
- Descarte das colunas WINDOW e PATIENT_VISIT_IDENTIFIER.
- Descarte das colunas com variância menor que 0.01.
Os Dados limpos estão no arquivo dados_tratados_por_paciente.csv. Para uma consulta rápida das variaveis neste aquivo pode-se olhar o aquivo dados_tratados_por_paciente_colunas.csv com apenas os nomes da colunas (possÃvel variaveis + o alvo(ICU)).
Temos 4 seleções de variaveis explicativas, são elas:
-
Seleção através da matriz de correlação. O módulo do limiar de correção foi 0.9. Após o procedimentos chegou-se a 41 variaveis explicativas. Chamaremos esse conjuto de dados de df_coor_41.
-
Seleção através da matriz de correlação aliada com a técnica recursive feature elimination (RFE). O limiar de correção foi novamente 0.9 e o modelo usado no RFE foi o LogisticRegression. Um conjuto de 20 e 30 variáveis foram escolhidos. Chamaremos esses conjuto de dados de df_RFE_20 e df_RFE_30
-
Seleção atravez da lib featurewiz. Após o procedimentos chegou-se a 25 variaveis explicativas. Chamaremos esse conjuto de dados de df_featurewiz_25
Foram escolhidos 6 modelos de ML, são eles:
- DummyClassifier (baseline)
- LogisticRegression
- DecisionTreeClassifier
- Random Forest Tree
- Support Vector Machine
- KNeighbors
Para a escolha do melhor modelo foi feita uma busca de hyperparametros. A buscas foi evetuda pelo GridSearchCV ou pelo RandomizedSearchCV. Para a Cross Validation foi usado RepeatedStratifiedKFold com 5 divisões de 10 repetições. O parâmetro utilizado para avaliação do modelo foi a ROC_AUC. A quantidade de falsos negativos (FN) também é uma métrica crÃtica da nosso problema. Um bom modelo tem que ter um ROC_AUC alto e um FN baixo. O FN neste caso significa mandar um paciente que precisaria de UTI para casa, o que pode acarretar a morte do paciente.
Os todos os conjuto de dados (dataset) foram dividos em um dataset para validação cruzada (Cross Validation) e um de validação. A divisão ficou 351 para validação cruzada e 36 para a validação. A escolha do método se deu tanto pela avaliação do desempenho do modelo no conjuto de dados de validação quanto nas métricas médias e desvio padrão dos testes da validação cruzada.
Iniciamentel foi utilização df_coor_41 para uma analise mais manual do treinamento, o que pode se encontrado Neste notebbok. Nele chega-se a conlusão que o melhor modelo é Random Forest Tree com ROC_AUC de 0.78 no dataset de validação e média de 0.81 na validação cruzada.
Após isto, em um outro notebook, foi analisado as outras 3 bases restantes. Nele novamente concluimos que Random Forest Tree é a melhor opção. Além disso a melhor seleção de variaveis foi df_featurewiz_25, ela obteve 0.839 no dataset de validação e 0.817 na média dos teste na validação cruzada
O modelo final excolhido com ja dito foi Random Forest Tree com o conjuto de variveis explicativas do df_featurewiz_25 (lista das variaveis). O modelo foi treinado utilizando todas as 351 amostras neste notebook. O modelo foi salvo em disco com o auxilio da lib joblib no arquivo modelo_final.sav.
Finalmente agora temos um modelo de ML capaz de predizer com um certo grau de acuracia se o paciente irá precisar ao não de UTI apenas com os dados clÃnicos de horas antes. Assim o objetivo do estudo foi cumprido.
- Estrutura de diretorios do repositório:
└──Dados
| ├── Brutos - Dados brutos
| └── Tratrados - Dados Tratados
|
└──Notebooks
| ├── Explaratorios - Notebooks exploatorios e de limpeza
| ├── Seleção_variaveis - Notebbooks de seleção de variaveis
| └── ML - Notebbooks com os treinamentos dos modelos
|
└── src - Arquivos fontes python
|
└── Modelo_ML - Modelos de ML salvos
- Ordem indica de leitura dos notebooks:
- Limpeza e Exploração dos dados
- Seleção de variaveis - Método 1
- Seleção de variaveis - Método 2
- Seleção de variaveis - Método 3
- Primeiro Treinamento na base df_coor_41
- Treinamento com a 4 bases
- Treinamento do modelo final
- Libs utilizadas:
- matplotlib -> 3.3.4
- sklean -> 0.24.2
- pandas -> 1.2.4
- scipy -> 1.6.0
- numpy -> 1.20.2
- sns -> 0.11.1
- freaturewiz -> 0.0.42
- joblib -> 1.0.1