目录

  • 0 代码示例
  • 1 安装pyGAM
  • 2 分类案例
    • 2.1 基本使用
    • 2.2 部分依赖图(Partial dependency plots)
    • 2.3 调整光滑度和惩罚
    • 2.4 自动调参
  • 3 完整的pyGAM模型
  • 4 测试参数
    • 4.1 测试惩罚项
    • 4.2 测试样条函数的数量
    • 4.3 测试不同的约束
  • 5 小问题

0 代码示例

全部代码示例请参考:

  • https://github.com/Alex2Yang97/Learning_tutorials/tree/main/gam_model

1 安装pyGAM

pip install pygam

在statsmodels.api中,也有GAM相关包。比如

from statsmodels.gam.api import GLMGam, BSplines

2 分类案例

2.1 基本使用

我们使用LogisticGAM来进行分类处理,通过load_breast_cancer来导入数据。

import pandas as pd
from pygam import LogisticGAM
from sklearn.datasets import load_breast_cancer#load the breast cancer data set
data = load_breast_cancer()#keep first 6 features only
df = pd.DataFrame(data.data, columns=data.feature_names)[['mean radius', 'mean texture', 'mean perimeter', 'mean area','mean smoothness', 'mean compactness']]
target_df = pd.Series(data.target)
df.describe()

建立模型。

X = df[['mean radius', 'mean texture', 'mean perimeter', 'mean area','mean smoothness', 'mean compactness']]
y = target_df
#Fit a model with the default parameters
gam = LogisticGAM().fit(X, y)

查看结果。summary()提供了很多统计量,比如AIC,UBRE,修正R^2。

gam.summary()

查看拟合准确率。

gam.accuracy(X, y)

2.2 部分依赖图(Partial dependency plots)

gam的优势之一是,gam的可加性让我们能够控制其他变量,来探究和解释某一个变量。通过generate_X_grid来帮助我们产生合适的画图数据。

lt.rcParams['figure.figsize'] = (28, 8)
fig, axs = plt.subplots(1, len(data.feature_names[0:6]))
titles = data.feature_namesfor i, ax in enumerate(axs):XX = gam.generate_X_grid(term=i)ax.plot(XX[:, i], gam.partial_dependence(term=i, X=XX))ax.plot(XX[:, i], gam.partial_dependence(term=i, X=XX,   width=.95)[1], c='r', ls='--')ax.set_title(titles[i])
plt.show()


我们能够看到一些有趣的结果,有一些变量和目标值之间有非常明显简单的线性关系;但是有一些变量和目标值之间有着很强的非线性关系。我们非常想要结合这些图像的可解释性,并且防止GAM过拟合,从而提出一个能够推广到持久数据集的模型。

部分依赖图(Partial dependency plots)非常有用,因为他们具有高度的可解释性,并且易于理解。比如,在第一个测试结果中,我们可以说the mean radius of the tumor 和the response variable具有很强的关系;the mean radius of the tumor越大,是malignant(恶性)的可能性越大。

对于其他的特征,比如the mean texture很难解释,并且我们已经推断我们希望有一条更平滑的曲线。(我的理解是,有先验知识的情况下,我们通过设置约束,强制让某一个特征对目标值有着单调递增或递减的特性,或者调整样条函数的数量。)

2.3 调整光滑度和惩罚

主要调整的参数有三个,n_splines,lam,和constraints。

  • n_splines:用来拟合的spline函数(样条函数)的数量
  • lam:惩罚项(在整个目标函数中乘以二阶导数)
  • constraints:允许用户指定函数是否应具有单调约束的约束列表。包括[‘convex’, ‘concave’, ‘monotonic_inc’, ‘monotonic_dec’,’circular’, ‘none’]

默认情况下:

  • n_splines = 25
  • lam = 0.6
  • constraints = None

更改n_splines让曲线变得更光滑。(值得注意的是,如果惩罚项,如果对于每一个特征都是一样的值,则不需要写成list形式;如果不一样的值,那么可以写成列表)

lambda_ = 0.6
n_splines = [25, 6, 25, 25, 6, 4]
constraints = None
gam = LogisticGAM(constraints=constraints, lam=lambda_,n_splines=n_splines).fit(X, y)

画出图像后,可以看到,之前不平滑的特征部分依赖图(partial dependency plots)变得平滑了。

如果我们强制平滑后,准确度下降了,说明我们损失了一部分信息(没有捕捉到部分信息),不过同样,准确度的下降也表明我们可以将多少我们的直觉加入到模型中。

