Smoothers and Generalised Additive Models 广义加性模型 (R)

GAM( Generalised Additive Models )是什么?

请对glm有一定了解,否则本文看起来会很跳跃。gam 可以看作是 glm 的扩展, 

对于真实世界的数据,可能是更加光滑,在不同阶段有不同光滑程度 的曲线,而不是简单的线性模型。为了应付这种 模型中更光滑部分 (smoother) 的需求,我们引入 ”加性模型“, 譬如 我们使用了 更高的次幂 ,但这个法子有 undesirable properties,于是我们引入了 splines + knots 结构 的加性模型 。这个结构仍然可以通过 使用 线性模型那样 的 least square 方式 得到模型参数的 点估计。

knots 太少就不够 flexible ,过细过多的 knots 会 让模型 less smooth ,也就是 过拟合 , 所以引入了一些机制来实现这个权衡。

1 How to specify the smooth function ----, one way to go is to use penalised regression splines to represent the functions

2 How smooth should they be -----whereas the appropriate degree of smoothness can be estimated from the data using cross validation (CV)

 

GLM 吸收 加性模型 的 特性,用 加性模型(如下图) 替换了 原来的GLM中 线性模型 的部分,成为了 GAM。也就是:

其中f(x)是 smoother ,是 Non-parametric model 的, gam中 提供 default 方法 确定这个 光滑部分的 结构, gam 为自动拟合splines 提供了一种机制。也就是说,你不必手动选择 knots 。这可以使用mgcv包完成

 

什么时候用GAM?

一般来说我们散点图发现数据不适合 线性模型 ,就会 看一看数据是否符合某种概率分布的描述,以使用GLM, 或者使用GAM ,但其区别是什么呢?也就是说我们什么时候使用 GLM,什么时候使用 GAM 呢? 怎么才能认为,一个模型使用GLM是不合适的,而要进一步考虑GAM ?

一个自回答:数据量更多,变化越曲折的场景我们选择GAM。

简单的考虑单变量的情况,GLM的线性部分意味着 某个概率分布的参数是由这个单变量的线性变换(在套上log或者其他连接函数)组成的,也就是说 某个概率分布的参数是的shape 是连接函数的shape, identical 转换的话shape 就是一条直线,以正态分布 为例,也就是每一个对应的X 预测点由 各异的均值,恒定的方差,这样得到的 拟合曲线 就是 连接函数的shape , 也就是一条直线。 当这种情况推广到GAM, 最简单的,数据不再是一条直线,但是 identical 和 正态分布 仍然满足,我们就要考虑GAM。 还有一个点就是GAM适合数据量大的场景。 总结的说,数据量大,可以考虑GAM, 散点图揭示了明显的 ”非连接函数转换后的shape“ 的时候,考虑GAM 。

残差图

和glm一样 各种残差图及其解释是很重要的在 model fit的时候,,,这个真的有些麻烦,我就先不写了。

总的来说,时刻记住模型背后的数学样子,残差的数学式子,那么残差图中 ,譬如残差正态分布等 就较为容易被理解。

一个例子

#这个rank和knots位置的选取,对数据来源不了解(经验不足)的话,指定时很困难的
#GAM提供了default 的方法
model5 <- gam(medv ~ s(lstat), data = train.data)
# Make predictions
predictions <- model5 %>% predict(test.data)
# Model performance
model5_performance <- data.frame(
  RMSE = RMSE(predictions, test.data$medv),
  R2 = R2(predictions, test.data$medv)
)
summary(model5)


model5_performance
ggplot(train.data, aes(lstat, medv) ) +
  geom_point() +
  stat_smooth(method = gam, formula = y ~ s(x))

plot(model5)

# split the output into 4 panes
par(mfrow = c(2,2))
gam.check(model5)   #这几张图怎么看,well ,

 

 

你可能感兴趣的:(R,data,science,机器学习)