Scikit-learn: Poisson、gamma 和 tweedie 损失函数家族

创建于 2015-12-07  ·  57评论  ·  资料来源: scikit-learn/scikit-learn

我希望 sklearn 支持 Poisson、gamma 和其他 Tweedie 系列损失函数。 这些损失分布在工业中广泛用于计数和其他长尾数据。 此外,它们在其他库中实现,例如 R: GLM、GLMNET、GBM ext。 实现这些分布的一部分是包括一种将偏移量传递给损失函数的方法。 这是在对这些分布使用日志链接函数时处理暴露的常用方法。

sklearn 社区是否愿意添加这些损失函数。 如果是这样,我或(希望其他人)愿意研究在 sklearn API 中实现这些损失函数和偏移的可行性。 谢谢

New Feature

最有用的评论

@thenomemac您关于由于曝光而改变的损失函数是绝对正确的,我错了。 事实上,我相信我已经解决了。 我有一个非常早期的 WIP(更多只是在玩): https ://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py(查看_poisson_loss()函数)。

@josef-pkt 谢谢,我查看了 statsmodels 实现,它实际上非常好(API 除外,我不喜欢它)。 实际上,他们的“计数”模型支持其他基于计数的回归,例如负二项式,这实际上更通用一些。 statsmodel 的实现已经考虑了暴露和正则化(这也是我一直在寻找的)。

鉴于 statsmodels 有一个实现,你认为在sklearn中有这样的东西仍然有价值吗? 如果是这样,我可以尝试付出更多努力将其转化为可用的形式。 我最近工作很忙,所以没有太多时间。

所有57条评论

我认为我们至少应该添加一个泊松回归,尽管我对它不是很熟悉。
你有开放的示例数据集吗?
伽马损失用于什么样的数据?

你能详细说明一下偏移量吗?

我认为这些都是linear_model中的单独模型。 我不确定他们是否通常使用 l-bfgs 来学习,或者人们是否使用 CD 求解器? 也许@mblondel@larsmans@agramfort知道更多?

泊松分布广泛用于对计数数据进行建模。 它可以被证明是二项式的正态近似的限制分布,其中试验次数趋于无穷大,概率趋于零,并且两者都以 np 等于您的过程的某个平均频率的速率发生。 Gamma 可以理论上证明是泊松事件发生之前的时间。 因此,例如,您今年将发生的事故数量理论上可以证明是泊松的。 直到下一次事故或第三次分机的预期时间是伽马过程。 Tweedie 是这些分布的广义父级,它允许在零上附加权重。 将 tweedie 视为建模损失美元,所有客户中有 99% 的权重为零,其余的则有长尾正损失或 gamma。 在实践中,这些分布广泛用于保险、灾害建模、灾害模型、金融、经济学和社会科学中的回归问题。 随意参考维基百科。 我希望将这些损失函数作为 glmnet、GBM 和随机森林中的选择。 这意味着在 GBM 中,例如 Freedman 的提升算法将使用此损失而不是高斯或四分位数损失。 Gamma 和 poisson(beta tweedie)已经在 Rs GBM 和 glm 包中,并且 xgboost 有一些支持。 从业者使用偏移量通过曝光来加权他们的数据。 通常,泊松模型具有链接函数 ex:yhat=offset x exp(回归模型输出)称为对数链接并且是最常见的。 在这里,偏移量允许针对不同的观察单位以不同的方式捕获曝光。 泊松过程是相加的,但不同的示例可能已在不相等的空间或时间或客户数量上采用,因此每次观察都需要偏移向量。 我愿意解决这个问题,但我对 api 不是很熟悉,所以我很感激建议,所以我做对了,并把它融入了发行版。

好的,我正在努力实现这一点。 我添加了上面提到的三个分布和偏移量。 我会感谢一般 sklearn 观众对如何实施偏移的反馈。 我计划在 GradientBoostedRegression 调用 'offset=None' 中添加一个新参数,其中 offset 是一个向量,类似于长度为 n(样本数)的对象。 我的主要问题是我是否应该向所有损失函数(Gaussian、Huber、Quantile)添加偏移量,例如在 R 的 GBM 实现中完成,或者我是否应该只添加使偏移量与 tweedie 系列一起使用并在尝试时发出警告使用带有不受支持的损失函数的偏移量?