参数lam控制着惩罚程度,就算我们将n_splines设置的很大,但是惩罚很大的话,函数图像可能仍然会出现直线。

2.4 自动调参

通过gridsearch来自动选择参数。默认参数是一个字典类型的lam,{‘lam’:np.logspace(-3,3,11)}

gam = LogisticGAM().gridsearch(X, y)

有三种方式:

1、通过网格,将grid变成list,搜寻的数量一共有2**6个。(6个特征)

>>> lam = np.logspace(-3, 3, 2)
>>> lams = [lam] * 6
>>> gam.gridsearch(X, y, lam=lams)

2、直接将网格变成np.ndarray,当搜索的空间非常大的时候,我们会随机进行搜索。

>>> lams = np.exp(np.random.random(50, 4) * 6 - 3)
>>> gam.gridsearch(X, y, lam=lams)

3、copying grids for parameters with multiple dimensions. if we specify a 1D np.ndarray for lam, we are implicitly testing the space where all points have the same value

>>> gam.gridsearch(lam=np.logspace(-3, 3, 11))

或者

>>> lam = np.logspace(-3, 3, 11)
>>> lams = np.array([lam] * 4)
>>> gam.gridsearch(X, y, lam=lams)

3 完整的pyGAM模型

使用留出数据集是最好的权衡模型的偏差-方差的方法。pyGAM很好地适应sklearn的工作流程,因此这一步骤很像拟合sklearn模型。

首先是分离训练集和测试机。

import numpy as np
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
gam = LogisticGAM().gridsearch(X_train, y_train)

预测。

