【问题标题】:Setting a custom loss for sklearn gradient boosting classfier为 sklearn 梯度提升分类器设置自定义损失
【发布时间】:2019-11-03 01:18:03
【问题描述】:
Sklearn 梯度提升分类器接受偏差和指数损失,详见 here 和 here。但是,我们能否传递自定义损失而不是其预定义损失(“偏差”或“指数”损失)。
关于 stackoverflow 的类似问题以及为什么他们没有回答我的问题:
我已经找到了this question,它看起来最相关。 但是它根本没有涵盖我的问题,因为它没有讨论如何将自定义损失传递给 GradientBoostingClassifier。
this question 看起来也很相关,但是一旦定义了一个类(如答案中所述),答案并没有解释,如何将其作为参数传递给 GradientBoostingClassifier。 p>
【问题讨论】:
标签:
python
machine-learning
scikit-learn
【解决方案1】:
为此,您应该创建“BaseGradientBoosting”的子类以及第一个子类和 GradientBoostingClassifier(在分类情况下)类的子类。在第一个类中,您应该在 super().__init__ 中传递自定义损失函数的名称,在第二个子类中,您可以将自定义损失函数的名称作为 _SUPPORTED_LOSS 传递。
另外,要在SKlearn梯度提升中关闭_check_params的ValueError,你必须重写这个函数,或者考虑这个函数的异常。
例如:
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 的所有参数。
嗯,这是很多工作,但我找不到更好的解决方案。我希望这会有所帮助。
附:顺便说一句,你是对的,提到的链接没有回答你的问题。