Artigo
· Jun. 7 7min de leitura

Predição de diagnósticos com busca vetorial e aprendizado de máquina

A ideia

Já estamos em 2024, a versão IRIS 2024.1 acabou de sair e estamos todos falando disso aqui. Já temos muitos tutoriais sobre busca vetorial e aplicações de chats de inteligência artificial. Hoje quero propor algo diferente. Quero apresentar uma ideia e explorar todos os seus limites e, ao longo do texto, vou levantar alguns questionamento sobre a capacidade da ferramentas utilizadas para que possamos compreender não só os resultados de as novas funcionalidades, mas também como a máquina as processa.

A ideia é simples: transformar anamneses psicológicas de pacientes em vetores e usá-los com base para o aprendizado de máquina. Dessa maneira, podemos construir uma máquina capaz de discernir se um paciente tem um diagnóstico a partir de sua anamnese.

Para começar, vamos testar com exemplos de anamneses de pacientes autistas e não autistas e criaremos uma base de dados de vetores para treiná-la a distinguir os pacientes com transtorno do espectro autista dos que não o tem.

Para isso, necessitaremos:

  • Uma base de dados de anamneses com e sem o transtorno (há alguns casos disponíveis na internet, e podemos até gerá-los com a ajuda do Google Gemini IA);
  • Um modelo de incorporação Python para transformar as anamneses em vetores;
  •  InterSystems Machine Learning.

O objetivo aqui não é substituir um terapeuta ou psicólogo, mas discutir o poder e os limites das ferramentas InterSystems. E se fizermos isso bem, essa aplicação pode se tornar um acessório para esses profissionais.

 

Passo a passo

1- Transformar o texto em vetores

Primeiro, temos que aprender como fazer a transformação de texto cru para vetores.
Seguindo o tutorial da documentação InterSystems, devemos escolher um módulo Python que tenha um bom modelo para o tipo de texto que vamos transformar.

Além da sugestão da documentação, quero adicionar a recomendação de usar a função Word2Vec da livraria Gensim, como no código abaixo. Deixo também dois links que a explicam como mestres: Text Vectorization Using Python: Word2Vec e Word2Vec — Skip-Gram (esse último é mais por curiosidade, achei muito interessante).

# importar as livrarias
import gensim
from gensim.models import Word2Vec, KeyedVectors
import pandas as pd 

# uma função para tratar o texto
import re
def remove_prepositions(text):
    prepositions = ['his', 'he', 'she', 'her', 'hers','it','about', 'above', 'across', 'after', 'against', 'along', 'among', 'around', 'at', 'before', 'behind', 'below', 'beneath', 'beside', 'between', 'beyond', 'but', 'by', 'concerning', 'considering', 'despite', 'down', 'during', 'except', 'for', 'from', 'in', 'inside', 'into', 'like', 'near', 'of', 'off', 'on', 'onto', 'out', 'outside', 'over', 'past', 'regarding', 'round', 'since', 'through', 'throughout', 'till', 'to', 'toward', 'under', 'underneath', 'until', 'up', 'upon', 'with', 'within', 'without']
    pattern = r'\b(' + '|'.join(prepositions) + r')\b\s*'
    text = re.sub(pattern, '', text, flags=re.IGNORECASE)
    return text

# transformar o texto em um pandas dataframe
with open('./texts/tea-adult.txt', 'r') as f:
    f = remove_prepositions(f.read())
    lines = f.split('\n')

data = pd.DataFrame(list(zip(lines))) 
data.columns = ['anamnesis']

anamnesis_new=data.anamnesis.apply(gensim.utils.simple_preprocess)

# parametros do modelo
model=gensim.models.Word2Vec(window=5, min_count=2, workers=4, sg=0)

# treinar o modelo
model.build_vocab(anamnesis_new, progress_per=1000)
model.train(anamnesis_new, total_examples=model.corpus_count, epochs=model.epochs)

# salvar o modelo treinado
model.save("./anamnesis.model")

Eu escolhi tratar o texto nesse caso usando uma simples função que encontrei numa rápida pesquisa, porque se retirarmos preposições e outras palavras que não têm relação com assuntos específicos, resulta uma melhor performance da máquina, Isso é porque assim o texto é menor. 

Aqui deixo minhas primeiras perguntas:

  • É melhor pré processar o texto eliminando preposições e outras palavras sem significado próprio antes de transformá-la em vetor?
  • Uma máquina não tem o conceito de semântica. Assim, essa manobra assume que não há perdas de significado para o computador. Essa conclusão é verdadeira? 

 

