Обобщенная аддитивная модель — Python

Я пытаюсь подобрать нелинейную модель, используя обобщенную аддитивную модель. Как определить количество используемых сплайнов. Есть ли особый способ выбрать количество сплайнов? Я использовал шлицевой фитинг 3-го порядка (кубический). Ниже приведен код.

from pygam import LinearGAM
from pygam.utils import generate_X_grid

# Curve fitting using GAM model - Penalised spline curve.
def modeltrain(time,value):
    return LinearGAM(n_splines=58,spline_order=3).gridsearch(time, value)

model=modeltrain(t1,x1)

# samples random x-values for prediction
XX = generate_X_grid(model)

#plots for vizualisation
plt.plot(XX, model.predict(XX), 'r--')
plt.plot(XX, model.prediction_intervals(XX,width=0.25), color='b', ls='--    ')
plt.scatter(t1, x1)
plt.show()

Это ожидаемый результат

введите здесь описание изображения

График рассеяния исходных данных

введите здесь описание изображения

Если количество сплайнов выбрано неправильно, то я получаю неправильную посадку.

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


person Jagdeesh R    schedule 25.08.2017    source источник


Ответы (1)


Обычно для сплайнов вы выбираете довольно большое количество сплайнов (~ 25) и позволяете параметру сглаживания lambda выполнять работу по уменьшению гибкости модели.

Для вашего варианта использования я бы выбрал значение по умолчанию n_splines=25, а затем выполнил поиск по сетке по параметру лямбда lam, чтобы найти наилучшее количество сглаживания:

def modeltrain(time,value):
    return LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, lam=np.logspace(-3, 3, 11))

Это попробует 11 моделей от lam = 1e-3 до 1e3.

Я думаю, что ваш выбор n_splines=58 слишком высок, потому что похоже, что он создает один сплайн на точку данных.

Если вы действительно хотите выполнить поиск по n_splines, вы можете сделать следующее:

LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, n_splines=np.arange(50))

Примечание. функция generate_X_grid НЕ выполняет случайную выборку для предсказания, она просто делает плотный линейный интервал ваших значений X (времени). Причина этого в том, чтобы визуализировать, как будет интерполироваться изученная модель.

person dswah    schedule 27.11.2017
comment
Знаете ли вы, какую метрику использует pygam для выбора лучшей модели из gridsearch? Например, минимизируется ли среднеквадратическая ошибка или средняя абсолютная ошибка? Можно ли изменить этот показатель? - person Will.Evo; 20.04.2018
comment
@Will.Evo да, pyGAM использует обобщенный показатель перекрестной проверки отклонение модели. Для моделей с нормальным распределением отклонение представляет собой среднеквадратичную ошибку. В настоящее время вы можете переключить цель gridsearch только на «AIC», «AICc» или «GCV» / «UBRE»... - person dswah; 13.06.2018