Регрессия и Байесовские методы в современном определении предпочтений

Регрессия и Байесовские методы в определении предпочтений

Применение к созданию простых смузи

Фото от Denis Tuksar на Unsplash

Линейная регрессия часто считается основной техникой предиктивного моделирования, но ее применение не ограничивается простыми предсказательными задачами. В этой статье мы попытаемся обогатить диалог вокруг техник регрессии, представив Probit Linear Regression как эффективный инструмент для моделирования предпочтений. Кроме того, мы используем байесовский подход для перехода от классической линейной регрессии к байесовской линейной регрессии, раскрывая внутреннюю связь между оптимизацией на основе функции стоимости – в частности, минимизацией потерь бинарной кросс-энтропии (BCE) – и максимальной правдоподобной оценкой.

Таким образом, мы стремимся продемонстрировать, что регуляризация может рассматриваться как форма выбора байесовского априорного распределения, тем самым связывая подходы на основе функции стоимости с вероятностным рассуждением.

Наконец, мы обсудим, как байесовская линейная регрессия позволяет получить не только точечные оценки, но также предоставляет распределение для этих предсказаний, предлагая более богатую, осведомленную о неопределенности перспективу.

Байесовский подход

Байесовский подход идентифицирует две основные компоненты: данные D и модель w. Определяя функцию правдоподобия P(D∣w) и априорное распределение модели P(w), мы стремимся найти модель, которая максимизирует апостериорную вероятность P(w∣D), получаемую с использованием теоремы Байеса:

В предпочтительном обучении наличие распределения над w предоставляет преимущество захвата неопределенности, присущей предпочтениям человека, тем самым предоставляя не только одну «лучшую догадку», но и ряд правдоподобных моделей.

Проблема выявления предпочтений

Выявление предпочтений является ключевым компонентом в теории принятия решений, направленным на определение выборов принимающего решения на основе имеющихся данных. В этом исследовании мы решаем проблему выявления предпочтений, подгоняя модель к частичному набору предпочтений. В нашем случае предпочтения выражены в их наиболее простой форме: попарные сравнения. Чтобы проиллюстрировать эту концепцию, рассмотрим набор фруктов, обозначенных F, включая яблоко, банан, апельсин, ли́чи и манго.

В нашем контексте альтернативный набор A состоит из всех возможных смузи, которые можно создать, используя один или несколько ингредиентов из набора F.

Пользователь выражает свои предпочтения через набор упорядоченных пар (A, B), где A строго предпочтительнее B.

В следующем разделе этой статьи будет представлена семейство функций, специально выбранных для захвата предпочтений пользователей: аддитивные функции. Эти математические конструкции обеспечивают простую, но надежную основу для понимания того, как различные факторы влияют на предпочтения отдельного человека, тем самым обеспечивая эффективное моделирование выборов, выраженных через попарные сравнения.

Аддитивные модели

Линейная аддитивная модель является наиболее простой моделью, которую можно использовать для захвата предпочтений пользователя.

Аддитивная линейная модель

Аддитивная модель полезности – это модель, которая присваивает каждому ингредиенту в нашем наборе определенный вес. Общая полезность или «понравилось» смузи затем рассчитывается путем суммирования весов его составных ингредиентов. Формально, учитывая вектор весов

Полезность смузи, созданного из подмножества A ингредиентов, определяется следующим образом:

Где I – это функция идентичности, которая проверяет, принадлежит ли элемент множеству A или нет.

Аддитивная модель с бинарными взаимодействиями

2-аддитивная модель строится на основе 1-аддитивной модели, вводя дополнительный уровень сложности. Вектор весов содержит вес для каждого отдельного ингредиента, а также веса для каждой возможной пары ингредиентов. Это позволяет модели учитывать синергии между парами фруктов, эффективно распознавая, как сочетание двух ингредиентов может влиять на общую полезность. Формально, вектор весов w расширяется для включения весов для каждой пары (i, j) в дополнение к единичным элементам:

И с 2-аддитивной линейной моделью полезность смузи определяется следующим образом:

Где F² – множество единичных элементов и пар.

n-аддитивная модель

Продвигаясь еще дальше, n-аддитивная модель предлагает высоко гибкую систему полезности. В этой модели вектор весов учитывает не только отдельные ингредиенты и пары, но также расширяется до включения весов для любого подмножества из до n ингредиентов. Эта обобщенность позволяет модели учитывать сложные взаимосвязи и синергии между несколькими ингредиентами одновременно.

