Вопрос или проблема
Я использую бинарный классификатор на основе гауссовского процесса на многомерном наборе данных с бинарными метками. Вероятность, как правило, монотонно увеличивается или уменьшается вдоль каждого признака/размерности. Для простоты и для лучшего понимания я воспроизвел игрушечную однородную одномерную задачу.
В игрушечном наборе данных вероятности должны монотонно увеличиваться вдоль (единственной) размерности. Общее ядро является суммой RBF и линейного ядра. Ниже я привожу скрипт на Python (с использованием библиотеки GPy) и соответствующий вывод. В дополнение к показу кривой прогнозирования вероятности я показываю образцы скрытой функции, преобразованные с помощью (пробитной) связующей функции.
Вопросы: почему кривая вероятности и все образцы пересекают уровень вероятности 0,5 примерно в одном и том же месте? (Это означает, что соответствующие кривые скрытой функции все пересекают f=0 в одном и том же месте – почему это так?) Возможно ли модифицировать ядро и получить образцы функции, которые не пересекаются в одном и том же месте?
Я задаю этот вопрос, потому что “истинное” пересечение вероятности 0,5 (которое могло бы быть оценено с помощью очень большого и плотного набора данных) на самом деле может находиться в другом месте. Я хотел бы иметь возможность генерировать образцы кривых вероятности, которые это отражают.
Скрипт:
import numpy as np
import GPy
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
# Игрушечный одномерный набор данных
X = np.array([1, 2, 3, 4, 5, 6, 7, 28, 29, 30, 31, 32, 33]).reshape((-1,1))
t = np.array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]).reshape((-1,1))
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_test = np.linspace(0, 35, 50).reshape(-1, 1)
# Модель GPy
rbf = GPy.kern.RBF(input_dim=1, variance=1., lengthscale=1.)
lin = GPy.kern.Linear(input_dim=1, variances=1.)
m = GPy.core.GP(
X=X_scaled,
Y=t,
kernel=rbf + lin,
inference_method=GPy.inference.latent_function_inference.laplace.Laplace(),
likelihood=GPy.likelihoods.Bernoulli())
m.optimize_restarts(num_restarts=10, optimizer="lbfgs", robust=True)
# Прогнозируемая кривая вероятности
pred = m.predict(scaler.transform(X_test))[0]
# Образцы кривых (образец скрытой функции, преобразованной с помощью связующей функции (пробит))
latent_f_samples = m.posterior_samples_f(scaler.transform(X_test), size=10)
proba_samples = m.likelihood.gp_link.transf(latent_f_samples)[:,0,:]
# Построение графика
fig, ax = plt.subplots(1,1)
ax.scatter(X[t==1], t[t==1], label="Класс 1", s=100, marker="x", color="red")
ax.scatter(X[t==0], t[t==0], label="Класс 0", s=100, marker="+", color="blue")
ax.plot(X_test, pred, color="k", label="Прогнозируемая", zorder=5)
ax.plot(X_test, proba_samples, alpha=0.3, color="gray", zorder=0)
ax.axhline(0.5, X_test.min(), X_test.max(), color="black", ls="--", lw=0.5)
ax.set_title(f"Прогнозируемые вероятности и образцы кривых вероятности")
ax.set_xlabel('X')
ax.set_ylabel('p(класс 1)')
ax.set_xlim(X_test.min(), X_test.max())
ax.legend()
Вывод:
На что я хотел бы, чтобы образцы походили (если это когда-либо возможно):
Ответ или решение
Вопрос, который вы подняли, касается особенностей работы гауссовских процессов (ГП) в контексте бинарной классификации. Рассмотрим более подробно, почему все образцы латентных функций пересекаются в одной и той же точке, а также возможные пути модификации ядра для достижения большего разнообразия в поведении этих функций.
Ответ на вопрос
Когда вы используете гауссовский процесс для бинарной классификации, вы фактически моделируете латентную функцию ( f(x) ), которая связывает входные данные ( x ) с вероятностями классов. Ваша модель, основанная на сумме радиально-базисного (RBF) и линейного ядра, приводит к тому, что все образцы латентной функции имеют общую структуру, что и обуславливает пересечение в одной и той же точке по оси ( f = 0 ).
Причины пересечения в одной и той же точке
-
Значение Сигмовидной или Пробит-линзы:
- При использовании пробит-функции, которая работает с нормальным распределением, значение 0 в латентной функции соответствует вероятности 0.5. Все образцы, проходя через эту функцию, будут иметь одно и то же значение для ( f = 0 ), поскольку фиксируются на одном уровне вероятности, что создает одинаковые точки пересечения.
-
Однородность Ядра:
- Композиция RBF и линейного ядра создает определенную регулярность в поведении латентной функции. Это может приводить к тому, что функции располагаются относительно входных данных подобным образом, а значит, пересечения остаются неизменными.
-
Моделирование Одинарной Латентной Функции:
- Гауссовый процесс берет множество возможных реализаций латентной функции, но когда они имеют общие характеристики ввиду натренированного ядра, их поведения в точках пересечения оказывается схожими.
Изменение ядра для различия пересечений
Чтобы получить разные точки пересечения для образцов функций, стоит рассмотреть следующие стратегии:
-
Изменение Ядра:
- Попробуйте использовать более сложные и разнообразные ядра (например, ядро Матерн) или комбинации, которые добавят в модель неровности и местные колебания, что позволит получить различное поведение в разных точках.
-
Модели с Нелинейными Связями:
- Внедрение повышенной степени полинома или дополнительных слагаемых в ядро может создать условия, при которых пересечения будут происходить в разных местах.
-
Систематическое Введение Шума:
- Добавление шума в латентные функции может помочь смягчить жесткие ограничения, создаваемые тепловым ядром и линейным компонентом, увеличивая вариабельность в точках пересечения.
-
Параметрическая Настройка:
- Экспериментируйте с длиной шкалы и другими параметрами ядра, чтобы изменить рост и затухание вероятностей. Это поможет не только разбить жесткие границы, но и позволит индивидуализировать поведение функции.
Заключение
Таким образом, в вашей аналитике вероятностей пересечения на уровне 0.5 функций латентного пространства связано с используемыми ядрами и методами трансформации. Увеличив разнообразие используемых моделей ядра и модифицируя их, можно добиться желаемой вариативности в результатах. В результате это улучшит общее понимание бинарной классификации и позволит более точно отражать реальную структуру данных.