Я изучаю двоичную классификацию с помощью гауссовских процессов и сравниваю GPy с scikit-learn для игрушечной 1D-задачи, вдохновленной сообщением в блоге Мартина Крассера. Обе реализации (GPy и scikit-learn), похоже, используют одинаковую настройку с ядром RBF. После оптимизации гиперпараметров ядра масштабы длин одинаковы, но различия сильно различаются. Отклонение ядра GPy кажется слишком маленьким. Как я могу изменить свою реализацию GPy и получить результат, аналогичный результатам с scikit-learn? Я подозреваю, что это связано с внутренней реализацией каждого алгоритма, но я не могу сказать, что вызывает такую резкую разницу. Ниже я объясню, почему я считаю, что мою реализацию GPy необходимо исправить.
Детали реализации: Python 3.9 с GPy 1.13.2 и scikit-learn 1.5.1. Воспроизводимый пример:
import numpy as np
from scipy.stats import bernoulli
from scipy.special import expit as sigmoid
##############################
# Part 1: toy dataset creation
##############################
np.random.seed(0)
X = np.arange(0, 5, 0.05).reshape(-1, 1)
X_test = np.arange(-2, 7, 0.1).reshape(-1, 1)
a = np.sin(X * np.pi * 0.5) * 2 # latent function
t = bernoulli.rvs(sigmoid(a)) # Bernoulli training data (0s and 1s)
#####################################
# Part 2: scikit-learn implementation
#####################################
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import ConstantKernel, RBF
rbf = ConstantKernel(1.0, constant_value_bounds=(1e-3, 10)) \
* RBF(length_scale=1.0, length_scale_bounds=(1e-3, 10))
gpc = GaussianProcessClassifier(
kernel=rbf,
optimizer='fmin_l_bfgs_b',
n_restarts_optimizer=10)
gpc.fit(X_scaled, t.ravel())
print(gpc.kernel_)
# 1.5**2 * RBF(length_scale=0.858)
############################
# Part 3: GPy implementation
############################
import GPy
kern = GPy.kern.RBF(
input_dim=1,
variance=1.,
lengthscale=1.)
kern.lengthscale.unconstrain()
kern.variance.unconstrain()
kern.lengthscale.constrain_bounded(1e-3, 10)
kern.variance.constrain_bounded(1e-3, 10)
m = GPy.core.GP(
X=X,Y=t, kernel=kern,
inference_method=GPy.inference.latent_function_inference.laplace.Laplace(),
likelihood=GPy.likelihoods.Bernoulli())
m.optimize_restarts(
num_restarts=10, optimizer='lbfgs',
verbose=True, robust=True)
print(m.kern)
# rbf. | value | constraints | priors
# variance | 0.8067562453940487 | 0.001,10.0 |
# lengthscale | 0.8365668826459536 | 0.001,10.0 |
Значения шкалы длины примерно одинаковы (0,858 против 0,836), но значения дисперсии сильно различаются (1,5**2 = 2,25 для scikit-learn и только 0,806 для GPy).
p>
Причина, по которой я считаю, что моя реализация GPy требует корректировок, заключается в том, что истинная скрытая функция (см. «a» в части 1 кода выше) не совсем соответствует предсказанной даже с +/- 2 границы стандартного отклонения. С другой стороны, реализация scikit-learn соответствует ему достаточно хорошо (можно получить среднее значение скрытой функции и стандартное отклонение с помощью scikit-learn, как показано здесь).
Слева: предсказанные вероятности аналогичны для обеих моделей (имеет смысл, поскольку они имеют схожий масштаб длины). ценности). Справа: предсказанная скрытая функция GPy не соответствует истинной скрытой функции так же хорошо, как модель scikit-learn.
То, что я пробовал до сих пор, без существенных изменений в результатах:
< li>Нормализация входного объекта (X)
Используйте GPy.inference.latent_function_inference.expectation_propagation.EP() в качестве метода вывода GPy вместо метода Лапласа
< li>Добавьте компонент WhiteKernel в реализацию scikit-learn, как предложено здесь
Я изучаю двоичную классификацию с помощью гауссовских процессов и сравниваю GPy с scikit-learn для игрушечной 1D-задачи, вдохновленной сообщением в блоге Мартина Крассера. Обе реализации (GPy и scikit-learn), похоже, используют одинаковую настройку с ядром RBF. После оптимизации гиперпараметров ядра масштабы длин одинаковы, но различия сильно различаются. Отклонение ядра GPy кажется слишком маленьким. [b]Как я могу изменить свою реализацию GPy и получить результат, аналогичный результатам с scikit-learn? Я подозреваю, что это связано с внутренней реализацией каждого алгоритма, но я не могу сказать, что вызывает такую резкую разницу. Ниже я объясню, почему я считаю, что мою реализацию GPy необходимо исправить.[/b] Детали реализации: Python 3.9 с GPy 1.13.2 и scikit-learn 1.5.1. Воспроизводимый пример: [code]import numpy as np from scipy.stats import bernoulli from scipy.special import expit as sigmoid
############################## # Part 1: toy dataset creation ##############################
print(m.kern) # rbf. | value | constraints | priors # variance | 0.8067562453940487 | 0.001,10.0 | # lengthscale | 0.8365668826459536 | 0.001,10.0 | [/code] Значения шкалы длины примерно одинаковы (0,858 против 0,836), но значения дисперсии сильно различаются (1,5**2 = 2,25 для scikit-learn и только 0,806 для GPy). p> Причина, по которой я считаю, что моя реализация GPy требует корректировок, заключается в том, что истинная скрытая функция (см. «a» в части 1 кода выше) не совсем соответствует предсказанной даже с +/- 2 границы стандартного отклонения. С другой стороны, реализация scikit-learn соответствует ему достаточно хорошо (можно получить среднее значение скрытой функции и стандартное отклонение с помощью scikit-learn, как показано здесь). [i] Слева: предсказанные вероятности аналогичны для обеих моделей (имеет смысл, поскольку они имеют схожий масштаб длины). ценности). Справа: предсказанная скрытая функция GPy не соответствует истинной скрытой функции так же хорошо, как модель scikit-learn. [/i] То, что я пробовал до сих пор, без существенных изменений в результатах: [list] < li>Нормализация входного объекта (X) [*]Используйте GPy.inference.latent_function_inference.expectation_propagation.EP() в качестве метода вывода GPy вместо метода Лапласа < li>Добавьте компонент WhiteKernel в реализацию scikit-learn, как предложено здесь [/list]
Я изучаю двоичную классификацию с помощью гауссовских процессов и сравниваю GPy с scikit-learn для игрушечной 1D-задачи, вдохновленной сообщением в блоге Мартина Крассера. Обе реализации (GPy и scikit-learn), похоже, используют одинаковую настройку...
Я изучаю двоичную классификацию с помощью гауссовских процессов и сравниваю GPy с scikit-learn для игрушечной 1D-задачи, вдохновленной сообщением в блоге Мартина Крассера. Обе реализации (GPy и scikit-learn), похоже, используют одинаковую настройку...
Я генерирую шум, используя распределение Гаусса, и натолкнулся на концептуальный блок.
Есть ли разница между генерацией значения шума и добавлением его к чистым данным:
def add_noise(data_frame, amplitude):
noise = np.random.normal(0, scale =...
Я хочу сделать бинарную классификацию. Классы в исходном наборе данных несбалансированы: 90% и 10%. При использовании CrossEntropyLoss() на выходе моей функции я получаю, что все объекты принадлежат нулевому классу
При этом я пытался перебрать...
Я смотрел на следующую ветку:
Правильный способ обработки очень дисбалансированных данных - двоичная классификация
Плака Общепринято при работе с медицинскими наборами данных и другими типами обнаружения неисправностей, когда один из классов...