Формально, вектор весов w расширяется для включения весов для всех возможных комбинаций из до n ингредиентов:

Эта n-аддитивная модель может учитывать полный спектр взаимодействий между ингредиентами, что делает ее чрезвычайно мощным инструментом для понимания сложных структур предпочтений.

В рамках данного анализа мы ограничимся 2-аддитивными моделями, так как мы считаем, что сложность отношений предпочтения между ингредиентами не превышает парных взаимодействий.

Изучение предпочтений путем решения задачи пробит-регрессии

В то время как традиционные модели регрессии выдают вещественные предсказания, нашей целью является предсказание бинарного отношения предпочтения.

Для достижения этой цели мы модифицируем нашу модель регрессии так, чтобы она выдавала вероятность предпочтения опции A перед опцией B. Затем мы определяем соответствующую функцию стоимости, чтобы эффективно подогнать эту вероятностную модель к нашим данным.

Одним из классических способов привести значение к диапазону от 0 до 1 является использование функции Пробит. Функция Пробит определяется следующим образом:

Следующая фигура иллюстрирует ее форму

Форма функции Пробит (мной)

Применяя эту функцию к разнице между f(A) и f(B), наша модель будет выдавать вероятность, приближающуюся к 1, если f(A) значительно превышает f(B). В противном случае она будет производить вероятность около 0,5, если f(A) примерно равно f(B).

Таким образом, проблему выяснения предпочтений можно сформулировать как поиск оптимального вектора весов w такого, что:

Бинарная кросс-энтропия (BCE) потеря

Бинарная кросс-энтропия (BCE) потеря, также известная как логарифмическая потеря, служит метрикой производительности для классификационных моделей, выдающих вероятности в диапазоне от 0 до 1, обычно используемых в задачах бинарной классификации. Математически, учитывая истинные метки y (0 или 1) и предсказанные вероятности p, BCE определяется как:

Генерация игрушечных данных

Для проверки наших методов мы представляем протокол генерации синтетических данных.

Процесс начинается с случайной выборки вектора весов w. Затем мы устанавливаем некоторые из его параметров в ноль, чтобы ввести слой реализма и простоты.

Исходя из предположения, что предпочтения пользователя совпадают с этой выбранной функцией, мы можем использовать ее в качестве эталона для оценки точности нашей прогностической модели.

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

Затем мы кодируем каждую альтернативу с помощью бинарного вектора, в котором компоненты расположены в том же порядке, что и параметры модели, с использованием следующей функции:

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

Затем для оценки конкретного смузи мы используем произведение:

vectorize_smoothie("oa") @ w# Вернуть w_a + w_o + w_oa

Для построения нашего набора данных мы начинаем с выборки вектора весов w. Затем мы генерируем наборы смузи и оцениваем каждый из них на основе выбранных весов. Для каждой пары смузи A и B, где f(A)>f(B), мы добавляем соответствующее предпочтение в наш набор данных. Каждое предпочтение между A и B записывается в векторе, определенном следующим образом:

Для каждой пары A,B, где f(A) > f(B), мы добавляем две строки v(A,B) и v(B,A), первая помечена классом 1, вторая – классом 0.

Следующий код дает нам набор данных на n смузи.

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

Разрешение на основе стоимости

Один из способов решения проблемы заключается в использовании выпуклости функции потерь BCE и библиотеки, такой как Torch.

Начнем с упаковки сгенерированных данных в соответствующие загрузчики наборов данных, предоставляемые 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)

Теперь мы создаем простую линейную модель

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

И обучаем ее с использованием функциональности автоградиента PyTorch.

input_dim = X.shape[1]model = BinaryClassifier(input_dim)# Функция потери и оптимизаторcriterion = nn.BCELoss()optimizer = optim.Adam(model.parameters(), lr=0.01)losses = []# Обучение моделиepochs = 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()

Затем мы тестируем полученную модель с использованием тестового набора данных

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'Test Accuracy: {100 * correct / total:.2f}%')

При использовании 20% данных для обучения мы получили точность около 98,32%, что совсем неплохо.

Метод максимального правдоподобия (MLE)

Альтернативный метод решения задачи пробит-регрессии заключается в явной формулировке правдоподобия данных при заданном векторе весов w.

Мы предполагаем, что модель производит вероятность p, указывающую, что A предпочтительнее B. Предсказывающее распределение для этого сценария выражается следующим образом:

Правдоподобие пары (x,y) при заданном векторе весов выражается следующим образом:

Вероятность набора данных:

