机器学习_LGB自定义huber loss函数
很多时候为了达到更好的训练效果我们需要改变损失函数,以加速数据的拟合。
一、huber函数的近似函数
众所周知我们rmse会对异常值的损失关注度特别高,mae对异常会没有那么敏感。将两者进行结合就可以更加关注大部分的样本的损失,减少关注异常值,在一定程度上提升模型的泛化能力。
huberloss={12(ytrue−ypred)2if∣ytrue−ypred∣<δδ∣ytrue−ypred∣−12δ2if∣ytrue−ypred∣>=δhuber_loss = \left\{\begin{matrix} \frac{1}{2}(y_{true} - y_{pred})^2 \ \ \ \ \ \ \ \ \ if\ \ |y_{true} - y_{pred}| < \delta \\ \delta|y_{true} - y_{pred}|-\frac{1}{2}\delta^2 \ \ if\ \ |y_{true} - y_{pred}| >= \delta \end{matrix}\right.huberloss={21(ytrue−ypred)2 if ∣ytrue−ypred∣<δδ∣ytrue−ypred∣−21δ2 if ∣ytrue−ypred∣>=δ
但是在gbdt模型中,需要运用一阶导与二阶导的比值来结算树节点的拆分增益。mse不具有二阶导。所以我们需要寻找近似可导函数来替代。
Pseudo_huber_loss=δ2(1+(y^−yδ)2+1)Pseudo\_huber\_loss= \delta ^2(\sqrt{1 + (\frac{\hat{y} - y}{\delta})^2} + 1)Pseudo_huber_loss=δ2(1+(δy^−y)2+1)
一阶导:
g=δ2x1+(xδ)2;x=y^−yg = \delta ^2\frac{x}{\sqrt{1 + (\frac{x}{\delta})^2}};\ \ x=\hat{y} - yg=δ21+(δx)2x; x=y^−y
二阶导:
h=δ21(1+(xδ)2)32h = \delta ^2\frac{1}{(1 + (\frac{x}{\delta})^2)^{\frac{3}{2}}}h=δ2(1+(δx)2)231
二、boston数据集实战
2.1 数据加载
import lightgbm as lgb
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as npbst_dt = load_boston()
bst_df = pd.DataFrame(bst_dt.data, columns = bst_dt.feature_names)
bst_df['target'] = bst_dt.target
x_tr, x_te, y_tr, y_te = train_test_split(bst_df.drop('target', axis=1), bst_df['target'], test_size=0.2, random_state=42)
2.2 sklearn接口lgb简单拟合
lgb_params = {'objective' : 'regression','num_leaves' : 30,'max_depth': 6,'metric': 'rmse','bagging_fraction':0.9,'feature_fraction': 0.8,'n_jobs': -1 ,'n_estimators': 100,'subsample_for_bin': 500
}lgb_model = lgb.LGBMRegressor(**lgb_params)
lgb_model.fit(x_tr, y_tr, eval_set=[(x_tr, y_tr)], verbose=10)
y_pred = lgb_model.predict(x_te)
mae_o = mean_absolute_error(y_te, y_pred)
自定义huber loss
def huber_objective(y_true, y_pred):error = y_pred - y_truedelta = 8scale = 1 + (error / delta) ** 2scale_sqrt = np.sqrt(scale)g = delta * delta / scale * errorh = delta * delta / scale / scale_sqrtreturn g, hlgb_params.update({'objective': huber_objective})
print(lgb_params)
lgb_model = lgb.LGBMRegressor(**lgb_params)
lgb_model.fit(x_tr, y_tr, eval_set=[(x_tr, y_tr)], verbose=10)
y_pred = lgb_model.predict(x_te)
mae_huber = mean_absolute_error(y_te, y_pred)
mae_o, mae_huber
结果简单分析
仅仅从rmse上看,很显然,huber loss的损失会更大。我们进一步观察一下拟合差值
的分布情况。
"""
- rmse
[10] training's rmse: 4.78619
[20] training's rmse: 3.35349
[30] training's rmse: 2.84163
[40] training's rmse: 2.56263
[50] training's rmse: 2.35089
[60] training's rmse: 2.20306
[70] training's rmse: 2.06908
[80] training's rmse: 1.95886
[90] training's rmse: 1.86569
[100] training's rmse: 1.79135
- huber
[10] training's rmse: 5.49376
[20] training's rmse: 3.54926
[30] training's rmse: 3.07389
[40] training's rmse: 2.89136
[50] training's rmse: 2.73511
[60] training's rmse: 2.61101
[70] training's rmse: 2.50242
[80] training's rmse: 2.42138
[90] training's rmse: 2.35478
[100] training's rmse: 2.30335
(2.116972786370626, 2.0635595381991485)"""
从差值中,我们可以看出huber loss 对较为集中的值拟合较好,会忽略部分异常值。从target的分布看确实存在着小部分的异常值。用huber loss拟合的模型会具有更佳的泛化能力。
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(bst_df['target'])
plt.show()"""
rmse loss
>>> (y_te-y_pred).map(int).value_counts()0 331 16
-1 162 11
-2 94 53 3
-3 3
-6 1
-5 118 1
-12 17 15 1
# huber loss
>>> (y_te-y_pred).map(int).value_counts()0 37
-1 181 10
-2 92 83 7
-3 4
-5 24 223 1
-10 17 16 15 1
"""
参考
- xgboost如何使用MAE或MAPE作为目标函数?
- https://stackoverflow.com/questions/55793947/implement-custom-huber-loss-in-lightgbm
- LightGBM-objective
- https://stackoverflow.com/questions/45006341/xgboost-how-to-use-mae-as-objective-function
机器学习_LGB自定义huber loss函数相关推荐
- 关于机器学习 Machine Learning中loss函数参数正则化的一点思考
1 致谢 感谢 Andrew Ng教授的讲述! 2 前言 今天在学习机器学习中对loss函数中的参数进行正则化~ 3 关于机器学习中loss函数参数正则化 在机器学习中,有一项防止过拟合的技巧就是(参 ...
- Keras自定义Loss函数
Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...
- 机器学习之Huber loss
Huber Loss 是用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对离群点的鲁棒性. 当预测偏差小于 δ 时,它采用平方误差, 当预测偏 ...
- tensorflow2中自定义损失、传递loss函数字典/compile(optimizer=Adam(lr = lr), loss= lambda y_true, y_pred: y_pred)理解
在阅读yolov3代码的时候有下面这样一样代码: model.compile(optimizer=Adam(lr = lr), loss={'yolo_loss': lambda y_true, y_ ...
- 【机器学习】Huber loss
Huber Loss 是一个用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对噪声(或叫离群点,outliers)的鲁棒性. 当预测偏差小于 ...
- [机器学习] XGBoost 自定义损失函数-FocalLoss
一.XGBoost损失函数 损失函数:损失函数描述了预测值和真实标签的差异,通过对损失函数的优化来获得对学习任务的一个近似求解方法 boosting类算法的损失函数的作用: Boosting的框架, ...
- 回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss
均方误差(Mean Square Error,MSE)和平均绝对误差(Mean Absolute Error,MAE) 是回归中最常用的两个损失函数,但是其各有优缺点.为了避免MAE和MSE各自的优缺 ...
- 【损失函数】MSE, MAE, Huber loss详解
转载:https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA https://baijiahao.baidu.com/s?id=16119517755261 ...
- loss函数之TripletMarginLoss与TripletMarginWithDistanceLoss
不同于交叉熵损失仅仅考虑样本与类别标签之间误差,triplet loss关注样本与其他样本之间距离.来自论文Learning local feature descriptors with triple ...
最新文章
- Bert系列(二)——源码解读之模型主体
- android 筛选控件_Flutter学习六之实现一个带筛选的列表页面
- RegexDemo6
- python官方的扩展索引_Python列表操作与深浅拷贝(6)——列表索引、查询、修改、扩展...
- easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法
- 【算法】剑指 Offer 05. 替换空格
- 图标代码_通过两行代码即可调整苹果电脑 Launchpad 图标大小!
- 怎样计算机连网打印,连网设置:实现网络打印共享_激光打印机_办公打印应用指南-中关村在线...
- [已解决]Hibernate程序未终止
- 视觉SLAM十四讲第三讲
- bp神经网络反向传播推导,bp神经网络的传递函数
- 基于VUE的酒店管理系统的设计与实现
- C++之责任链(Chain of Responsibility)模式
- Excel正确输入身份证号码
- 解决使用CSDN下载东西时,点击直接下载没有反应的问题
- 解决使用Keil5不能生成bin文件或生成的是.bin文件夹问题
- 嵌套iframe页面做打印去掉页眉页脚
- mr.baidu.com百度官方缩短网址接口网站调用生成制作方法解析
- CSDN有哪些值得学习的专栏?
- 表格标签案例---个人简历
热门文章
- 微服务设计的四个原则
- Excel中IF函数中的条件写法
- 2022-1-14 牛客C++项目 —— exec函数族学习
- php将上传的文件自动压缩,如何在服务器端实现文件自动压缩和解压
- 键盘键和键盘键控制值一览表(键盘代码对应表)
- LOGFONT设置字体
- android百度测试,【腾讯百度测试面试题】面试问题:Android… - 看准网
- 机器学习与知识发现_机器视觉学习之工业镜头--硬件知识扫盲学习
- 川崎机器人signal_川崎机器人常用指令表
- [dbnmpntw]连接忙碌中_岳阳连接线7公里处 藏了一个“稀世”屋场