Métodos de Regresión y Bayesianos en la Elicitación Moderna de Preferencias

Métodos de Regresión y Bayesianos en la Elicitación de Preferencias

Aplicación a la preparación de batidos simples

Foto de Denis Tuksar en Unsplash

La regresión lineal se considera a menudo la piedra angular de la modelización predictiva, sin embargo, su aplicación se extiende más allá de tareas predictivas sencillas. Este artículo busca enriquecer el diálogo sobre las técnicas de regresión al presentar la Regresión Lineal Probit como una herramienta eficaz para modelar preferencias. Además, empleamos un marco bayesiano para hacer la transición de la regresión lineal clásica a la regresión lineal bayesiana, elucidando la relación intrínseca entre la optimización basada en costos, específicamente la minimización de la pérdida de entropía cruzada binaria (BCE), y la estimación de la máxima verosimilitud.

Al hacerlo, nuestro objetivo es demostrar que la regularización se puede considerar una forma de selección previa bayesiana, lo que une los enfoques de función de costo con el razonamiento probabilístico.

Finalmente, discutiremos cómo la Regresión Lineal Bayesiana permite no solo estimaciones puntuales, sino que también proporciona una distribución sobre estas predicciones, ofreciendo una perspectiva más rica y consciente de la incertidumbre.

El marco bayesiano

El marco bayesiano identifica dos componentes principales: los datos D y el modelo w. Al especificar la verosimilitud P(D∣w) y una previa sobre el modelo P(w), nuestro objetivo es encontrar el modelo que maximice la posterior P(w∣D), derivada a través del teorema de Bayes como:

En el aprendizaje de preferencias, tener una distribución sobre w ofrece la ventaja de capturar la incertidumbre inherente a las preferencias humanas, proporcionando no solo una única “mejor conjetura”, sino un rango de modelos plausibles.

El problema de la obtención de preferencias

La obtención de preferencias es un componente clave en la teoría de decisiones, con el objetivo de identificar las elecciones de un tomador de decisiones basadas en los datos disponibles. En este estudio, abordamos el problema de la obtención de preferencias ajustando un modelo a un conjunto parcial de preferencias. En nuestro caso, las preferencias se expresan en su forma más sencilla: comparaciones por pares. Para ilustrar este concepto, consideremos un conjunto de frutas, denotadas por F, que incluye manzana, plátano, naranja, lichi y mango.

En nuestro contexto, el conjunto de alternativas A consiste en todos los batidos posibles que se pueden crear utilizando uno o varios ingredientes del conjunto F.

El usuario expresa sus preferencias a través de un conjunto de pares ordenados (A,B), donde A es estrictamente preferido sobre B.

La siguiente sección de este artículo presentará la familia de funciones elegidas específicamente para capturar las preferencias del usuario: funciones aditivas. Estas construcciones matemáticas proporcionan un marco sencillo pero robusto para comprender cómo diferentes factores contribuyen a las preferencias de un individuo, lo que permite una modelización efectiva de las elecciones expresadas a través de comparaciones por pares.

Modelos aditivos

El modelo aditivo lineal es el modelo más sencillo que se puede utilizar para capturar las preferencias del usuario.

El modelo lineal aditivo

Un modelo de utilidad aditivo es aquel que asigna un peso específico a cada ingrediente individual en nuestro conjunto. La utilidad general o “gustabilidad” de un batido se calcula sumando los pesos de sus ingredientes constituyentes. Formalmente, dado un vector de pesos

La utilidad de un batido hecho a partir de un subconjunto A de ingredientes es:

Donde I es la función identidad que prueba si estoy en A o no.

El modelo aditivo con interacciones binarias