Значения правдоподобия могут быть крайне малыми, особенно при умножении множества вероятностей друг на друга. Это может привести к численной потере точности (когда очень малые числа с плавающей запятой округляются до нуля). Взятие логарифма этих значений превращает их в более управляемые числа, которые обычно отрицательны и имеют большую величину.

Логарифмическое правдоподобие задается следующим образом:

Вы, вероятно, заметите, что эта функция потерь является отрицательной функцией потерь BCE, и поэтому максимизация правдоподобия эквивалентна минимизации функции потерь BCE.

Техники регуляризации

Регуляризация – это ключевая техника в машинном обучении для борьбы с переобучением, когда модель слишком сильно приспосабливается к обучающим данным, включая их шум, что снижает ее производительность на новых данных. Она работает путем добавления штрафных членов к функции потерь для ограничения сложности параметров модели. Это способствует более простым моделям, находя баланс между прилеганию к обучающим данным и сохранению простоты модели.

L1 (Lasso) и L2 (Ridge) – это распространенные формы регуляризации, каждая из которых вводит уникальные штрафные члены в цель модели.

L1 добавляет штраф на основе абсолютного значения параметров, что приводит к разреженным моделям с некоторыми нулевыми весами.

В отличие от L1, L2 штрафует квадрат модуля параметров, уменьшая веса, но не приводя их к нулю.

Техники регуляризации L1 (Лассо) и L2 (Ридж) отличаются способом штрафования параметров модели. L1 применяет штраф, пропорциональный абсолютным значениям параметров, что приводит к тому, что некоторые веса полностью обнуляются, облегчая выбор признаков. В отличие от этого, L2 штрафует квадраты весов, обеспечивая их малость, но обычно ненулевость, сохраняя все признаки с уменьшенным влиянием.

Максимальное апостериорное

Как уже упоминалось, теорема Байеса позволяет оценить апостериорное распределение параметров модели, обозначаемое как P(w∣X,y), используя функцию правдоподобия и выбранное априорное распределение P(w) для параметров.

В сущности, априорное распределение отражает наши первоначальные предположения о параметрах перед наблюдением каких-либо данных, а функция правдоподобия количественно оценивает, насколько хорошо параметры объясняют наблюдаемые данные. Теорема Байеса объединяет эти элементы для получения апостериорного распределения, которое представляет собой обновленное представление о параметрах с учетом априорного распределения и данных.

Два известных априорных распределения – это априорное распределение Лапласа и априорное распределение Гаусса.

Априорное распределение Лапласа предполагает, что веса w выбираются из распределения Лапласа с параметрами местоположения μ=0 и масштаба b.

Другими словами, предполагается, что распределение весов центрируется вокруг нуля и экспоненциально затухает, когда значения отклоняются от этой центральной точки, что отражает предпочтение более разреженных моделей, в которых многие веса могут быть обнулены.

Априорное распределение Гаусса предполагает, что веса w выбираются из нормального (гауссова) распределения с математическим ожиданием μ=0 и дисперсией σ.

В сущности, оно предполагает, что распределение весов симметрично центрировано вокруг нуля, с колоколообразным профилем, указывающим, что вероятность нахождения весов близко к среднему значению наиболее высока, и уменьшается при удалении от него. Это приводит к предпочтению моделей, в которых веса регуляризуются плавно, чтобы они оставались небольшими по модулю, но не обязательно становились нулевыми.

Логарифм апостериорной функции задается следующим образом:

Оптимизируя нашу модель, мы находим, что максимизация логарифма апостериорной функции фундаментально эквивалентна минимизации определенной регуляризованной функции потерь.

Отмечается, что различие между L1 и L2 регуляризацией заключается в выбранной форме априорного распределения.

Использование апостериорного распределения в методе MCMC

В байесовском подходе все рассматривается с вероятностной точки зрения. Таким образом, вместо оценки фиксированных значений коэффициентов регрессии, как в классической линейной регрессии, байесовская линейная регрессия оценивает распределение возможных значений коэффициентов.

Один из способов использования апостериорного распределения – это выборка набора весов из распределения P(w|X,y).

Простой способ сделать это – использовать метод MCMC. Начальная точка для понимания метода MCMC – это подход Метрополиса-Гастингса.

Подход Метрополиса-Гастингса

Алгоритм Метрополиса-Гастингса (М-Г) является методом в байесовской статистике для выборки из сложных вероятностных распределений.