我更多地要求实际用例,例如数据集或出版物。 我知道发行版的作用;)

这可能是一个很好的补充,但我不能保证你的贡献会被合并。 在你加入之前更广泛地讨论它可能会很好。除非你只是想为自己实现它而不关心我们是否合并它;)

所以我认为你最感兴趣的是梯度提升,而不是线性模型?

ping @pprett @glouppe @arjoly

我有兴趣将它整合到所有地方,但主要是树合奏
第一的。 无论哪种方式,它们都是随机森林的大量重复工作
和 GBM 对于每个损失函数都有不同的 ABC。 所以我可以做
不幸的是,这项工作一次并在两者中都起作用。 我也可以得到一些
数据集。 合并这个什么过程的过程是什么样的
我应该跟随吗? 我是新来的贡献者,所以想确保它已经完成
正确的。 但就像我说的那样,GBM 将损失类别独立于其他任何东西
在 sklearn 中,因此我对 GBM 的更改可以轻松独立。 我只需要
在 .py 脚本中编辑代码。
2015 年 12 月 10 日下午 4:57,“Andreas Mueller” [email protected]写道:

我更多地要求实际用例,例如在数据集或
出版物。 我知道发行版的作用;)

这可能是一个很好的补充,但我不能向你保证
您的贡献将被合并。 讨论它可能会很好
在你加入之前更广泛地进行。除非你只是想实现它
你自己,不在乎我们是否合并它;)

所以我认为你最感兴趣的是梯度提升,而不是线性
楷模?

ping @pprett https://github.com/pprett @glouppe
https://github.com/glouppe @arjoly https://github.com/arjoly


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -163761067
.

很高兴能从我们的 GBM 专家那里得到一些我在上面 ping 过的意见,但您也可以写信给邮件列表,询问人们是否对添加感兴趣。

您是否还计划支持具有 L1/L2 惩罚的坐标求解器
像_glmnet
?_

关于这个问题的任何更新? 我希望看到泊松回归添加到linear_models中,所以我不必冒险使用sklearn 。 如果没有人积极致力于它,我可以尝试实施它。

没有人AFAIK。

不要犹豫,尝试一下并分享 WIP 实现。

我本来打算做这件事的,现在我还在做。 如果我这样做,虽然我
需要一种干净的方法来向 api 添加偏移量。 我正在考虑添加一个
offset kwarg,默认值可以是 None ,如果丢失则发出警告
不是泊松。 我主要使用泊松进行保险建模,其中
偏移量是对数(获得的曝光)我从实验和分布中知道
理论上,对于稀疏计数数据,您将获得一个非常低劣的模型
没有偏移量。 目前R的线性模型和GBM都支持泊松
有偏移量。 这就是我目前的首选工具。 我想将此添加到
sklearn 虽然如果其他人想要它添加。
2016 年 5 月 1 日凌晨 4:03,“Alexandre Gramfort” [email protected]
写道:

没有人AFAIK。

不要犹豫,尝试一下并分享 WIP 实现。


您收到此消息是因为您编写了该主题。
直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -216024458

@thenomemac你有我可以看看的 WIP 实现吗?