El modelo 2-aditivo se basa en el modelo 1-aditivo al introducir una capa adicional de complejidad. No solo el vector de pesos contiene un peso para cada ingrediente individual, sino que también incluye pesos para cada posible par de ingredientes. Esto permite que el modelo capture sinergias entre pares de frutas, reconociendo efectivamente cómo la combinación de dos ingredientes puede influir en la utilidad general. Formalmente, el vector de pesos w se extiende para incluir pesos para cada par (i, j) además de los individuales:

Y con el modelo lineal 2-aditivo, la utilidad de un batido se da por:

Donde F² es el conjunto de individuales y pares.

El modelo n-aditivo

Extendiendo aún más el concepto, el modelo n-aditivo ofrece un marco de utilidad altamente flexible. En este modelo, el vector de pesos no solo tiene en cuenta los ingredientes individuales y los pares, sino que también se extiende para incluir pesos para cualquier subconjunto de hasta n ingredientes. Esta generalización permite que el modelo capture relaciones intrincadas y sinergias entre múltiples ingredientes simultáneamente.

Formalmente, el vector de pesos w se expande para incluir pesos para todas las combinaciones posibles de hasta n ingredientes:

Este modelo n-aditivo puede capturar toda la gama de interacciones entre ingredientes, lo que lo convierte en una herramienta extremadamente poderosa para comprender estructuras de preferencia complejas.

Para fines de este análisis, nos limitaremos a modelos 2-aditivos, ya que creemos que la complejidad de las relaciones de preferencia entre ingredientes es poco probable que supere las interacciones de pares.

Aprendiendo las preferencias mediante la resolución de un problema de regresión Probit

Mientras que los modelos de regresión tradicionales producen predicciones de valores reales, nuestro objetivo es predecir una relación de preferencia binaria.

Para lograr esto, modificamos nuestro modelo de regresión para producir la probabilidad de que la opción A sea preferida sobre la opción B. Luego, derivamos una función de costo adecuada para ajustar eficazmente este modelo probabilístico a nuestros datos.

Una forma clásica de comprimir un valor entre 0 y 1 es mediante el uso de la función Probit. La función Probit se define de la siguiente manera:

La siguiente figura ilustra su forma:

Forma de la función Probit (por mí)

Al aplicar esta función a la diferencia entre f(A) y f(B), nuestro modelo producirá una probabilidad cercana a 1 si f(A) supera significativamente a f(B). Por el contrario, producirá una probabilidad cercana a 0.5 si f(A) es aproximadamente igual a f(B).

Así, el problema de elicitación de preferencias se puede reformular como la búsqueda de un vector de pesos óptimo w tal que:

Pérdida de entropía cruzada binaria (BCE)

La pérdida de entropía cruzada binaria (BCE), también conocida como pérdida logarítmica, sirve como métrica de rendimiento para modelos de clasificación que producen probabilidades que van de 0 a 1, típicamente utilizada en tareas de clasificación binaria. Matemáticamente, dadas las etiquetas verdaderas y (ya sea 0 o 1) y las probabilidades predichas p, la BCE se define como:

Generación de datos de juguete

Para validar nuestros métodos, introducimos un protocolo para generar datos sintéticos.

El proceso comienza muestreando aleatoriamente un vector de pesos w. Luego, establecemos algunos de sus parámetros en cero, para introducir una capa de realismo y simplicidad.

Operando bajo la suposición de que las preferencias del usuario se alinean con esta función muestreada, podemos emplearla como punto de referencia para evaluar la precisión de nuestro modelo predictivo.

def singletons_and_pairs(lst):    singletons = [(x,) for x in lst]    pairs = list(combinations(lst, 2))    return singletons + pairsingredients = ["o", "a", "b","l", "m"]model = singletons_and_pairs(ingredients)w = np.random.normal(0, 1, size = (len(model),))p = np.random.randint(0, 2, size = (len(model),))w = w * p

Luego codificamos cada alternativa con un vector binario donde los componentes están en el mismo orden que los parámetros del modelo utilizando la siguiente función:

