如何解决catboost 中用户定义损失函数的学习曲线? model.eval_metric_ 为空 示例
来自 examples page 的任何函数都不会向 model.evals_result_
写入任何内容,而内置函数则可以。
如何解决这个问题?我想为自定义损失函数构建学习曲线。
示例
# function from examples page
class LoglossObjective(object):
def calc_ders_range(self,approxes,targets,weights):
assert len(approxes) == len(targets)
if weights is not None:
assert len(weights) == len(approxes)
result = []
for index in range(len(targets)):
e = np.exp(approxes[index])
p = e / (1 + e)
der1 = targets[index] - p
der2 = -p * (1 - p)
if weights is not None:
der1 *= weights[index]
der2 *= weights[index]
result.append((der1,der2))
return result
使用自定义函数,没有 eval_metric
模型将不适合:
model = CatBoostClassifier(loss_function=LoglossObjective())
model.fit(
train_x,train_y,eval_set=(test_x,test_y),cat_features=cat_features,verbose=False
)
>>> CatBoostError: catboost/libs/metrics/metric.cpp:6151: If loss function is a user defined object,then the eval metric must be specified.
使用 eval_metric
您不会看到任何损失历史,只需使用 eval_metric 测试验证:
model = CatBoostClassifier(loss_function=LoglossObjective(),eval_metric='AUC')
model.fit(
train_x,verbose=False
)
model.evals_result_
>>>{'validation': {'AUC': [0.5076334619316121,...
使用内置函数,您将获得所有(测试/训练和评估指标的损失):
model = CatBoostClassifier(loss_function='Logloss',verbose=False
)
model.evals_result_
>>>{'learn': {'Logloss': [0.5954747866047965,...
'validation': {'Logloss': [0.5965134202141779,...'AUC': [0.6314505226365945,
UPD:
某些 eval_metric
会提供必要的数据,例如:
model = CatBoostClassifier(loss_function=LoglossObjective())
model.fit(
train_x,verbose=False
)
for k in model.evals_result_.keys():
print(f'{k}: {model.evals_result_[k].keys()}')
>>>learn: dict_keys(['Logloss'])
validation: dict_keys(['Logloss'])
这是否意味着,对于每个内置函数,CatBoost 都会自动选择相应的内置评估函数,但对于自定义损失应该是自定义指标?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。