对于偏移量,您难道不能只要求用户将其计数除以偏移量/曝光量以使“y”值成为比率而不是计数(https://en.wikipedia.org/wiki/Poisson_regression#. 22Exposure.22_and_offset)? R 的 GLM 包有一个很好的接口用于指定模型(包括指定偏移量),但不确定它如何适合现有的线性模型 API。

@bjlkeng我还没有完成 WIP 实现。 我开始了一段时间,然后分心了。 我不认为除以曝光以获得泊松率是对泊松损失的 GBM 算法的正确推导。 梯度中的 offset=log(exposure) 是一个附加因子。 因此,您实际上是在给曝光率较高的“区域”赋予更多权重。 不是 100% 确定您是否可以在每次拟合基学习器(树)的迭代中恢复到正确的梯度,因为当前将权重传递给树学习器的方案是乘法而不是加法。 我将尝试对我所指的内容进行更严格的数学推导。 我可以说,在实践中它确实很重要。 在现实世界的数据集中,我已经对您期望计数数据为泊松的地方进行了建模,使用 R 的 gbm 将更快地收敛并获得更好的结果,因为它以“数学上”正确的方式处理偏移量。 而其他 gbm 实现(例如具有泊松损失函数的 xgboost)无法像建议的那样使用泊松率对数据进行建模。

(除了我在 stats.stackexchange 上找到了这个问题的链接

statmodels GLM有offset和exposure(只对log链接有exposure)

在 master 现在有一个 GLM 和其他一些模型的弹性网络选项,通过 apython 循环实现坐标下降(使用带有偏移的通用最大似然)

在 master 中,现在还有 GLM 的 Tweedie 家族。 但是,它不使用完整的对数似然损失函数,因为这是项的无限总和,并且计算截断版本很慢,并且常用的近似值在参数空间的某些范围内不是很准确

因此,如果您需要参考实现,statsmodels 有这些部分。 我从来没有听说过或看过 GLM 的 GBM。 我对 scikit-learn 代码的了解也不够多,无法说明它如何适应。
)

@thenomemac您关于由于曝光而改变的损失函数是绝对正确的,我错了。 事实上,我相信我已经解决了。 我有一个非常早期的 WIP(更多只是在玩): https ://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py(查看_poisson_loss()函数)。

@josef-pkt 谢谢,我查看了 statsmodels 实现,它实际上非常好(API 除外,我不喜欢它)。 实际上,他们的“计数”模型支持其他基于计数的回归,例如负二项式,这实际上更通用一些。 statsmodel 的实现已经考虑了暴露和正则化(这也是我一直在寻找的)。

鉴于 statsmodels 有一个实现,你认为在sklearn中有这样的东西仍然有价值吗? 如果是这样,我可以尝试付出更多努力将其转化为可用的形式。 我最近工作很忙,所以没有太多时间。

我认为这仍然很有价值。

@bjlkeng感谢您的评论! 你有兴趣接受它并提出拉取请求吗? 如果不是,我可以尝试解决这个问题并尝试进行 PR ......首先是泊松,然后是伽玛...... @agramfort你可以吗? :)

@raghavrv ,抱歉回复晚了。 工作变得很忙,而且我意识到这需要比我有时间更长的时间。 所以请随时继续。 我会看一下 statsmodel 的实现,因为它们具有我认为您想要的大部分功能。

@raghavrv你开始做这个了吗? 我也可以做出贡献,以便我们在 sklearn 中至少有泊松回归。

@btabibian @raghavrv这是什么状态? 我需要一个项目的泊松回归实现,并且愿意做出贡献。

请继续:)我没有时间做这个对不起......

我也一样没时间。 我也一直在努力使用 API 以及如何
整合偏移量。 我可以在 statsmodels 中显示数学或代码示例。
但是 TLDR 如果要使用泊松回归,则需要偏移量
不相等的曝光(面积或时间),那么你需要偏移量。 模型不
如果您只是将计数除以曝光,请给出正确的权重。

2017 年 4 月 1 日下午 2:49,“(Venkat) Raghav (Rajagopalan)”<
通知@github.com> 写道:

请继续:)我没有时间做这个对不起......


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-290939521
或使线程静音
https://github.com/notifications/unsubscribe-auth/AOeuWjVGf3-VmeasNHMLQAB1dnd4zuUQks5rrpw4gaJpZM4Gwd6-
.

那时我会开始研究它。 @thenomemac感谢您的提示! 我将检查 statsmodels 的实现,看看它们是如何处理曝光的。

您好,请问有更新吗? 是否也可以添加负二项似然? 这对泊松应该没有太大的影响。 否则我可以调查一下这个..

