目录

  • 问题背景:
    • 二分类损失LogLoss
      • 公式推导
      • 代码实现
    • 多分类损失MultiLoss
      • 公式推导
      • 代码实现
    • 自定义Loss注意事项
  • 结语

问题背景:

Catboost是各类数据竞赛中常用的boosting算法包之一。在实际竞赛中,模型参数的选取是能否获得较好结果的 关键 ,其中损失函数的选择尤为重要。Catboost分别针对分类,回归问题提供了丰富的默认损失函数。关于Catboost库的介绍,网络上也有丰富的资料供参考。但针对自定义损失函数的实现,资料则相对匮乏。本文主要给出二分类问题LogLoss多分类问题MultiLoss的原理推导与代码实现。

如果想了解更多catboost的参数,建议仔细阅读:
https://catboost.ai/docs/concepts/about.html

懒得看可以直接问我,但是我也可能懒得回

catboost官方文档

看了这篇文章,各位就是全 国(雾) 家最会自定义catboost损失函数的崽~

二分类损失LogLoss

由于官方文档里给出了LogLoss的代码实现
,因此本部分代码以官方文档为准
此外该部分也借鉴了热心网友给出的xgboost实现的博客

[ML&DL]xgboost自定义目标函数和评估函数

公式推导

二分类问题的对数似然损失函数如下:

代码实现

主要内容 class LoglossObjective(object):.

import math
from six.moves import xrange
from catboost import Pool, CatBoostClassifierclass 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 -pder2 = -p * (1 - p)if weights is not None:der1 *= weights[index]der2 *= weights[index]result.append((der1, der2))return resultcat_features = [0, 1]train_data = [[1, 4, 5, 6],[4, 5, 6, 7],[30, 40, 50, 60]]train_labels = [1, 1, 0]eval_data = [[3, 4, 4, 1],[1, 5, 5, 5],[31, 25, 60, 70]]# Initialize CatBoostClassifier with custom `loss_function`
model = CatBoostClassifier(loss_function=LoglossObjective(),eval_metric="Logloss")
# Fit model
model.fit(train_data, train_labels)
# Only prediction_type='RawFormulVal' allowed with custom `loss_function`
preds_raw = model.predict(eval_data,prediction_type='RawFormulaVal')print(preds_raw)

多分类损失MultiLoss

该部分的代码效果实际实验中与Catboost内置参数 “MultiClass” 有一定出入
可低可高,随缘误差一个百分点不到

公式推导

代码实现

主要内容 class MultiClassObjective(object):.

class MultiClassObjective(object):def calc_ders_multi(self, approxes, targets, weights):# approxes, targets, weights are indexed containers of floats# (containers with only __len__ and __getitem__ defined).# weights parameter can be None.n_classes = len(approxes)exponents = np.exp(approxes)softmax = exponents / np.sum(exponents)targets = np.array([1 if x == targets else 0 for x in range(n_classes)])der1 = targets - softmaxder2 = np.zeros((n_classes, n_classes))for x in range(n_classes):for y in range(n_classes):if x == y:der2[x, y] = -softmax[x] * (1 - softmax[y]) else:der2[x, y] = softmax[x] * softmax[y] if weights is not None:der1 *= weightsder2 *= weightsreturn der1, der2

自定义Loss注意事项

1.自定义损失函数不支持GPU加速
2.自定义损失函数主要是一阶导和二阶导的实现
提供的三个输入:

  • approxes 训练输出
  • targets 标签
  • weights 权重
    • 项目这里的权重代码里是给一阶导和二阶导赋权,但模型的意义是子树节点的分裂次数

要求的两个输出:

  • der1 一阶导
  • der2 二阶导
    • [可省略],返回空矩阵程序亦不会报错,但效果会差一些

不可导点可使用 泰勒公式 在该点展开然后求导

结语

经常在网上查找资料,发现catboost的资料很多都是直接机器翻译搬运的Google内容,因此希望能写一些内容帮助别人,第一次写,没什么经验,欢迎大家提意见(反正也不会改)

