【问题标题】:Generalised additive model - Python广义加法模型 - Python
【发布时间】:2018-02-03 10:02:53
【问题描述】:

我正在尝试使用广义加法模型拟合非线性模型。如何确定要使用的样条线数。有没有特定的方法来选择样条线的数量?我使用了三阶(三次)样条拟合。下面是代码。

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()

这是预期的结果

原始数据散点图

如果没有正确选择样条线的数量,那么我得到的拟合不正确。

拜托,我想要一个准确选择样条线数量的方法建议。

【问题讨论】:

    标签: python curve-fitting spline gam


    【解决方案1】:

    通常,对于样条曲线,您会选择相当多的样条曲线 (~25),然后让 lambda 平滑参数完成降低模型灵活性的工作。

    对于您的用例,我会选择默认的 n_splines=25,然后对 lambda 参数 lam 进行网格搜索,以找到最佳的平滑量:

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

    这将尝试从lam = 1e-31e3 的11 个模型。

    我认为您对 n_splines=58 的选择太高了,因为它看起来像每个数据点生成一条样条曲线。

    如果你真的想要搜索n_splines,那么你可以这样做:

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

    注意:函数generate_X_grid 不会为预测进行随机抽样,它实际上只是对您的 X 值(时间)进行密集的线性间距。这样做的原因是为了可视化学习模型将如何进行插值。

    【讨论】:

    • 你知道 pygam 内部使用什么指标从 gridsearch 中选择最佳模型吗?例如,是最小化均方误差还是平均绝对误差?可以更改该指标吗?
    • @Will.Evo 是的,pyGAM 使用generalized cross validation score of the model deviance。对于具有正态分布的模型,偏差是均方误差。目前您只能将网格搜索目标切换为“AIC”、“AICc”或“GCV”/“UBRE”...
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-07-24
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多