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

Predicción de diagnósticos con búsqueda vectorial y aprendizaje de máquina

La idea

Ya estamos en 2024, la versión 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 las anamnesias psicológicas de los pacientes en vectores y 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 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 del 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 primeras 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? 

 

2- 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.

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

 

3- 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 a partir de 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: Utilizando InterSystems IntegratedML para implementar todo lo descrito anteriormente, aplicamos un modelo de bosque aleatorio para clasificar como positivo o negativo un caso de autismo, basándonos en el conocimiento que proporcionamos a la computadora. Es evidente que, con la colaboración de un psicólogo en el proyecto, podemos agregar, además de las anamnesias, una lista de síntomas de autismo y entrenar aún más a la máquina para obtener mejores resultados.
De esta manera, la computadora toma una decisión basándose en números que representan medidas de relación entre palabras. Si estas relaciones son similares a las de los datos utilizados en la tabla para entrenar la máquina, esta decide que el diagnóstico es positivo.

Considero que esto funcionaría mejor si asignamos pesos a estas medidas en función de su relación con la palabra "autismo". Una forma sencilla de lograrlo es combinar la herramienta con la búsqueda vectorial antes de que la máquina tome la decisión final. Siguiendo el ejemplo con Gensim:

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


En ese caso, si la computadora decide por positivo, pero la semejanza es baja, la decisión final será negativa."

 

Solución 2: Otra opcíon era realizar solo una búsqueda vectorial en nuestra tabla de incorporaciónes. En este caso, hubiéramos utilizado una similitud de coseno o producto punto para obtener un valor de similitud suficiente (por ejemplo, un valor p de 0.05) que nos indicaría si se trata de un caso de autismo o no. 

Por lo tanto, surgen las siguientes dos preguntas finales:

  • Para un modelo de aprendizaje automático, la ventaja de usar un vector en lugar de un texto es evidente en términos de rendimiento, ya que estamos manejando números, que son más cercanos al lenguaje de las máquinas que las palabras. Esto nos permite omitir algunos pasos que la máquina tendría que realizar. Sin embargo, ¿la calidad del resultado es la misma?
  • Si los resultados de ambas soluciones son similares, ¿se puede utilizar la búsqueda vectorial como base para el aprendizaje automático y la predicción? ¿En qué casos sería más apropiado utilizar un enfoque o otro?

 

El futuro de esta propuesta

Una base de datos de este tipo también podría utilizarse para investigaciones y descubrir nuevas similitudes en todo tipo de diagnósticos. Si se añaden detalles sobre el estilo de vida de los pacientes, además de los síntomas, la máquina podría realizar un análisis pragmático y generar nuevas hipótesis para investigaciones que podrían confirmar si la computadora ha interpretado correctamente las relaciones entre los comportamientos y los diagnósticos.

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