o(〃’▽’〃)o 特别感谢 说要帮我推公式的某同学, 你说:回家了给你搞搞,在外面吃饭了 ,五天了,不知道你到家了吗?(•‾̑⌣‾̑•)✧˖°
最后:愿我们的友谊长存

Catboost自定义损失函数初探相关推荐

  1. R语言构建xgboost模型:自定义损失函数(目标函数、loss function、object function)、评估函数(evaluation function)

    R语言构建xgboost模型:自定义损失函数(目标函数.loss function.object function).评估函数(evaluation function) 目录

  2. R语言构建xgboost模型使用早停法训练模型(early stopping):自定义损失函数(目标函数,loss function)、评估函数(evaluation function)

    R语言构建xgboost模型使用早停法训练模型(early stopping):自定义损失函数(目标函数.loss function.object function).评估函数(evaluation ...

  3. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战

    sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战 # 自定义损失函数 i ...

  4. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)

    sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss) # 广义线性模型中的各种连接函数: ...

  5. sklearn基于make_scorer函数构建自定义损失函数或者评估指标

    sklearn基于make_scorer函数构建自定义损失函数或者评估指标 # 导入需要的包和库 # Load libraries from sklearn.metrics import make_s ...

  6. 独家 | 使用TensorFlow 2创建自定义损失函数

    作者:Arjun Sarkar 翻译:陈之炎 校对:欧阳锦 本文约1900字,建议阅读8分钟 本文带你学习使用Python中的wrapper函数和OOP来编写自定义损失函数. 标签:TensorFlo ...

  7. [机器学习] XGBoost 自定义损失函数-FocalLoss

    一.XGBoost损失函数 损失函数:损失函数描述了预测值和真实标签的差异,通过对损失函数的优化来获得对学习任务的一个近似求解方法 boosting类算法的损失函数的作用: Boosting的框架, ...

  8. Pyotorch自定义损失函数

    1.损失函数知识总结参考: 深度学习笔记总结_GoAI的博客-CSDN博客 PyTorch 笔记.常见的PyTorch损失函数 - 知乎 Pytorch神经网络实战学习笔记_10 神经网络模块中的损失 ...

  9. TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵

    TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵 神经元模型:用数学公式比表示为:f(Σi xi*wi + b), f为激活函数 神经网络 是以神经元为基本单位构成的 激 ...

最新文章

  1. 层次聚类算法原理总结
  2. Linux文件的切分和结合
  3. Hbuilder----安装less插件(详细)
  4. 网易纯净邮箱5元一个月,有点贵啊
  5. 回溯法基本思想_LeetCode--回溯法心得
  6. 4.算法优化 -高性能JavaScript
  7. 关于网页内容加速黑科技的趣谈
  8. SimpleGIS在线地图插件
  9. latex 输入下划线_
  10. iPad mini 6 评测:多功能升级,一手掌握的极佳手感,适合娱乐休闲
  11. Fiori 动态磁贴示例
  12. linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行
  13. PHP开发规范——转自ThinkPHP手册
  14. 知乎上演的“变形计“,资本市场会打几分?
  15. 魔百盒CDN00001_移动魔百盒设置最佳DNS方法
  16. opensuse安装face_recognition全记录
  17. jarvis OJ web babyphp
  18. 方差、协方差、协方差矩阵以及互相关矩阵
  19. 前端笔记5 JQuery 语法及应用
  20. 单软多硬使用说明(展讯平台)

热门文章

  1. 【论文分享】Effective Seed Scheduling for Fuzzing with Graph Centrality Analysis
  2. JAVA设计模式什么鬼(适配器)——作者:凸凹里歐
  3. 适用于XP的AMD双核优化补丁集
  4. C语言版,八数码小游戏实现,简单好玩
  5. 天脉导热冲刺创业板:拟募资4亿 创始人谢毅是初中学历
  6. 王道论坛计算机系统01——操作系统的定义和特征
  7. (附源码)计算机毕业设计ssm大学生心理健康咨询系统
  8. CF contest/389
  9. 中国电信联合RIM发布黑莓9630手机
  10. 卡西欧计算机怎么玩游戏fx,卡西欧计算器玩游戏