英文题目:Intelligible Models for Classification and Regression

中文题目:可理解的分类和回归模型

论文地址:https://www.doc88.com/p-41099846725043.html

领域:模型可解释性,广义加性模型,机器学习

发表时间:2012

作者:Yin Lou,Rich Caruana(模型可解释性大佬),康耐尔大学,微软

出处:KDD

被引量:256

代码和数据:https://github.com/interpretml/interpret

阅读时间:220819

读后感

加性模型的准确性优于线性模型,差于梯度决策树和深度学习模型.它在模型精度和可解释性间取平衡.其核心原理是针对单个特征建立模型(可以是非线性模型),然后把这些复杂模型加在一起形成最终模型.本文描述了具体实现方法.

介绍

复杂模型虽然预测精度高,但可解释性较差,因为很难判断单个特征在复杂模型中的贡献度.本文目标是建立尽量准确且可解释的模型,让用户可以理解每个特征的贡献度.使用广义加性模型(GAMs)方法,其核心算法如下:

Pasted image 20220819153525.png

将 g 称为 link 函数,f 称为 shape 函数,g 和 f 可以是任何函数,比如非线性函数,对于单个特征建模 f,f 可以有很高的复杂度,但特征之间组合比较简单,只能是叠加关系.

比如下式就是一个加性模型的示例:

\[ y=x_1+x^2_2+\sqrt{x^3}+log(x_4)+exp(x_5)+2sin(x_6)+\epsilon \]

对应的每个特征影响如图 -1 所示,可以分别看到每个特征对 y 的影响.

Pasted image 20220820144739.png

每个 shape 函数都可以是非线性的,这也是加性模型效果优于线性模型的原因.表 -1 展示了各种模型的基本公式:

Pasted image 20220819154738.png

方法

设数据集中有 N 个实例,每个实例有 n 个特征{xi1...xin},标签为 yi.目标是构建函数 F(x),最小化损失函数 L(y,F(x)).

Pasted image 20220820154911.png

具体实现方法涉及两个维度,对于单特征训练的 shape 模型,一般使用样条函数或者树模型(图 -4 中的纵向);对于 shape 模型的组合训练方法(图 -4 中的横向),即如何训练整体模型,则可选用最小二乘法,梯度提升和回修法.

shape 函数

文中提到的 shape 函数有样条函数和集成树函数,所有 shape 函数只涉及单个特征作为输入.

样条函数

样条是一种特殊的函数,由多项式分段定义.比如三次样条中的每一段都由三次多项式表示,且整体是一条光滑的曲线,三次多项式形如:

\[ y=a_i+b_ix+c_ix^2+d_ix^3 \]

文中使用了设置维度为 d 的回归样条函数:

Pasted image 20220820150922.png

树和集成树模型

使用二叉树和集成二叉树方法,用叶节点个数可描述树的复杂度.树模型的每个分叉是对同一特征的不同值范围进行切分.支持的树包括:Single Tree,Bagged Trees,Boosted Trees,Boosted Baaged Trees.后面的实验中将首字体作为其方法的缩写.

训练整体模型

用以下方法训练整体模型,用最小二乘训练样条函数,用梯度提升和回修训练树模型.

最小二乘法

最小二乘法可以很好的训练线性模型,这里将 bk(x) 看成特征,训练拟合参数 Bk.另外,还加入了平滑系数 λ.实验中将该方法称为惩罚最小二乘,记作 P-LS.对于逻辑回归问题,将样条被简化为用不同的基拟合逻辑回归,方法称为惩罚迭代重加权最小二乘,记作 P-IRLS。

Boosting 梯度提升法

在每一次迭代中,循环地依次训练所有特征,具体方法如下:

Pasted image 20220819175637.png
  • line 1: 将每个 shape 函数初值设为 0
  • line 2: 一共 10 次迭代:M=10
  • line 3: 遍历所有特征:假设一共三个特征 n=3
  • line 4: 这里构造了一个数据集合 R,对于所有实例 i=1...N,其自变量是实例中是第 j 个特征 xij,因变量是将每个实例 i 代入当前所有 f 后(有几个特征就有几个 f,这里用 k 表示特征数)计算预测值,然后计算预测与真值 y 的残差.
  • line 5:学习 Shape 函数 S,利用第 j 个特征 x,训练 S(x) 用于拟合 R,之所以是 Boosting,是因为它拟合的不是 y 本身,而是拟合残差
  • line 6:利用拟合的残差函数 S 调整更新第 j 个特征的拟合函数 fj

Backfitting 回修法

回修法是之前拟合加性模型的主流方法,它与梯度提升方法非常类似,差别在伪代码的第 4 行和第 6 行,在第 4 行,回修法的 fk 不包含其本身对应的第 fj;而第 6 行,直接用 S 替换 fj.对比可以看出梯度提升拟合的是残差,而回修法拟合的是 fj 本身,因此,随着数据不同,回修的波动可能相对较大,最终可能难以收敛.

实验

图 -3 对比了梯度提升和回修方法对回归 (a,b,c) 和分类 (d,e,f) 的建模效果,可以看到,当叶节点过多时,在训练集中效果好,但在测试集上效果差,回修法效果相对不稳定.

Pasted image 20220820160348.png

图 -5 对比了使用不同 Shape 函数的效果,第一行样条函数由于追求拟合曲线的平滑,在数据较少的位置拟合效果较差,这可能是由于样条过于平滑,学不出细节.相对来说第二行的树模型效果更好.

Pasted image 20220820160329.png

表 -5 展示了主实验结果,这里使用了 6 个回归数据集,从实验结果的均值可以看到,复杂模型效果最好,加性模型中,BST-bagTRX 效果最好,它是梯度提升的 Bagging 树,X 表示随机设置叶节点数.

Pasted image 20220820155313.png

比较有意思的是,在 BST-bagTR 类中,叶节点 2-4,效果最好,这可能是由于叶节点太多可能造成过拟合.

图 -6 展示了回归中各个模型的偏差和方差,偏差描述了模型预测结果和实际 y 之间的差异,方差用于评价子学习器学出结果的一致性,以评价稳定性(常用交叉验证的方法测量方差).可以看到对于所有数据集,位于中间偏左的梯度提升 + 树模型效果都最好.

Pasted image 20220820160648.png

扩展阅读

GA2M

Accurate Intelligible Models with Pairwise Interactions

是同一作者写的另一篇基于 GAM 的优化,将基于单个特征的加性模型扩展为基于特征组合的加性模型.核心公式如下:

Pasted image 20220819165923.png

其核心方法在于如何选择和优化特征组合,实验证明在有些情况下比 lightgbm 更好.

实际使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from pygam import LinearGAM, s, f

# 生成样本数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.3, size=40)

# 使用 LinearGAM 拟合模型
gam = LinearGAM(s(0) + f(0))
gam.fit(X, y)

# 使用线性回归模型拟合数据
reg = LinearRegression().fit(X, y)

# 生成预测数据
XX = np.linspace(0, 5, 1000).reshape(-1, 1)
y_pred_gam = gam.predict(XX)
y_pred_reg = reg.predict(XX)

# 画出数据图像
plt.plot(X, y, 'o', label='Observations')
plt.plot(XX, y_pred_gam, 'r', label='GAMLinear')
plt.plot(XX, y_pred_reg, 'g', label='Linear Regression')
plt.legend(loc='best')
plt.show()

注意:"f" 和 "s" 是两个重要的概念,"f" 指的是预测变量与响应变量之间的非线性关系。"s" 指的是预测变量与响应变量之间的线性关系。其中的参数指对哪一个变量操作,这里 x 只有一个变量,所以都是针对 0 操作。