def vectorize_smoothie(smoothie):    arr = np.zeros(len(model))    print(list(smoothie))    for i in range(arr.shape[0]):        if all(j in list(smoothie) for j in model[i]):            arr[i] = 1    return arr

Luego, para evaluar un batido en particular, utilizamos un producto:

vectorize_smoothie("oa") @ w# Devuelve w_a + w_o + w_oa

Para construir nuestro conjunto de datos, comenzamos muestreando un vector de pesos w. A continuación, generamos un conjunto de batidos y evaluamos cada uno en función de los pesos muestreados. Para cada par de batidos A y B donde f(A)>f(B), agregamos una preferencia correspondiente a nuestro conjunto de datos. Cada preferencia entre A y B se captura en un vector, definido de la siguiente manera:

Para cada par A,B donde f(A) > f(B), agregamos dos filas v(A,B) y v(B,A), la primera etiquetada con la clase 1 y la segunda con la clase 0.

El siguiente código nos proporciona un conjunto de datos sobre n batidos.

def sample_dataset(n):    ingredients = ["o", "a", "b","l", "m"]    model = singletons_and_pairs(ingredients)    X = []    y = []    w = sample_w(model)    subsets = set()    while len(subsets) != n:        s = random_subset(ingredients)        subsets.add(s)    subsets = list(subsets)    for i in range(len(subsets)-1):        x_i = vectorize_smoothie(subsets[i])        for j in range(i+1, len(subsets)):            x_j = vectorize_smoothie(subsets[j])            x1 = x_i - x_j            x2 = x_j - x_i            if f(subsets[i], w) == f(subsets[j], w):                continue            if f(subsets[i], w) > f(subsets[j], w):                X.append(x1)                X.append(x2)                y.append(1)                y.append(0)                continue            if f(subsets[i], w) < f(subsets[j], w):                X.append(x1)                X.append(x2)                y.append(0)                y.append(1)                continue    X = np.array(X)    y = np.array(y)    return X,y,w,model

La resolución basada en costos

Una forma de resolver el problema es utilizando la convexidad de la función de pérdida de BCE y una biblioteca como Torch.

Comenzamos envolviendo los datos generados en los Cargadores de Conjuntos de Datos adecuados proporcionados por PyTorch.

X,y,w,model = sample_dataset(30)X_tensor = torch.FloatTensor(X)y_tensor = torch.FloatTensor(y)dataset = TensorDataset(X_tensor, y_tensor)train_size = int(0.3 * len(dataset))test_size = len(dataset) - train_sizetrain_dataset, test_dataset = random_split(dataset, [train_size, test_size])train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)test_loader = DataLoader(dataset=test_dataset, batch_size=1, shuffle=False)

Ahora, creamos un modelo lineal simple

class BinaryClassifier(nn.Module):    def __init__(self, input_dim):        super(BinaryClassifier, self).__init__()        self.fc1 = nn.Linear(input_dim, 1)            def forward(self, x):        x = torch.sigmoid(self.fc1(x))        return x

Y lo entrenamos utilizando las funcionalidades de autograd de PyTorch.

input_dim = X.shape[1]model = BinaryClassifier(input_dim)# Loss y optimizadorcriterion = nn.BCELoss()optimizer = optim.Adam(model.parameters(), lr=0.01)losses = []# Entrenar el modeloepochs = 200for epoch in range(epochs):    for batch_idx, (data, target) in enumerate(train_loader):        optimizer.zero_grad()        output = model(data).squeeze()        loss = criterion(output, target)        loss.backward()        optimizer.step()

Luego probamos el modelo obtenido utilizando el conjunto de datos de prueba

model.eval()with torch.no_grad():  correct = 0  total = 0  for data, target in test_loader:    output = model(data).squeeze()    predicted = (output > 0.5).float()    total += target.size(0)    correct += (predicted == target).sum().item()  acc = correct / total  accuracy.append(acc)if (epoch+1) % 50 == 0:  print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')  print(f'Precisión en la prueba: {100 * correct / total:.2f}%')