最好的,
西蒙

@dirmeier ,不幸的是不是。 我已切换到分层贝叶斯模型,但从未着手实施泊松回归。

@dirmeier@jakobworldpeace是否有一些正在进行的工作,您可以指出我们吗? 我也可以跳过去看看这个?

@NickHoernle
我目前正在使用 R 进行 NB 回归,因为我没有时间。 如果你想实现这个我会很高兴:)

@NickHoernle没有 WIP,但 statsmodels Poisson 回归实现应该可以帮助您入门。

优秀。 我会开始看看这个,看看我们会得到什么。

我一直在这里研究 GLM: https://github.com/madrury/py-glm。

我不打算将其合并到 sklearn 中,它确实是供我的学生在课堂上使用的,但我想指出这项工作,以防它对解决此问题的任何人有用。

您的求解器采用牛顿法,很难在高位进行缩放
方面。 它也不支持 L1 类型的惩罚。 还要检查你的 API
与 sklearn 保持一致。 拟合应该只取 X、y 和 sample_weights

要解决可伸缩性问题,首先要做的是使用 l-bfgs。 看
我们的逻辑回归代码

高温高压

正如我所说,我的目标不是与 sklearn 完全一致,它只是有一个遵循 MuCullagh 和 Nelder 的简单实现,并提供一些推理工具(我认为这超出了 sklearn 的范围)。 它旨在用于中等规模数据集的课堂环境。 我只是想在这里链接代码,以防有任何想法对使用 sklearn 的此功能的任何人有用(并且获得一点曝光,从不伤害)。

我不认为 L1 惩罚在范围内,因为我只会使用glmnet 。 L2 非常简单,可以合并到我继续添加的经典 GLM 框架中。

至于fit方法,我在这里冒昧地做一个小评论,希望它不会显得格格不入。 缺少offset以适应我的上一份工作,这是 sklearn 没有在我上一份工作中流行起来的重要原因。 您确实需要它来进行适当的保险建模。 监管机构希望 Poisson 和 Tweedie 模型能够以这种方式匹配,并且他们的期望可能非常严格。

感谢您澄清愿景。

关于偏移量是否特定于 Poisson 和 Tweedie 模型?
如果它是一个特定于样本的值,那么它可以是一个合适的 sample_prop
参数。
它只是不依赖于数据的 max_iter 或 tol 应该在
初始化。

必须与#9405 比较?

@agramfort您对max_iter和tol是正确的,我会将它们移至__init__。

您对sample_prop的含义有参考吗?

https://github.com/scikit-learn/enhancement_proposals/pull/6

仍在讨论什么是最好的方法......

关于偏移量的简短说明:AFAIK,样本权重足以处理曝光,即用 sample_weight=exposure 拟合 y=values/exposure 应该可以完成这项工作,并且可以很好地推广到除 Poisson 之外的其他分布和链接以及 log-link。

@madrury感谢分享。 我会看看你的实现并与我的比较。

人们仍然对此感兴趣吗? 我有兴趣做出贡献。

如果有人将它添加到 sklearn,我仍然对该功能感兴趣。

2017 年 12 月 21 日星期四下午 6:04,Jared Samet通知@github.com
写道:

人们仍然对此感兴趣吗? 我有兴趣做出贡献。


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-353479618
或使线程静音
https://github.com/notifications/unsubscribe-auth/AOeuWtvi4Um_o_ERuVe1ob86201G-ASdks5tCuP4gaJpZM4Gwd6-
.

@oracleofnj @thenomemac

我在我的 py-glm 库中有一个经过验证的通用 glm 实现,但没有计划尝试将它合并到 sklearn 中(我做出了一些设计决定,使其与 sklearn 不兼容)。 它的设置使得添加其他指数族应该非常容易。

我还有一个完整的纯 python glmnet 实现,它支持同一个库中的相同指数族,但我遇到了一个错误,我把它放下了。 我希望得到一些帮助来解决这个错误,只需要一些动力来恢复它。

@madrury 很高兴尝试帮助您解决该错误。

