Sklearn 梯度增强分类器接受偏差和指数损失,详见here https://scikit-learn.org/stable/modules/ensemble.html#gradient-boosting and here https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html。但是,我们可以传递自定义损失而不是预定义损失(“偏差”或“指数”损失)。
stackoverflow 上的类似问题以及为什么他们不回答我的问题:
我已经找到了这个问题 https://stackoverflow.com/questions/55076833/adjust-custom-loss-function-for-gradient-boosting-classification,这看起来最相关。But它根本没有涵盖我的问题,因为它没有讨论如何将自定义损失传递给 GradientBoostingClassifier.
Also 这个问题 https://stackoverflow.com/questions/40720878/customize-loss-function-sklearn看起来相关,but答案没有解释一旦定义了一个类(如答案中所述),如何将其作为参数传递给 GradientBoostingClassifier。
为此,您应该创建“的子类”基础梯度提升 https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/_gb.py#L1269“以及第一个子类和 GradientBoostingClassifier(在分类情况下)类的子类。在第一个类中,您应该在super().__init__
,在第二个子类中,您可以将自定义损失函数的名称作为_SUPPORTED_LOSS
.
此外,要关闭ValueError
of _check_params
在 SKlearn 梯度提升中,您必须重写此函数,或者考虑此函数的例外。
例如:
class my_base_gradient_boost(BaseGradientBoosting, metaclass=ABCMeta):
@abstractmethod
def __init__(self, *args):
super().__init__(loss='my_custom_loss', *other_args)
def _check_params(self):
try:
super()._check_params()
except ValueError as e:
if str(e) == "Loss 'my_costum_loss' not supported. ":
self.loss_ = self.my_costum_loss
else:
raise
class my_classifier(my_base_gradient_boost, GradientBoostingClassifier):
_SUPPORTED_LOSS = ('my_costum_loss')
@_deprecate_positional_args
def __init__(self, *args):
super().__init__(*args)
请记住,*args 是 BaseGradientBoosting 的所有参数。
嗯,这是很多工作,但我找不到更好的解决方案来做到这一点。我希望这有帮助。
附:顺便说一句,你是对的,所提到的链接并不能回答你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)