Con el 20% de los datos utilizados para el entrenamiento, obtuvimos aproximadamente un 98.32% de precisión, lo cual no está nada mal.

La Estimación de Máxima Verosimilitud (MLE)

Un método alternativo para abordar el desafío de la regresión probit implica formular explícitamente la verosimilitud de los datos dados un vector de pesos w.

Comenzamos asumiendo que el modelo produce una probabilidad p que indica que A es preferido sobre B. La distribución predictiva para este escenario se expresa de la siguiente manera:

La verosimilitud de un par (x, y) dado un vector de pesos se expresa entonces como:

La probabilidad del conjunto de datos es

Los valores de verosimilitud pueden ser extremadamente pequeños, especialmente cuando se multiplican muchas probabilidades juntas. Esto puede llevar a una subfluencia numérica (donde los números de punto flotante muy pequeños se redondean a cero). Tomar el logaritmo de estos valores los convierte en números más manejables, que suelen ser negativos y de mayor magnitud.

La log-verosimilitud se expresa entonces como

Probablemente notes que esta pérdida es el negativo de la pérdida de BCE, y por eso maximizar la verosimilitud es equivalente a minimizar la pérdida de BCE.

Técnicas de Regularización

La regularización es una técnica clave en el aprendizaje automático para combatir el sobreajuste, donde un modelo se adapta excesivamente a los datos de entrenamiento, incluido su ruido, lo que afecta su rendimiento en nuevos datos. Funciona agregando términos de penalización a la pérdida para limitar la complejidad de los parámetros del modelo. Esto promueve modelos más simples, logrando un equilibrio entre ajustar los datos de entrenamiento y mantener la simplicidad del modelo.

L1 (Lasso) y L2 (Ridge) son formas comunes de regularización, cada una introduciendo términos de penalización únicos en el objetivo del modelo.

L1 agrega una penalización basada en el valor absoluto de los parámetros, lo que lleva a modelos dispersos con algunos pesos igual a cero.

En contraste, L2 penaliza la magnitud al cuadrado de los parámetros, reduciendo los pesos sin hacerlos cero.

Las técnicas de regularización L1 (Lasso) y L2 (Ridge) difieren en cómo penalizan los parámetros del modelo. L1 aplica una penalización proporcional a los valores absolutos, lo que hace que algunos pesos sean completamente cero, facilitando la selección de características. En contraste, L2 penaliza las magnitudes al cuadrado de los pesos, asegurando que permanezcan pequeños pero generalmente no cero, preservando todas las características con impacto reducido.

Maximum a Posteriori

Como se mencionó anteriormente, el Teorema de Bayes nos permite estimar la distribución posterior de los parámetros del modelo, denotada como P(w∣X,y), aprovechando la función de verosimilitud y una distribución de prior elegida P(w) para los parámetros.

En esencia, el prior encapsula nuestras creencias o suposiciones iniciales sobre los parámetros antes de observar cualquier dato, mientras que la verosimilitud cuantifica qué tan bien explican los parámetros los datos observados. El Teorema de Bayes combina estos elementos para producir una distribución posterior que representa nuestra creencia actualizada sobre los parámetros, dada tanto la distribución de prior como los datos.

Dos priors muy conocidos son el prior Laplace y el prior Gaussiano.

El prior Laplace opera bajo la suposición de que los pesos w se extraen de una distribución Laplace con parámetro de ubicación μ=0 y parámetro de escala b.

En otras palabras, presume que la distribución de los pesos se centra alrededor de cero y decae exponencialmente a medida que los valores se desvían de este punto central, reflejando una preferencia por modelos más dispersos en los que muchos pesos pueden establecerse en cero.

El prior Gaussiano opera bajo la suposición de que los pesos w se extraen de una distribución Gaussiana (o Normal) con media μ=0 y varianza σ.

