Artículo
· 2 jun, 2024 Lectura de 6 min

Predicción de diagnósticos con Vector Search y Machine Learning

La idea

Ya estamos en 2024, la version IRIS 2024.1 acaba de salir y todos estamos hablando de ello aquí. Ya tenemos muchos tutoriales sobre búsqueda vectorial y aplicaciones de chats de inteligencia artificial. Hoy quiero proponer algo diferente. Quiero presentar una idea y explorar todos sus límites, y a lo largo del texto plantearé algunas preguntas sobre la capacidad de las herramientas utilizadas, para que luego podamos comprender no solo los resultados de las nuevas funcionalidades, sino también cómo la máquina las procesa.

La idea es simple: transformar anamnesias psicológicas de pacientes en vectoresy utilizarlos como base para el aprendizaje automático.
De esta manera, podemos construir una máquina capaz de discernir si un paciente tiene un diagnóstico a partir de su anamnesia.

Para comenzar, probaremos con ejemplos de anamnesias de pacientes autistas y no autistas y crearemos una base de datos de vectores para entrenarla a distinguir a los pacientes con trastorno del espectro autista de aquellos que no lo tienen. 

Para ello necesitaremos:

- Una base de datos de anamnesias de pacientes con y sin el trastorno (hay algunos casos disponibles en internet, incluso podemos generarlos nosotros mismos con la ayuda de Google Gemini IA)
-Un modelo de incorporación en Python para transformar las anamnesias en vectores;
- InterSystems Machine Learning.

El objetivo acá no és substituir un terapeuta o psicólogo, pero discutir el poder y los límites de las herramientas InterSystems. Y si lo hacemos bién, esa aplicación puede tornarse un acesorio para esos profesionales.

 

Paso a paso

1- Transformar el texto en vectores

Primero tenemos que aprender cómo hacer la transformación de texto crudo para vectores. 
Siguiendo el tutorial de la documentación InterSystems, debemos elegir a un modulo Python que tenga un buén modelo para el tipo de texto que vamos a transformar. 

Además de la sugerencia de la documentación, quiero añadir la sugestión de usar la función Word2Vec de la librería Gensim, como en el codigo abajo.
Dejo también dos sítios que la explican cómo maestro: Text Vectorization Using Python: Word2Vec y Word2Vec — Skip-Gram (ese último és más por curiosidad, lo vi muy interesante).

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

# una función para tratar el 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 el texto en un 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 de lo modelo
model=gensim.models.Word2Vec(window=5, min_count=2, workers=4, sg=0)

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

# salvar el modelo entrenado
model.save("./anamnesis.model")

 Yo elegí tratar el texto en ese caso usando una simple función que encontré en una rápida busqueda, porque si retiramos preposiciones y otras palabras que no tienen relación con asuntos específicos, resulta una mejor actuación y rendimiento de la máquina. Eso es porque así el texto es menor.

Acá dejo mis premeras preguntas: 

  • ¿Es mejor preprocesar el texto eliminando preposiciones y otras palabras irrelevantes antes de transformarlo en vectores?
  • una máquina no tiene el concepto de semántica. Así que esa maniobra asume que no hay pérdidas de significado para la computadora. ¿Esa suposición es engañosa?

 

Crear la base de datos con los vectores en IRIS

No quiero ocupar mucho de tu tiempo acá porque la documentación InterSystems ya explicó esa parte muy bien. 

En resumen, tenemos que crear una tabla con una columna para los embeddings, y un UID que hace referencia a lo texto original. Ahí, adicionamos cada incorporación texto-vector y su UID en la tabla:

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

 

Si eliges usar el Word2Vec, la lista de incorporaciónes (embeddings) puede ser extraída de lo modelo salvado en "./anamnesis.model" en el ejemplo arriba.

Una otra pregunta: que has usado para hacer las incorporaciónes de texto en vector? Por qué la eligiste? 

Usar el InterSystems IRIS ML para entrenar la tabla

Ahora que tenemos la tabla con los vectores, podemos agregar una columna que dice si la incorporación vino de una anamnesia de autista o no. 
Siguiendo otra vez la buenisima documentación InterSystems en ese asunto, creamos un modelo de predicción desde esa tabla.

CREATE MODEL AnamnesiaAutistaModel PREDICTING (es_autista) FROM AnamnesiaAutista

Lo entrenamos

TRAIN MODEL AnamnesiaAutistaModel

Y lo validamos con algunas anamnesias que aún no usamos.

VALIDATE MODEL AnamnesiaAutistaModelo From AnamnesiaTeste

 

Por fin, podemos hacer la predicción en nuevos datos..

SELECT *, PREDICT(AnamnesiaAutistaModel) FROM NuevasAnamnesias

 

Análisis matematica de la solución

Solución 1: Usando InterSystems IntegratedML para hacer todo lo descrito arriba, aplicámos un modelo de bosque randomico para decidir positivo o negativo para un teste de autismo, con base en el conocimiento que pasámos para la computadora. Obvio que con un psicologo en el projeto podemos añadir, además de las anamnesias, una lista de síntomas de autismo y enseñar aún más la máquina para tener resultados mejores. 
Así, la computadora hace una decisión con base en números que representan medidas de relación entre palabras. Si esa relación es semejante a de los datos usados en la tabla usada para entrenar la máquina, ella decide que el diagnostico es positivo.
Creo que eso funciona mejor si ponemos pesos en esas medidas según la relación con la palabra autismo. Podemos lograr eso combinando la herramienta con la búsqueda vectorial antes de efectivar la decisión de la máquina. Siguiendo el ejemplo con Gensim:

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

Entonces si l computadora decide por sí, pero esa semejanza es baja, la decisión queda no.

Solución 2: Otra opcíon era solo hacer una búsqueda vectorial en nuestra tabla de incorporaciónes. Ahí tendríamos usado una semejanza de coseno o producto punto y llegar a una semejanza suficiente (algo cómo un p valor 0.05) que nos dice si és un caso de autismo o no. 

Así que tenemos las dos preguntas finales:

  • Para un modelo de aprendizaje de máquina, el benefício en usar un vector en el lugar de un texto es obvio en términos de actuación y rendimiento, porque esatmos usando números, que es más próximo de la lenguaje de máquina, entonces saltamos algunos pasos que lá máquina tendría que hacer. ¿Pero el resultado es bueno por igual?
  • Si los resultados en las dos soluciones es próximo, ¿la busqueda vectorial puede ser usada cómo base para aprendizaje de máquina y predicción? ¿En qué casos es más adecuado utilizar un enfoque u otro?

 

El futuro

Una base de datos com o esa también puede ser usada para pesquisas y encontrar nuevas similitudes en todo tipo de diangóstico.  Si añadimos detalles acerca del estilo de vida de los pacientes además de sintomas, la máquina puede ser capaz de hacer un análisis pragmático y traer nuevas hipótesis para pesquisas que pueden confirmar si la computadora he interpretado bién las relaciones entre los comportamientos y los diagnósticos. 

Comentarios (0)1
Inicie sesión o regístrese para continuar