Постепенное обучение с регрессией гауссовского процесса

Я хотел бы больше понять регрессию гауссовского процесса: я использую реализацию scikit-learn здесь, и я хочу уместить отдельные точки, а не весь набор точек. Но результирующие альфа-коэффициенты должны оставаться такими же, например

gpr2 = GaussianProcessRegressor()
    for i in range(x.shape[0]):
        gpr2.fit(x[i], y[i])

должно быть таким же, как

gpr = GaussianProcessRegressor().fit(x, y)

Но при доступе к gpr2.alpha_ и gpr.alpha_ они не совпадают. Это почему?

Действительно, я работаю над проектом, в котором возникают новые точки данных. Я не хочу снова добавлять массивы x, y и подходить ко всему набору данных, так как это очень трудоемко. Пусть x имеет размер n, тогда у меня есть:

n + (n-1) + (n-2) + ... + 1 € O (n ^ 2) фитингов

учитывая, что сама подгонка является квадратичной (поправьте меня, если я ошибаюсь), сложность времени выполнения должна быть в O (n ^ 3). Было бы оптимальнее, если бы я сделал однократную примерку по n точкам:

1+1+...+1 = n € O(n)


person Manh Khôi Duong    schedule 04.04.2020    source источник


Ответы (2)


То, что вы имеете в виду, на самом деле называется онлайн-обучением или дополнительным обучением; это само по себе огромное подразделение в машинном обучении, и оно не готово к использованию для всех моделей scikit-learn. Цитата из соответствующей документации:

Хотя не все алгоритмы могут обучаться постепенно (т. Е. Без просмотра всех экземпляров сразу), кандидатами являются все оценщики, реализующие partial_fit API. Фактически, способность учиться постепенно из мини-группы экземпляров (иногда называемая «онлайн-обучение») является ключом к внешнему обучению, поскольку она гарантирует, что в любой момент времени будет только небольшое количество экземпляров в основная память.

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

person desertnaut    schedule 04.04.2020
comment
Да, конечно! Я нашел соответствующую ссылку на github. Я оставлю его здесь для всех, кто столкнется с одним и тем же вопросом: github. ru / Bigpig4396 / - person Manh Khôi Duong; 05.04.2020

Хотя sklearn.gaussian_process.GaussianProcessRegressor напрямую не реализует инкрементное обучение, нет необходимости полностью переобучать вашу модель с нуля.

Чтобы полностью понять, как это работает, вы должны понимать основы работы с георадаром. Ключевая идея состоит в том, что обучение модели GPR в основном состоит из оптимизации параметров ядра для минимизации некоторой целевой функции (по умолчанию предельное логарифмическое правдоподобие). При использовании одного и того же ядра с аналогичными данными эти параметры можно использовать повторно. Поскольку оптимизатор имеет условие остановки, основанное на сходимости, повторную оптимизацию можно ускорить, инициализировав параметры с предварительно обученными значениями (так называемый теплый старт).

Ниже приведен пример, основанный на примере из документации sklearn .

from time import time
from sklearn.datasets import make_friedman2
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel
X, y = make_friedman2(n_samples=1000, noise=0.1, random_state=0)
kernel = DotProduct() + WhiteKernel()

start = time()
gpr = GaussianProcessRegressor(kernel=kernel,
        random_state=0).fit(X, y)
print(f'Time: {time()-start:.3f}')
# Time: 4.851
print(gpr.score(X, y))
# 0.3530096529277589

# the kernel is copied to the regressor so we need to 
# retieve the trained parameters
kernel.set_params(**(gpr.kernel_.get_params()))

# use slightly different data
X, y = make_friedman2(n_samples=1000, noise=0.1, random_state=1)

# note we do not train this model
start = time()
gpr2 = GaussianProcessRegressor(kernel=kernel,
        random_state=0).fit(X, y)
print(f'Time: {time()-start:.3f}')
# Time: 1.661
print(gpr2.score(X, y))
# 0.38599549162834046

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

person Gilles Ottervanger    schedule 24.03.2021
comment
Да, это можно сделать, оптимизируя логарифмическую маргинальную вероятность, но лучше просто найти обратную матрицу ядра при обучении. Я использовал обратную блочную матрицу и формулу Шермана Моррисона для постепенного изучения новых точек данных. В этом случае численная оптимизация вероятности дает более неточные результаты. Кроме того, оптимизация вероятности для потоков данных не обязательно является более дешевой в вычислительном отношении, поскольку оптимизатор не обязательно может сходиться быстрее. - person Manh Khôi Duong; 25.03.2021
comment
Я только что заметил комментарий @ manh-khôi-duong к ответу desertnaut. Публикация этого комментария в качестве ответа на этот вопрос кажется хорошей идеей. - person Gilles Ottervanger; 26.03.2021