Catboost自定义损失函数初探
目录
- 问题背景:
- 二分类损失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自定义损失函数初探相关推荐
- R语言构建xgboost模型:自定义损失函数(目标函数、loss function、object function)、评估函数(evaluation function)
R语言构建xgboost模型:自定义损失函数(目标函数.loss function.object function).评估函数(evaluation function) 目录
- R语言构建xgboost模型使用早停法训练模型(early stopping):自定义损失函数(目标函数,loss function)、评估函数(evaluation function)
R语言构建xgboost模型使用早停法训练模型(early stopping):自定义损失函数(目标函数.loss function.object function).评估函数(evaluation ...
- sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战
sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战 # 自定义损失函数 i ...
- sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)
sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss) # 广义线性模型中的各种连接函数: ...
- sklearn基于make_scorer函数构建自定义损失函数或者评估指标
sklearn基于make_scorer函数构建自定义损失函数或者评估指标 # 导入需要的包和库 # Load libraries from sklearn.metrics import make_s ...
- 独家 | 使用TensorFlow 2创建自定义损失函数
作者:Arjun Sarkar 翻译:陈之炎 校对:欧阳锦 本文约1900字,建议阅读8分钟 本文带你学习使用Python中的wrapper函数和OOP来编写自定义损失函数. 标签:TensorFlo ...
- [机器学习] XGBoost 自定义损失函数-FocalLoss
一.XGBoost损失函数 损失函数:损失函数描述了预测值和真实标签的差异,通过对损失函数的优化来获得对学习任务的一个近似求解方法 boosting类算法的损失函数的作用: Boosting的框架, ...
- Pyotorch自定义损失函数
1.损失函数知识总结参考: 深度学习笔记总结_GoAI的博客-CSDN博客 PyTorch 笔记.常见的PyTorch损失函数 - 知乎 Pytorch神经网络实战学习笔记_10 神经网络模块中的损失 ...
- TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵
TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵 神经元模型:用数学公式比表示为:f(Σi xi*wi + b), f为激活函数 神经网络 是以神经元为基本单位构成的 激 ...
最新文章
- 层次聚类算法原理总结
- Linux文件的切分和结合
- Hbuilder----安装less插件(详细)
- 网易纯净邮箱5元一个月,有点贵啊
- 回溯法基本思想_LeetCode--回溯法心得
- 4.算法优化 -高性能JavaScript
- 关于网页内容加速黑科技的趣谈
- SimpleGIS在线地图插件
- latex 输入下划线_
- iPad mini 6 评测:多功能升级,一手掌握的极佳手感,适合娱乐休闲
- Fiori 动态磁贴示例
- linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行
- PHP开发规范——转自ThinkPHP手册
- 知乎上演的“变形计“,资本市场会打几分?
- 魔百盒CDN00001_移动魔百盒设置最佳DNS方法
- opensuse安装face_recognition全记录
- jarvis OJ web babyphp
- 方差、协方差、协方差矩阵以及互相关矩阵
- 前端笔记5 JQuery 语法及应用
- 单软多硬使用说明(展讯平台)
热门文章
- 【论文分享】Effective Seed Scheduling for Fuzzing with Graph Centrality Analysis
- JAVA设计模式什么鬼(适配器)——作者:凸凹里歐
- 适用于XP的AMD双核优化补丁集
- C语言版,八数码小游戏实现,简单好玩
- 天脉导热冲刺创业板:拟募资4亿 创始人谢毅是初中学历
- 王道论坛计算机系统01——操作系统的定义和特征
- (附源码)计算机毕业设计ssm大学生心理健康咨询系统
- CF contest/389
- 中国电信联合RIM发布黑莓9630手机
- 卡西欧计算机怎么玩游戏fx,卡西欧计算器玩游戏