您好,为这些发行版构建了什么? 对任何更新感到好奇。 谢谢。

我个人可以关闭此问题以帮助贡献者
重点。 原因:

  • 蟒蛇的格局发生了变化

  • statsmodels 现在更加成熟,包括这些分布
    适当的曝光权重

  • 通过 pytorch 或 tensorflow 基于 jit 的实现更容易
    在没有性能损失或包的情况下实施任何 esotaric 损失
    重新编译

想法?

我们目前正在分配资源来帮助
https://github.com/scikit-learn/scikit-learn/pull/9405
并使其(至少某些部分)登陆master。 应该解决
接下来的几个月。

很棒的工作!

2019 年 4 月 13 日,星期六,凌晨 3:27,Alexandre Gramfort [email protected]
写道:

我们目前正在分配资源来帮助
https://github.com/scikit-learn/scikit-learn/pull/9405
并使其(至少某些部分)登陆master。 应该解决
接下来的几个月。


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-482784732
或使线程静音
https://github.com/notifications/unsubscribe-auth/AOeuWj8PD0nfltM7Acg12Pfhl4sG5n7Fks5vgYbogaJpZM4Gwd6-
.

在 sciki-learn 中使用 GLM 会很棒。 这将减少使用其他语言的需要。 期待它。

同意。 来自 R 世界,我很惊讶 sklearn 还没有 GLM 功能。 我希望它会很快。

我将添加另一票以将 GLM 包含在 sklearn 中。 这是在本科统计课程中教授的核心模型类。 此外,用户手册中有一个“广义线性模型”部分不包括任何关于链接函数或错误分布的讨论,这让我感到惊讶。

@patrickspry Statsmodels 很好地实现了本科生会学习的大多数 GLM。

@patrickspry https://github.com/scikit-learn/scikit-learn/pull/9405中有一个相当完整的 PR,并且正在进行合并该功能的工作。

哦,太棒了! 感谢您的提醒!

有任何合并 PR 的预计时间表吗? 谢谢。

@Jiang-Li 看这里

对于线性模型,有#14300。 然后是未解决的问题 #15123。 我个人真的很想看到带有 tweedie 损失函数的基于树的模型。

对于线性模型 #14300 现在已合并,尽管仍可以添加其他功能https://github.com/scikit-learn/scikit-learn/pull/9405#issuecomment -594553953

我个人真的很想看到带有 tweedie 损失函数的基于树的模型。

这确实可能是下一步(例如 https://github.com/scikit-learn/scikit-learn/issues/15123#issuecomment-542090766)

看到 sklearn 0.23 中的出色工作令人印象深刻,其中包括 Poisson、gamma 和 tweedie。 希望以后能看到更多的改进。
阅读用户指南,逻辑回归不属于广义线性回归。 也许在广义线性回归部分至少应该有一些词说明逻辑回归是 GLM 的一种类型,可以使用相同的偏差损失函数来解决。

看起来我们现在可以关闭 #14300 合并的问题了?

阅读用户指南,逻辑回归不属于广义线性回归。 也许在广义线性回归部分至少应该有一些词说明逻辑回归是 GLM 的一种类型,可以使用相同的偏差损失函数来解决。

感谢@magicmathmandarin的反馈! 是的,一点没错。 原始 PR https://github.com/scikit-learn/scikit-learn/pull/9405实际上包括二元逻辑回归的 BinomialDistribution 偏差。 我们没有在第一个合并 PR 中包含它的原因是,即使它们确实属于同一个理论框架,但仍然推荐目前专门的LogisticRegression实现(用户测试更好,处理更多选项,例如多类),我们不想混淆用户。 现在它被合并了,我同意这部分可以更好地表述。

看起来我们现在可以关闭 #14300 合并的问题了?

当然。 在https://github.com/scikit-learn/scikit-learn/issues/16668https://github.com/scikit-learn/scikit-learn/pull/16692https 中有一些后续讨论: //github.com/scikit-learn/scikit-learn/issues/15123。

此页面是否有帮助?
0 / 5 - 0 等级