使用自定义目标/损失函数的随机森林回归器(Python/Sklearn)

Posted

技术标签:

【中文标题】使用自定义目标/损失函数的随机森林回归器(Python/Sklearn)【英文标题】:Random Forest Regressor using a custom objective/ loss function (Python/ Sklearn) 【发布时间】:2018-09-04 16:59:56 【问题描述】:

我想构建一个随机森林回归器来模拟计数数据(泊松分布)。默认的“mse”损失函数不适合这个问题。有没有办法定义自定义损失函数并将其传递给 Python(Sklearn 等)中的随机森林回归器?

是否有任何实现可以将 Python 中的计数数据放入任何包中?

【问题讨论】:

最好将您的问题发布到 Stack Exchange stats.stackexchange.com @GauravS:为什么?我认为这非常适合 ***,因为它涉及库中的特定实现,而不是概念本身。 @MarcusV.:可能很少有人已经实现了它。可能他们没有将其贡献给 Python 库,但可以共享代码。 【参考方案1】:

在 R 中,编写自定义目标函数相当简单。

R 中的

randomForestSRC 包提供了编写您自己的自定义拆分规则的条款。但是,自定义拆分规则必须用纯 C 语言编写。

您所要做的就是编写自己的自定义拆分规则,注册拆分规则,编译和安装包。

自定义拆分规则必须在 randomForestSRC 源代码中名为 splitCustom.c 的文件中定义。

您可以找到更多信息 here.

定义拆分规则的文件是 this.

【讨论】:

【参考方案2】:

如果问题是计数 c_i 来自不同的曝光时间 t_i,那么确实无法拟合计数,但仍然可以使用 MSE 损失函数拟合速率 r_i = c_i/t_i,但是应该使用权重与曝光成正比,w_i = t_i。

对于真正的随机森林泊松回归,我看到在 R 中有用于构建单个 CART 树的 rpart 库,该库具有泊松回归选项。我希望这种算法能够被导入 scikit-learn。

【讨论】:

【参考方案3】:

在 sklearn 中,目前不支持此功能。请参阅相应问题 here 中的讨论,或 this 中的另一个类,他们在其中更详细地讨论了原因(主要是调用 Python 函数的大量计算开销)。

因此可以按照问题中的讨论来完成,方法是分叉 sklearn,在 Cython 中实现成本函数,然后将其添加到可用“标准”列表中。

【讨论】:

感谢您的回答。我是 Cython 的完整初学者。能否请您指出一个示例实现或提供更多详细信息? 好吧,sklearn 开发人员参考了一些链接here,我使用this 教程作为入门。 @Prag1 你过得怎么样!? :\ sklearn 的维护者应该支持自定义损失函数,即使调用 python 函数会减慢训练速度会产生额外的开销。我更关心能够灵活地进行实验。 XGBoost 可以采用自定义目标,pytorch 也可以; sklearn 做不到的感觉很古老。 xgboost.readthedocs.io/en/latest/python/… 我会尝试自己实现它,但我怀疑他们会合并我的 PR。正统是不是一个好主意,但正统不应该被当真。

以上是关于使用自定义目标/损失函数的随机森林回归器(Python/Sklearn)的主要内容,如果未能解决你的问题,请参考以下文章

测量随机森林回归器中每个预测器特征重要性对目标值的影响(量化)(目标值的提升或下降)

获取随机森林回归器训练期间使用的特征列表

随机森林回归和多输出元估计器回归对于多输出数据的回归及效果对比

随机森林、GBDT、Xgboost

R语言编写自定义函数计算分类模型评估指标:准确度特异度敏感度PPVNPV数据数据为模型预测后的混淆矩阵比较多个分类模型分类性能(逻辑回归决策树随机森林支持向量机)

提高 sklearn 中随机森林回归器的性能