作为回归家族的一个扩展,广义加性模型(GAMs)是最强大的模型之一,可以为任何回归问题建模!!
线性模型简单、直观、便于理解,但是,在现实生活中,变量的作用通常不是线性的,线性假设很可能不能满足实际需求,甚至直接违背实际情况。1985 年 Stone 提出加性模型 (additive models) ,模型中每一个加性项使用单个光滑函数来估计,在每一加性项中可以解释因变量如何随自变量变化而变化,解决了模型中自变量数目较多时 ,模型的估计方差会加大的问题。1990 年,Hastie 和 Tibshirani 扩展了加性模型的应用范围 ,提出了广义加性模型(generalized additive models)。
你一定用过线性回归或者多项式回归但说实话,所以让我们先从线性回归方程开始:
y = ax₁+ bx₂ + cx₃+ …+ zxₙ+ C
广义加性模型(GAMs)是这个样子的:
g(y) = w₁F₁(x₁) + w₂F₂(x₂) + w₃F₃(x₃) …wₙFₙ(xₙ) + C
可以看到,除了我们的自变量X被函数嵌套以外,我们的因变量Y也就是预测也不是“ y”本身而是一个函数g(y)。而w₁,w₂…wₙ是每个自变量函数的权重
Fₙ是什么?它是一组每个特征变量分别建模为目标变量的函数,称为平滑函数(smoothing functions),将所有这些函数加起来预测g(y)。
这个Fₙ的数学表示是什么呢?Fₙ对于不同的特征变量可以采用不同的表示。对于一个特征变量,它可以是多项式方程,对于另一个特征变量,它可以是径向基函数(RBF)。
最常见的平滑函数是回归样条函数(Regression Splines),除此以外其他的基函数也可以使用例如RBF,Tensor,(来自https://fda.readthedocs.io/en/latest/modules/autosummary/skfda.representation.basis.Tensor.html)等。
这里又出现了一个新名词 “基函数”(Basis functions):基函数是一组可以用来表示复杂非线性函数的简单函数。例如假设我们有fₓ= 5 + 2x²,为了表示这个复杂的非线性函数,我们可以使用下面的基函数集:f₁(x)= 1, f₂(x)=x, f₃(x)= x²,因此就得到了fₓ= 5f₁(x) + 0f₂(x) + 2*f₃(x)
基函数有很多种,最常见的可能就是RBF(SVM中的核函数)
样条函数(Splines):样条是基函数的一种,它是由多项式分段定义的函数。分段多项式基本上就是对变量的不同区间有不同表示的多项式。看看下面这个例子:
m*x+a → x<5
mx+ nx² → 5
p*x³ → x>10
根据X的不同区间改变多项式的表示,这样的多项式称为分段多项式。根据样条的程度,我们可以有以下可能的基函数,来构造原始的复杂函数
0阶:基函数= f(x) = 1
1阶:基函数= f(x)=1, f(x)=x
2阶:基函数= f(x)=1, f(x)=x, f(x)=x²
有了上面的基础,我们开始说明样条回归。它是一组基础函数集的加权和,其中使用的基函数是样条函数。
Fₙ(xₙ) = Σₖ wₖbₖ(xₙ)
其中
Fₙ=第n个特征的第n个平滑函数(还记得上面GAMs的方程吗?)
bₖ=样条回归的第k个基函数(因为样条回归由多个基函数组成)
σₖ= 从k=0→用于表示特征变量和目标变量之间关系的总基函数的总和。
所以GAMs方程是(如果只使用样条回归)
g(y) = Σₖ wₖbₖ(x₁) + Σₘ wₘbₘ(x₂) + Σₙ wₙbₙ(xₙ) … + C
这里的k, m, n 是不同特征的不同样条函数的阶。公式已经推导出来了,还剩最后一个问题在GAMs方程中g()是什么?为什么我们预测的是g(y)而不是“y”本身?
该解释需要从广义线性模型(GLM)的定义中寻找。一旦特征变量和目标变量之间的关系不是线性的,我们用于线性回归的线性方程就需要一些修改将目标映射到特征变量,这里的映射有可能会是非线性关系,所以就需要将目标限制在某个特定范围内,也就是将y变为g(y)。
这里的g(y)被称为联系函数(link function ):它的作用就是保持目标变量与特征变量之间的线性关系。正如模型的名字,“广义”这个词描述了GAMs可以满足不同的回归场景,这些场景不需要遵循线性回归的基本假设,所以这个g()可以是任何函数!!
既然是广义的,那么如果要将一个线性回归方程建模为GAM,我们只需要将:
1、联系函数设置成恒等函数2、Fₙ设置成恒等函数。
g(y) = w₁F₁(x₁) + w₂F₂(x₂) + w₃F₃(x₃) …wₙFₙ(xₙ) + C
也就是说g(x)=x 并且Fₙ(x) =x,那么公式就变成了
y = w₁x₁ + w₂x₂ + w₃x₃ …wₙxₙ
这不就是我们的线性回归方程么
如果你想更详细的研究GAM,那么这里推荐一个库pygam,他是Python中的GAM的实现,它的文档非常详细,如果有兴趣的话建议仔细阅读:https://pygam.readthedocs.io/en/latest/notebooks/tour_of_pygam.html
https://avoid.overfit.cn/post/ef3f8a5743d84b4d879b74cd92bb12d5
作者:Mehul Gupta