Exemplo do FHIR e IntegratedML
Exemplo de uso do banco de dados FHIR InterSystems IRIS for Health para efetuar modelagem ML através do InterSystems IRIS IntegratedML
Descrição
IntegratedML é uma ótima funcionalidade para treino/teste e implantação de modelos ML. FHIR é um padrão poderoso para a interoperabilidade de informações da saúde. Esse projeto visa mostrar como utilizar as ferramentas IRIS/IRIS for Health. Por exemplo, as transformações DTL para preparar dados do FHIR para aplicação de modelos ML dentro do IntegratedML. Aqui estão algumas potenciais aplicações das ideias apresentadas nesse projeto:
- Reutilização e extensão de transformações DTL dentro de outras bases de dados FHIR para modelos ML personalizados
- Utilização das transformações DTL para normalizar mensagens FHIR e publicar modelos ML como serviços
- Criação de um referencial de modelos e regras de transformação para usar em qualquer conjunto de dados FHIR


Instalação
Clone o repositório em um diretório local:
$ git clone https://github.com/jrpereirajr/fhir-integratedml-example.gitAbra o terminal nesse repositório e execute:
$ cd fhir-integratedml-example
$ docker-compose up -dSe quiser obter um log do que aconteceu durante a instalação, utilize o seguinte comando :
$ docker-compose up -d > build-log.txt 2>&1Inicialização de um terminal IRIS
Para inicializar um terminal IRIS, siga esses passos:
Em um terminal powershell/cmd, execute:
docker exec -it fhir-integratedml-example_iris_1 bashDentro do shell do linux , crie uma sessão IRIS:
irissession irisDemonstração
Para demonstrar o conceito do projeto, foram configurados dois modelos:
- Um modelo de predição de não-comparecimento à uma consulta;
- Um modelo de predição de insuficiência cardíaca.
Primeiro, conjuntos de dados de treinamento foram usados para gerar recursos FHIR sintéticos. Esses conjuntos de dados continham informações sobre pacientes, patologias, observações, consultas e visitas enviadas aos pacientes, representadas por diversos recursos FHIR. Essa etapa emula um banco de dados FHIR real, no qual as previsões de não-comparecimento e insuficiência cardíaca podem ser aplicadas.
Quando o banco de dados FHIR estiver pronto para uso, os dados devem ser transformados, combinando recursos FHIR que são pertinentes ao problema, em tabelas únicas. Essa combinação de FHIR é obtida por transformações DTL, como NoShowDTL e HeartFailureDTL :

