catboost自定义损失函数和metric

本文介绍了如何实现自定义的LoglossObjective损失函数,用于计算训练输出与标签的交叉熵,并配合自定义LoglossMetric进行评估,包括一阶和二阶导数计算及F1分数计算。同时展示了如何在CatBoostClassifier中集成这些自定义组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 自定义损失函数

提供的三个输入:
approxes 训练输出
targets 标签
weights 权重

要求的两个输出:
der1 一阶导
der2 二阶导

class LoglossObjective(object):
def calc_ders_range(self, approxes, targets, weights):
    # approxes, targets, weights are indexed containers of floats
    # (containers with only __len__ and __getitem__ defined).
    # weights parameter can be None.
    # Returns list of pairs (der1, der2)
    assert len(approxes) == len(targets)
    if weights is not None:
        assert len(weights) == len(approxes)
    exponents = []
    for index in xrange(len(approxes)):
        exponents.append(math.exp(approxes[index]))

    result = []
    for index in xrange(len(targets)):
        p = exponents[index] / (1 + exponents[index])
        der1 = (1 - p) if targets[index] > 0.0 else -p
        der2 = -p * (1 - p)

        if weights is not None:
            der1 *= weights[index]
            der2 *= weights[index]

        result.append((der1, der2))

    return result

2.自定义eval_metric

下面的get_final_error、is_max_optimal、evaluate这个函数必须有。
提供的三个输入:
approxes 训练输出
targets 标签
weights 权重
输出error_sum:如F1、准确率等

class LoglossMetric(object):
def get_final_error(self, error, weight):
    return error / (weight + 1e-38)#可以自己定义error_sum与权重的关系

def is_max_optimal(self):
    return True

def evaluate(self, approxes, target, weight):
    # approxes is list of indexed containers
    # (containers with only __len__ and __getitem__ defined), one container
    # per approx dimension. Each container contains floats.
    # weight is one dimensional indexed container.
    # target is float.   
    # weight parameter can be None.
    # Returns pair (error, weights sum)

    assert len(approxes) == 1
    assert len(target) == len(approxes[0])

    approx = approxes[0]

    error_sum = 0.0
    weight_sum = 0.0

    for i in xrange(len(approx)):
        w = 1.0 if weight is None else weight[i]
        weight_sum += w
        error_sum += w * (target[i] * approx[i] - math.log(1 + math.exp(approx[i])))

    return error_sum, weight_sum

3.集成在catboost

model = CatBoostClassifier(loss_function=LoglossObjective(),
eval_metric=LoglossMetric())

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI强仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值