En esencia, supone que la distribución de los pesos está centrada simétricamente alrededor de cero, con un perfil en forma de campana que indica que los pesos son más propensos a estar cerca de la media, disminuyendo la probabilidad de valores menos probables a medida que te alejas. Esto conduce a una preferencia por modelos en los que los pesos están regularizados de manera suave, asegurando que permanezcan pequeños en magnitud sin necesariamente llevar a que alguno sea exactamente cero.

El logaritmo de la posterior se da por

Al optimizar nuestro modelo, encontramos que maximizar el logaritmo de la posterior es fundamentalmente equivalente a minimizar una pérdida regularizada específica.

Es importante destacar que la distinción entre la regularización L1 y L2 depende de la forma de la distribución de prior considerada.

Uso de la posterior en un método MCMC

En un marco bayesiano, todo se trata de manera probabilística. Por lo tanto, en lugar de estimar valores fijos para los coeficientes de regresión como en la regresión lineal clásica, la Regresión Lineal Bayesiana estima una distribución de posibles valores de coeficientes.

Una forma de usar la distribución posterior es muestreando un conjunto de pesos de la distribución P(w|X,y).

Una forma sencilla de hacerlo es mediante el uso de un método MCMC, el punto de partida para entender un método MCMC es el enfoque Metropolis-Hastings.

Enfoque Metropolis-Hastings

El algoritmo Metropolis-Hastings (M-H) es un método en estadísticas bayesianas para muestrear de distribuciones de probabilidad complejas.

Utiliza una “distribución de propuesta” más simple para explorar una distribución objetivo, aceptando o rechazando muestras según una probabilidad calculada. Es importante destacar que el algoritmo M-H no requiere conocimiento exacto de la distribución objetivo; tener una distribución proporcional a ella es suficiente.

No lo utilizaremos porque hay otros enfoques más confiables y eficientes, pero aún explicaremos brevemente cómo funciona porque el algoritmo M-H es un método MCMC fundamental.

  • Elija una suposición inicial
  • Establezca una distribución de propuesta, típicamente una Gaussiana centrada en el valor actual w.

Luego, para cada iteración, procedemos de la siguiente manera:

  • Muestreamos un nuevo w’ de la distribución de propuesta P(w’|w).
  • Calculamos la probabilidad de aceptación

  • Generamos un número aleatorio u de una distribución uniforme en [0,1]. Si u ≤ α, aceptamos w’ como la nueva muestra; de lo contrario, conservamos w.

NUTS Sampler y pyMC3

El enfoque Metropolis-Hastings implica proponer un nuevo punto en el espacio de parámetros, y luego decidir si aceptar este nuevo punto basado en una comparación de su verosimilitud en comparación con la verosimilitud del punto actual. Su eficiencia depende en gran medida de la elección de la distribución de propuesta, y puede sufrir de un comportamiento de caminata aleatoria en espacios de alta dimensión, lo que conduce a una convergencia lenta.

NUTS (No-U-Turn Sampler) es una extensión del método Hamiltonian Monte Carlo (HMC). En lugar de una caminata aleatoria, NUTS utiliza información del gradiente de la distribución objetivo para proponer pasos leapfrog, lo que le permite recorrer la distribución de manera más eficiente. Una de sus principales ventajas es que determina automáticamente el número óptimo de pasos leapfrog, evitando así el problema de la caminata aleatoria y la tarea tediosa de ajustar esto manualmente.

PyMC3 es un popular marco de programación probabilística que integra de manera transparente ambos métodos (y otros), permitiendo a los usuarios ajustar modelos bayesianos complejos con facilidad, sin verse atrapados en las complejidades de los algoritmos subyacentes.

En nuestro caso, este código muestreará una secuencia de pesos de la distribución posterior P(w|X,y).

