在 python 中通过变量查找样条结

问题描述 投票:0回答:1

当在

GAM
中拟合线性
python
模型时,施加 n_splines=5,拟合一个分段线性函数:

import statsmodels.api as sm
from pygam import LinearGAM

data = sm.datasets.get_rdataset('mtcars').data

Y = data['mpg']
X = data.drop("mpg",axis=1)

model = LinearGAM(spline_order=1,n_splines=5).fit(X, Y)

通过使用拟合模型中的

.coef
,可以恢复每个样条的系数以供进一步分析:

model.coef_

但是,我们如何才能获得每个变量的 5 个样条曲线的截面呢?

例如,对于

cyl
变量,我们将拟合以下样条:

5 个部分由节点决定,因此,在图中我们将看到计算的 beta 的变量限制。 (即:4-5,5-6,6-7,7-8)。

我在文档中找到的唯一方法

model.edge_knots

长度为 2 的浮点数组。样条函数的最小和最大域。

在此示例中,它对应于

cyl
到 [4,8]。

python spline gam coefficients
1个回答
0
投票

最后我想出了一个解决方案,在这个解决方案中,我使用部分依赖来计算函数的斜率变化。在这一个中,我采用了双重差异以及斜率的变化。

XX = model_gam.generate_X_grid(term=i)
pdep, confi = model_gam.partial_dependence(term=i, X=XX, width=0.95)


first_diff = [float("{:.3f}".format(i)) for i in np.diff(pdep)]
second_diff = abs(np.diff(first_derivative))
values_list = XX[np.where(second_diff > 0)[0],i]

这导致了次优的结果:

但似乎已经足够好了。

© www.soinside.com 2019 - 2024. All rights reserved.