2- Criar a base de dados com os vetores em IRIS

Não quero ocupar muito do seu tempo aqui porque a documentação InterSystems já explicou essa parte muito bem.

Em resumo, temos que criar uma tabela com uma coluna para os embeddings (incorporações) e um UID que faz referência à parte do texto original correspondente. Então adicionamos cada incorporação texto-vetor e seu UID na tabela, conforme código abaixo. 

INSERT INTO Sample.Embeddings (Embedding, UID) 
   VALUES (TO_VECTOR(?,double), ?)

Se escolher usar o Word2Vec, a lista de incorporações (embeddings) pode ser extraída do modelo salvo em "./anamnesis.model" no exemplo anterior.

Fica uma outra pergunta: o que você já usou para fazer incorporações de texto em vetor? O que te fez escolher essa ferramenta?

 

 

3- Usar o InterSystems IRIS ML para treinar a tabela

Agora que temos a tabela com os vetores, podemos adicionar uma coluna que diz se a incorporação veio de uma anamnese de autista ou não. Seguindo outra vez a ótima documentação InterSystems sobre esse assunto, criamos um modelo de predição a partir dessa tabela.

CREATE MODEL AnamnesiaAutistaModel PREDICTING (es_autista) FROM AnamnesiaAutista


Treinamos o modelo

TRAIN MODEL AnamnesiaAutistaModel


E o validamos com algumas anamneses que ainda não usamos

VALIDATE MODEL AnamnesiaAutistaModelo From AnamnesiaTeste

Por fim, podemos fazer a predição em novos dados.

SELECT *, PREDICT(AnamnesiaAutistaModel) FROM NuevasAnamnesias

 

Análise matemática da solução

Solucção 1: Utilizando InterSystems IntegratedML para implementar todo o descrito anteriormente, aplicamos um modelo de floresta aleatória para classificar como positivo ou negativo um caso de autismo, baseando-nos no conhecimento que proporcionamos ao computador. É evidente que, com a colaboração de um psicólogo no projeto, podemos agregar, além das anamneses, uma lista de sintomas de autismo e treinar ainda mais a máquina para obter melhores resultados.
Desta maneira, o computador toma uma decisão baseando-se em números que representam medidas de relação entre palavras. Se essas relações são similares às dos dados utilizados na tabela para treinar a máquina, esta decide que o diagnóstico é positivo.

Considero que isso funcionaria melhor se atribuirmos pesos a estas medidas em função de sua relação com a palavra "autismo". Uma forma simples de conseguir isso seria combinar a ferramenta com a busca vetorial antes que a máquina tome a decisão final. Seguindo o exemplo com Gensim:

similarity = model.wv.similarity(w1='autism',w2='sociability')


Nesse caso, se o computador decide por positivo, mas a semelhança é baixa, a decisão final será negativa.

 

Solução 2: Outra opção seria realizar somente uma busca vetorial em nossa tabela de incorporações. Neste caso, poderíamos ter utilizado uma similaridade de cosseno ou ponto produto para obter um valor de similaridade suficiente (por exemplo, um valor p de 0.05) que nos indicaria se se trata de um caso de autismo ou não. 

Portanto, surgem as seguintes duas perguntas finais:

  • Para um modelo de aprendizagem automático, a vantagem de usar um vetor no lugar de um texto é evidente em termos de rendimento, já que estamos manejando números, que são mais próximos à linguagem de máquinas que as palavras. Isto nos permite omitir alguns passos que a máquina teria que realizar. Entretanto, a qualidade do resultado é a mesma?
  • Se os resultados de ambas as soluções forem similares, a busca vetorial poderia ser usada como base para a aprendizagem automática e a predição? Em que casos seria mais apropriado utilizar um enfoque ou outro?

 

O futuro desta proposta

Uma base de dados desse tipo também poderia ser utilizada para pesquisas e descobrir novas semelhanças em todo tipo de diagnósticos. Se forem adicionados detalhes sobre o estilo de vida dos pacientes para além dos sintomas, a máquina poderia realizar uma análise pragmática e gerar novas hipóteses para pesquisas que poderiam confirmar se o computador interpretou corretamente as relações entre os comportamentos e os diagnósticos.

Discussão (0)1
Entre ou crie uma conta para continuar