import pymc3 as pmwith pm.Model() as probit_model:        # Priors for weights and bias    weights = pm.Normal('weights', mu=0, sd=4, shape=X.shape[1])    bias = pm.Normal('bias', mu=0, sd=4)        # Probit link function    mu = pm.math.dot(X, weights) + bias    phi = pm.math.invprobit(mu)  # Inverse probit link function        # Likelihood    y_obs = pm.Bernoulli('y_obs', p=phi, observed=y)        # Sample from the posterior    trace = pm.sample(5000, tune=1000, chains=5, target_accept = 0.90)

Podemos graficar las diferentes distribuciones de cada peso.

Distribuciones de los pesos y su gráfico de convergencia (por mí)

Vemos que cada peso converge a una distribución gaussiana. Por lo tanto, ahora cada predicción se puede realizar de manera probabilística y la distribución de las predicciones también será gaussiana.

Por ejemplo, las preferencias de nuestro decisor ficticio para un batido de naranja, para un batido de naranja y manzana, y para un batido de plátano y manzana se dan mediante las siguientes distribuciones gaussianas.

Usando el modelo que generó los datos, podemos ver que la utilidad real de los tres batidos es respectivamente -0.66, -0.24 y 0.79, por lo que la distribución gaussiana refleja bastante bien las preferencias y la brecha entre ellas.

Conclusión

En esta publicación del blog, hemos viajado desde las complejidades de la obtención de preferencias hasta las complejidades de los modelos de regresión lineal bayesiana. Nuestra discusión comenzó con una exploración de los modelos aditivos-2, que sirven como un medio realista pero computacionalmente viable para capturar las preferencias del usuario. Al pasar de la regresión lineal básica a los modelos probit más avanzados, ofrecimos una nueva perspectiva para comprender los datos de preferencia.

También profundizamos en la equivalencia entre una perspectiva basada en costos y una perspectiva probabilística, arrojando luz sobre cómo minimizar la pérdida de entropía cruzada binaria es análogo a maximizar la verosimilitud, y cómo la regularización sirve como la selección implícita de un prior.

Por último, discutimos la utilidad de un marco bayesiano para generar no solo estimaciones puntuales sino distribuciones predictivas completas. Este enfoque brinda un mayor nivel de confianza e interpretabilidad a nuestros modelos, especialmente útil en la tarea sutil del aprendizaje de preferencias.

Con esta base establecida, futuras investigaciones pueden adentrarse más en la aplicación de estos modelos sofisticados en datos de preferencias cada vez más complejos y a gran escala.

Agradecimientos

Agradecimiento especial a mi compañera/amiga Anissa Hacene por su contribución en este trabajo y al equipo de TDS por su revisión rápida y observaciones perspicaces.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Keshav Pingali reconocido con el Premio ACM-IEEE CS Ken Kennedy

El premio se entregará formalmente a Pingali en noviembre en la Conferencia Internacional sobre Computación de Alto R...

Inteligencia Artificial

MosaicML ayuda a los usuarios de IA a aumentar la precisión, reducir costos y ahorrar tiempo

La startup MosaicML tiene la misión de ayudar a la comunidad de IA a mejorar la precisión de las predicciones, reduci...

Aprendizaje Automático

Esta Herramienta de IA Explica Cómo la IA 'Ve' Imágenes y por qué Puede Equivocarse al Confundir un Astronauta con una Pala.

Es ampliamente reconocido que la inteligencia artificial (IA) ha logrado avances significativos en los últimos años, ...

Inteligencia Artificial

Apple y Google pasan por alto ChatGPT como la aplicación del año

En un giro sorprendente de los acontecimientos, los gigantes tecnológicos Apple y Google han divergido de sus patrone...

Inteligencia Artificial

La cirugía cerebral impulsada por IA se convierte en una realidad en Hong Kong

El Centro de Inteligencia Artificial y Robótica, bajo la Academia China de Ciencias, completó pruebas exitosas de un ...