from sklearn.metrics import accuracy_score
from sklearn.metrics import log_loss
predictions = gam.predict(X_test)
print("Accuracy: {} ".format(accuracy_score(y_test, predictions)))
probas = gam.predict_proba(X_test)
print("Log Loss: {} ".format(log_loss(y_test, probas))

下面,减小样条函数(spline)的数量,来看一下准确率。

lambda_ = [0.6, 0.6, 0.6, 0.6, 0.6, 0.6]
n_splines = [4, 14, 4, 6, 12, 12]
constraints = [None, None, None, None, None, None]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
gam = LogisticGAM(constraints=constraints, lam=lambda_,n_splines=n_splines).train(X_train, y_train)
predictions = gam.predict(X_test)
print("Accuracy: {} ".format(accuracy_score(y_test, predictions)))
probas = gam.predict_proba(X_test)
print("Log Loss: {} ".format(log_loss(y_test, probas)))

4 测试参数

使用LinearGAM,进行测试。

from sklearn.datasets import load_boston
from pygam import LinearGAMboston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
target_df = pd.Series(boston.target)
df.head()

4.1 测试惩罚项

lambda_list = [0.01, 0.1, 1, 10, 100]
for lambda_ in lambda_list:constraints = Nonegam = LinearGAM(constraints=constraints, lam=lambda_).fit(X.values, y)print(f'\nlambda_: {lambda_}')plot_feature_plot(gam)


根据图像可以看出,惩罚越大,拟合的曲线越平滑。

4.2 测试样条函数的数量

n_splines_list = [[4]*13, [10]*13, [100]*13, [1000]*13]
for n_splines in n_splines_list:constraints = Nonegam = LinearGAM(constraints = constraints, n_splines = n_splines).fit(X.values, y)print(f'\nlambda_: {n_splines}')plot_feature_plot(gam)



样条函数越多,拟合越好,但是过多之后,会出现过拟合。

4.3 测试不同的约束

constraints_list = ['convex', 'concave', 'monotonic_inc', 'monotonic_dec', 'none']# circular这里无法使用
for constraints in constraints_list:gam = LinearGAM(constraints = constraints).fit(X.values, y)print(f'\nconstraints: {constraints}')plot_feature_plot(gam)



5 小问题

计算准确率的时候

回归的暂时无法使用
LinearGAM.score(X, y)

分类可以使用
LogisticGAM.accuracy(X, y)

参考资料:
https://codeburst.io/pygam-getting-started-with-generalized-additive-models-in-python-457df5b4705f
https://pygam.readthedocs.io/en/latest/index.html

广义加性模型Generalized additive models-pyGAM的使用相关推荐

  1. R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归

    R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归 目录

  2. R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能

    R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录

  3. R语言使用mgcv包中的gam函数拟合广义加性模型(Generalized Additive Model,GAMs):从广义加性模型GAM中抽取学习到的样条函数(spline function)

    R语言使用mgcv包中的gam函数拟合广义加性模型(Generalized Additive Model,GAMs):从广义加性模型GAM中抽取学习到的样条函数(spline function) 目录

  4. R语言mgcv包中的gam函数拟合广义加性模型(Generalized Additive Model)GAM(对非线性变量进行样条处理、计算RMSE、R方、调整R方、可视化模型预测值与真实值的曲线)

    R语言mgcv包中的gam函数拟合广义加性模型(Generalized Additive Model)GAM(对非线性变量进行样条处理.计算RMSE.R方.调整R方.可视化模型预测值与真实值的曲线) ...

  5. 广义典型相关分析_数学建模/机器学习:广义加性模型(GAM)及其Python实现

    笔者做过国赛也做过美赛,其中一类典型问题就是分析相关性,从而进行预测或者其他操作.这类问题通常情况下属于比较常规的问题,一般通过matlab或SPSS分析相关性,得到一个较好的数值即可. 然而有的时候 ...

  6. python 广义线性模型_数学建模/机器学习:广义加性模型(GAM)及其Python实现

    笔者做过国赛也做过美赛,其中一类典型问题就是分析相关性,从而进行预测或者其他操作.这类问题通常情况下属于比较常规的问题,一般通过matlab或SPSS分析相关性,得到一个较好的数值即可. 然而有的时候 ...

  7. 论文阅读_广义加性模型_GAMs

    英文题目:Intelligible Models for Classification and Regression 中文题目:可理解的分类和回归模型 论文地址:https://www.doc88.c ...

  8. R语言广义加性模型GAMs:可视化每个变量的样条函数、样条函数与变量与目标变量之间的平滑曲线比较、并进行多变量的归一化比较、测试广义线性加性模型GAMs在测试集上的表现(防止过拟合)

    R语言广义加性模型GAMs:可视化每个变量的样条函数.样条函数与变量与目标变量之间的平滑曲线比较.并进行多变量的归一化比较.测试广义线性加性模型GAMs在测试集上的表现(防止过拟合) 目录

  9. R语言广义加性模型GAMs分析温度、臭氧环境数据绘制偏回归图与偏残差图

    最近我们被客户要求撰写关于广义加性模型的研究报告,包括一些图形和统计输出. 视频:R语言广义相加模型(GAM)在电力负荷预测中的应用 拓端tecdat:R语言广义相加模型(GAM)在电力负荷预测中的应 ...

最新文章

  1. 跨域cookie传递
  2. 机器学习资源和路线图
  3. 软件工程--第三周学习进度
  4. 如何在Java中选择Map/List/Set
  5. qt creator无法删除文件怎么办?(需要在cmakelists文件里配置)
  6. boost::hana::detail模块实现相关算法的测试程序
  7. Hibernate 入门----第一个Hibernate应用程序
  8. 生成.o linux,JaxoDraw下载 费曼图生成工具JaxoDraw for linux v2.1.0 官方安装版 下载-脚本之家...
  9. dubbo实现两个系统之间的通信
  10. matlab示波器的峰值测量,峰峰值定义_示波器峰峰值怎么看
  11. 持续交付+springboot+k8s
  12. SQL Server忘记密码后成功重置密码的方法
  13. Lucene.Net+盘古分词器(详细介绍)
  14. 微信小号的另一个作用
  15. 2022/7/23 日记
  16. 【雷达成像】雷达SAR成像仿真的应用(Matlab代码实现)
  17. 桑榆之年,你将如何谢幕这一生?
  18. 【前端性能优化】 --- 一次总结明白
  19. a标签中调用js的方法
  20. 区块链丨拒绝虚假信息,优化你的网络社交生活

热门文章

  1. ctp java_期货 CTP的JAVA接口 JNI实现
  2. 我在区块链上养了3万只猫,学到了8个赚钱真理
  3. Google谷歌gmail邮箱账号注册遇到:此电话号码无法用于进行验证怎么办?
  4. 什么是sem,sem具体展现方式。
  5. Android 图形之 Surface 和 SurfaceHolder
  6. java byte 和 int 转换
  7. 信号隔离器解决干扰的方法
  8. java 正则 不包含_java使用正则表达式匹配不包含某个规则的字符串
  9. 【C语言】十进制数转换成二进制数
  10. (原创)斗牛游戏 初版