Он использует более простое «предложительное распределение» для исследования целевого распределения, принимая или отклоняя выборки на основе рассчитанной вероятности. Отмечается, что алгоритм М-Г не требует знания точного целевого распределения; иметь пропорциональное ему распределение достаточно.

Мы не будем использовать его, потому что другие подходы более надежны и эффективны, но мы все же кратко объясним, как это работает, потому что алгоритм М-Г является базовым методом MCMC.

  • Выберите начальное предположение
  • Установите предложительное распределение, обычно гауссово, с центром в текущем значении w.

Затем, для каждой итерации, мы продолжаем следующим образом:

  • Выбираем новое w’ из предложенного распределения P(w’|w).
  • Вычисляем вероятность принятия

  • Выбираем случайное число u из равномерного распределения на отрезке [0,1]. Если u ≤ α, принимаем w’ в качестве новой выборки; в противном случае, сохраняем w.

NUTS-сэмплер и pyMC3

Метод Метрополиса-Гастингса предполагает предложение новой точки в пространстве параметров, а затем принятие этой новой точки на основе сравнения ее правдоподобия с текущим правдоподобием точки. Его эффективность сильно зависит от выбора предложенного распределения, и он может страдать от случайного блуждания в пространствах высокой размерности, что приводит к медленной сходимости.

NUTS (No-U-Turn Sampler) – это расширение метода гамильтоновского монте-карло (HMC). Вместо случайного блуждания NUTS использует информацию о градиенте из целевого распределения для предложения шагов leapfrog, позволяя ему более эффективно проходить через распределение. Одним из его основных преимуществ является то, что он автоматически определяет оптимальное количество шагов leapfrog, тем самым избегая проблемы случайного блуждания и трудоемкой задачи ручной настройки этого параметра.

PyMC3 – популярный вероятностный программный фреймворк, который плавно интегрирует оба этих метода (и другие), позволяя пользователям легко подгонять сложные байесовские модели, не утонувая в деталях основных алгоритмов.

В нашем случае, этот код будет выбирать последовательность весов из апостериорного распределения P(w|X,y).

import pymc3 as pmwith pm.Model() as probit_model:        # Приоритеты весов и смещения    weights = pm.Normal('weights', mu=0, sd=4, shape=X.shape[1])    bias = pm.Normal('bias', mu=0, sd=4)        # Пробит функция связи    mu = pm.math.dot(X, weights) + bias    phi = pm.math.invprobit(mu)  # Обратная функция пробита        # Правдоподобие    y_obs = pm.Bernoulli('y_obs', p=phi, observed=y)        # Выборка из апостериорного распределения    trace = pm.sample(5000, tune=1000, chains=5, target_accept = 0.90)

Мы можем построить различные распределения каждого веса.

Распределения весов и график их сходимости (мной)

Мы видим, что каждый вес сходится к гауссовскому распределению. Теперь каждое предсказание может быть сделано вероятностно, и распределение предсказаний также будет гауссовским.

Например, предпочтения нашего вымышленного принимающего решения для апельсинового смузи, для апельсино-яблочного смузи и для банано-яблочного смузи задаются следующими гауссовскими распределениями.

Используя модель, которая сгенерировала данные, мы видим, что истинная полезность трех смузи соответственно равна -0.66, -0.24 и 0.79, поэтому гауссовское распределение действительно отражает предпочтения и достаточно хорошо отражает разницу между ними.

Заключение

В этом блог-посте мы путешествовали от сложностей сбора предпочтений до сложностей байесовской линейной регрессии. Наше обсуждение началось с исследования 2-аддитивных моделей, которые служат реалистичным, но вычислительно простым способом учета предпочтений пользователей. Переходя от простых линейных регрессий к более продвинутым пробит-моделям, мы предложили новую точку зрения на понимание данных о предпочтениях.

Мы также углубились в эквивалентность между стоимостной перспективой и вероятностной, прояснив, как минимизация потерь бинарной кросс-энтропии аналогична максимизации правдоподобия и как регуляризация служит неявному выбору априорного распределения.

Наконец, мы обсудили полезность байесовского подхода в создании не только точечных оценок, но и целых предиктивных распределений. Такой подход придает нашим моделям более высокий уровень уверенности и интерпретируемости, что особенно полезно в тонкой задаче изучения предпочтений.

После заложения этой основы будущие исследования могут углубиться в применение этих сложных моделей к все более сложным и масштабным данным о предпочтениях.

Благодарности

Отдельное спасибо моей коллеге/другу Аниссе Хасен за ее вклад в эту работу и команде TDS за оперативный обзор и проницательные замечания.