泡菜蟒封口

Pickle python closure

提问人:kramernikki 提问时间:6/26/2023 最后编辑:kramernikki 更新时间:6/26/2023 访问量:37

问:

这是我为我的 lightGBM 模型自定义的目标函数。但是,由于关闭,我无法腌制我的模型。有解决方法吗?我的目标函数如下图所示:

def custom_asymmetric_train_wrapper(delta,tau):
   def custom_asymmetric_train(y_true, y_pred):
       residual = (y_true - y_pred).astype("float")
       grad = np.where(residual>0, -2*delta*residual, -2*residual)
       hess = np.where(residual>0, 2*tau, 2.0)
      return grad, hess
   return custom_asymmetric_train

我已经尝试了 joblib 以及将参数 delta 和 tau 添加到 custom_asymmetric_train 函数中

Python 闭包泡

评论


答:

1赞 tdelaney 6/26/2023 #1

闭包保存每次调用中使用的 和 值。但是类是可挑剔的,并且通过更多的输入来做同样的事情。deltatau

class CustomAsymmetricTrain:

    def __init__(self, delta, tau):
        self.delta = delta
        self.tau = tau
        
    def __call__(self, y_true, y_pred):
       residual = (y_true - y_pred).astype("float")
       grad = np.where(residual>0, -2*self.delta*residual, -2*residual)
       hess = np.where(residual>0, 2*self.tau, 2.0)
      return grad, hess

使用 and 值实例化类,然后根据需要调用生成的对象。使用高度人为的数据:deltatau

custom_asymetric_train_1 = CustomAsymmetricTrain(1, 2)
result1 = custom_asymetric_train_1(3, 4)
result2 = custom_asymetric_train(4, 5)

评论

0赞 kramernikki 6/26/2023
如何为模型设置目标? 但是,我现在执行以下操作,但是,我收到错误:TypeError:未知类型的参数:objective,got:CustomAsymmetricTraintrain_objective = CustomAsymmetricTrain(delta,tau)lgb_model.set_params(**{'objective': train_objective}, metrics=['custom_asymmetric_valid'])
0赞 tdelaney 6/26/2023
这是出乎意料的。我不知道为什么 api 会闭包而不是其他可调用对象。我对 lightGBM 一无所知,很难说。从文档中可以看出,目标可以是任何可调用。您可以查看该行周围的源,该行无法看到它如何测试可调用。