【问题标题】:Setting a custom loss for sklearn gradient boosting classfier为 sklearn 梯度提升分类器设置自定义损失
【发布时间】:2019-11-03 01:18:03
【问题描述】:

Sklearn 梯度提升分类器接受偏差和指数损失,详见 herehere。但是,我们能否传递自定义损失而不是其预定义损失(“偏差”或“指数”损失)。


关于 stackoverflow 的类似问题以及为什么他们没有回答我的问题:

我已经找到了this question,它看起来最相关。 但是它根本没有涵盖我的问题,因为它没有讨论如何将自定义损失传递给 GradientBoostingClassifier

this question 看起来也很相关,但是一旦定义了一个类(如答案中所述),答案并没有解释,如何将其作为参数传递给 GradientBoostingClassifier。 p>

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    为此,您应该创建“BaseGradientBoosting”的子类以及第一个子类和 GradientBoostingClassifier(在分类情况下)类的子类。在第一个类中,您应该在 super().__init__ 中传递自定义损失函数的名称,在第二个子类中,您可以将自定义损失函数的名称作为 _SUPPORTED_LOSS 传递。

    另外,要在SKlearn梯度提升中关闭_check_paramsValueError,你必须重写这个函数,或者考虑这个函数的异常。

    例如:

    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 的所有参数。

    嗯,这是很多工作,但我找不到更好的解决方案。我希望这会有所帮助。

    附:顺便说一句,你是对的,提到的链接没有回答你的问题。

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2021-10-26
      • 2020-03-06
      • 1970-01-01
      • 2013-12-08
      • 2019-05-09
      相关资源
      最近更新 更多