提问人:kramernikki 提问时间:6/26/2023 最后编辑:kramernikki 更新时间:6/26/2023 访问量:37
泡菜蟒封口
Pickle python closure
问:
这是我为我的 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 函数中
答:
1赞
tdelaney
6/26/2023
#1
闭包保存每次调用中使用的 和 值。但是类是可挑剔的,并且通过更多的输入来做同样的事情。delta
tau
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 值实例化类,然后根据需要调用生成的对象。使用高度人为的数据:delta
tau
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 一无所知,很难说。从文档中可以看出,目标可以是任何可调用的。您可以查看该行周围的源,该行无法看到它如何测试可调用。
评论