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

PeC*_*aDe 5 python spline gam coefficients

当以 n_splines=5 拟合线性GAM模型时python,拟合分段线性函数:

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)
Run Code Online (Sandbox Code Playgroud)

通过使用.coef拟合模型,可以恢复每个样条的系数以进行进一步分析:

model.coef_
Run Code Online (Sandbox Code Playgroud)

然而,我们如何获得每个变量的 5 个样条曲线的截面呢?

例如,对于cyl变量,我们将拟合以下样条线:

在此输入图像描述

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

我在文档中找到的唯一方法model.edge_knots是

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

在此示例中,它对应于cyl[4,8]。

Car*_*tes 2

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

\n

\xc2\xa0

\n

\xc2\xa0\xc2\xa0\xc2\xa0

\n
XX = model_gam.generate_X_grid(term=i)\n\xc2\xa0\xc2\xa0\xc2\xa0 pdep, confi = model_gam.partial_dependence(term=i, X=XX, width=0.95)\n\n\xc2\xa0\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0 first_diff = [float("{:.3f}".format(i)) for i in np.diff(pdep)]\n\xc2\xa0\xc2\xa0\xc2\xa0 second_diff = abs(np.diff(first_derivative))\n\xc2\xa0\xc2\xa0\xc2\xa0 values_list = XX[np.where(second_diff > 0)[0],i]\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xa0

\n

这会导致这个结果不是最理想的:

\n

\xc2\xa0在此输入图像描述\n\xc2\xa0

\n

但这似乎是一个足够好的第一个方法。

\n

\xc2\xa0

\n