Como as transformações DTL podem ser exportadas/importadas, é possível compartilhar os modelos ML aplicados aos dados FHIR. Essas transformações podem igualmente ser entendidas por outras equipes, se necessário.
Depois de aplicar as transformações DTL, os recursos FHIR são mapeados em linhas simples, criando também tabelas que podem ser utilizadas para formar modelos ML para as previsões de não-comparecimento e insuficiência cardíaca.
Para treinar e testar os modelos usando o IntegratedML, utilize as seguintes instruções SQL. Eles são executadas durante a instalação, mas você pode executá-los novamente e experimentar o IntegratedML por conta própria.
Modelo de não-comparecimento
-- criar um conjunto de dados de treinamento CREATEORREPLACEVIEW PackageSample.NoShowMLRowTraining ASSELECT * FROM PackageSample.NoShowMLRow WHEREID < 1800-- criar um conjunto de dados de testeCREATEORREPLACEVIEW PackageSample.NoShowMLRowTest ASSELECT * FROM PackageSample.NoShowMLRow WHEREID >= 1800-- evitar os erros no comando CREATE MODEL; ignore qualquer erro aquiDROPMODEL NoShowModel
-- um modelo IntegratedML para a coluna de previsão noShow (não-apresentação) é criada a partir de outros modelos, utilizando o conjunto de dados PackageSample.NoShowMLRowTraining para a etapa de treinamento; o parâmetro "Semente" (seed) aqui destina-se à assegurar a reprodutibilidade dos resultados.CREATEMODEL NoShowModel PREDICTING (Noshow) FROM PackageSample.NoShowMLRowTraining USING {"seed": 6}
-- o modelo é treinado, conforme definido no comando de criação de um modelo "CRIAR UM MODELO"
TRAIN MODEL NoShowModel
-- as informações sobre o modelo treinado são exibidas, como por exemplo o modelo ML selecionado pelo IntegratedMLSELECT * FROM INFORMATION_SCHEMA.ML_TRAINED_MODELS
-- a função de previsão (PREDICT) é utilizada para ver como usar o modelo nas intruções SQLSELECT top 10 PREDICT(NoShowModel) AS PredictedNoshow, Noshow AS ActualNoshow FROM PackageSample.NoShowMLRowTest
-- uma validação em um conjunto de dados de teste é efetuado e as métricas de performance do modelo são calculadasVALIDATEMODEL NoShowModel FROM PackageSample.NoShowMLRowTest
-- as métricas de performance são exibidasSELECT * FROM INFORMATION_SCHEMA.ML_VALIDATION_METRICS
Modelo de insuficiência cardíaca
-- criar um conjunto de dados de treinamentoCREATEORREPLACEVIEW PackageSample.HeartFailureMLRowTraining ASSELECT DEATHEVENT,age,anaemia,creatininephosphokinase,diabetes,ejectionfraction,highbloodpressure,platelets,serumcreatinine,serumsodium,sex,smoking,followuptime FROM PackageSample.HeartFailureMLRow WHEREID < 200-- criar um conjunto de dados de testeCREATEORREPLACEVIEW PackageSample.HeartFailureMLRowTest ASSELECT DEATHEVENT,age,anaemia,creatininephosphokinase,diabetes,ejectionfraction,highbloodpressure,platelets,serumcreatinine,serumsodium,sex,smoking,followuptime FROM PackageSample.HeartFailureMLRow WHEREID >= 200-- evitar os erros no comando CREATE MODEL; ignorar todo erro aquiDROPMODEL HeartFailureModel
-- as informações sobre o modelo formado são exibidas, como por exemplo o modelo ML selecionado pelo IntegratedMLCREATEMODEL HeartFailureModel PREDICTING (DEATHEVENT) FROM PackageSample.HeartFailureMLRowTraining USING {"seed": 6}
-- o modelo é treinado, conforme definido no comando de criação de um modelo "CRIAR UM MODELO"
TRAIN MODEL HeartFailureModel
-- as informações sobre o modelo treinado são exibidas, como por exemplo o modelo ML selecionado pelo IntegratedMLSELECT * FROM INFORMATION_SCHEMA.ML_TRAINED_MODELS
-- a função de previsão (PREDICT) é utilizada para ver como usar o modelo nas intruções SQLSELECT top 10 PREDICT(HeartFailureModel) AS PredictedHeartFailure, DEATHEVENT AS ActualHeartFailure FROM PackageSample.HeartFailureMLRowTest
-- uma validação em um conjunto de dados de teste é efetuado e as métricas de performance do modelo são calculadasVALIDATEMODEL HeartFailureModel FROM PackageSample.HeartFailureMLRowTest
-- as métricas de performance são exibidasSELECT * FROM INFORMATION_SCHEMA.ML_VALIDATION_METRICSA última instrução SQL pode indicar os parâmetros de performance da classificação:


A mesma transformação pode ser aplicada para transformar os recursos FHIR provenientes dos sistemas externos através de uma API REST, por exemplo (veja o código):


Solução de problemas
Se você tiver erros durante as requisições API, indicando que o modelo não existe, é provável que alguma coisa anormal se produziu durante a criação do contêiner para os modelos de treinamento. Tente executar o método de treinamento novamente. Abra o terminal IRIS e execute:
ZN"FHIRSERVER"Do##class(PackageSample.Utils).TrainNoShowModel()
Do##class(PackageSample.Utils).TrainHeartFailureModel()
Referências
Recursos FHIR utilizados como modelos: ttp://hl7.org/fhir/
Conjunto de dados para a formação de modelo de não-comparecimento: IntegratedML templat
Conjunto de dados para a formação de modelo de insuficiência cardíaca: kaggle