很多时候为了达到更好的训练效果我们需要改变损失函数,以加速数据的拟合。

一、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.huberl​oss={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​)2​x​;  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)23​1​

二、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函数相关推荐

  1. 关于机器学习 Machine Learning中loss函数参数正则化的一点思考

    1 致谢 感谢 Andrew Ng教授的讲述! 2 前言 今天在学习机器学习中对loss函数中的参数进行正则化~ 3 关于机器学习中loss函数参数正则化 在机器学习中,有一项防止过拟合的技巧就是(参 ...

  2. Keras自定义Loss函数

    Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...

  3. 机器学习之Huber loss

    Huber Loss 是用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对离群点的鲁棒性. 当预测偏差小于 δ 时,它采用平方误差, 当预测偏 ...

  4. 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_ ...

  5. 【机器学习】Huber loss

    Huber Loss 是一个用于回归问题的带参损失函数, 优点是能增强平方误差损失函数(MSE, mean square error)对噪声(或叫离群点,outliers)的鲁棒性. 当预测偏差小于 ...

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

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

  7. 回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss

    均方误差(Mean Square Error,MSE)和平均绝对误差(Mean Absolute Error,MAE) 是回归中最常用的两个损失函数,但是其各有优缺点.为了避免MAE和MSE各自的优缺 ...

  8. 【损失函数】MSE, MAE, Huber loss详解

    转载:https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA https://baijiahao.baidu.com/s?id=16119517755261 ...

  9. loss函数之TripletMarginLoss与TripletMarginWithDistanceLoss

    不同于交叉熵损失仅仅考虑样本与类别标签之间误差,triplet loss关注样本与其他样本之间距离.来自论文Learning local feature descriptors with triple ...

最新文章

  1. Bert系列(二)——源码解读之模型主体
  2. android 筛选控件_Flutter学习六之实现一个带筛选的列表页面
  3. RegexDemo6
  4. python官方的扩展索引_Python列表操作与深浅拷贝(6)——列表索引、查询、修改、扩展...
  5. easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法
  6. 【算法】剑指 Offer 05. 替换空格
  7. 图标代码_通过两行代码即可调整苹果电脑 Launchpad 图标大小!
  8. 怎样计算机连网打印,连网设置:实现网络打印共享_激光打印机_办公打印应用指南-中关村在线...
  9. [已解决]Hibernate程序未终止
  10. 视觉SLAM十四讲第三讲
  11. bp神经网络反向传播推导,bp神经网络的传递函数
  12. 基于VUE的酒店管理系统的设计与实现
  13. C++之责任链(Chain of Responsibility)模式
  14. Excel正确输入身份证号码
  15. 解决使用CSDN下载东西时,点击直接下载没有反应的问题
  16. 解决使用Keil5不能生成bin文件或生成的是.bin文件夹问题
  17. 嵌套iframe页面做打印去掉页眉页脚
  18. mr.baidu.com百度官方缩短网址接口网站调用生成制作方法解析
  19. CSDN有哪些值得学习的专栏?
  20. 表格标签案例---个人简历

热门文章

  1. 微服务设计的四个原则
  2. Excel中IF函数中的条件写法
  3. 2022-1-14 牛客C++项目 —— exec函数族学习
  4. php将上传的文件自动压缩,如何在服务器端实现文件自动压缩和解压
  5. 键盘键和键盘键控制值一览表(键盘代码对应表)
  6. LOGFONT设置字体
  7. android百度测试,【腾讯百度测试面试题】面试问题:Android… - 看准网
  8. 机器学习与知识发现_机器视觉学习之工业镜头--硬件知识扫盲学习
  9. 川崎机器人signal_川崎机器人常用指令表
  10. [dbnmpntw]连接忙碌中_岳阳连接线7公里处 藏了一个“稀世”屋场