使用加权(指各种损失的加权和, 典型的:加权交叉熵)和focal loss的主要原因是为了解决类别不平衡数据的问题, 原始的Xgboost程序提供了一种方便的方法来定制损失函数, 但是需要计算一阶和二阶导数来实现它们. 这个库提供了梯度推导和实现.
paper: Imbalance-XGBoost
>>
关于数据不平衡
关于类别(数据)不平衡的问题几乎是必然发生的, 这里介绍一篇文章, 里面介绍了机器学习中处理类别不平衡的部分解决方法.
目前较为常用的方法:
- Undersampling methods
- Oversampling methods
- Synthetic data generation
- Cost sensitive learning
- Ensemble methods
- Undersampling methods
Undersampling methods - 欠采样
在这些方法中, 随机删除了占据主导地位(数量多)的类的样本. 这减少了来自主要类的观察样本, 以使数据集平衡. 然而这也会导致严重的信息丢失, 该方法适用于数据量较大且训练样本数量较少的情况.
欠采样的策略有很多, 比如near miss undersampling, 只对来自多数类的数据样本进行采样, 这是区分多数类与其他类所必需的.
NearMiss-1 sampling, NearMiss-2 sampling, 从多数类中选取样本, 其中少数类的N个最近样本的平均度量距离最小.
Tomek links, 定义两个不同的类为Tomek links, 它们满足距离最小. 此时这两个类的其中一个很可能是噪声数据, 通过简单地将其删除可以建立一个更简单的分类问题, 尽管数据集可能仍然不平衡, 但也有助于提高分类(或者其他任务)的性能. (一句话总结: 难样本处理不来就扔掉好了~)
Oversampling methods - 过采样
对少数类使用过采样方法, 在这个方法里, 直接复制少数类的样本以增加它们的数量. 该方法让模型对于少数类的观察次数增加, 它也被称为上采样. 由于数据点的重复, 可能会导致过拟合.
该方法还可以分为三种类型:随机采样、基于聚类的采样和信息采样.
Synthetic data generation - 合成数据
在个方法中, 通过分析数据并人工生成数据来解决不平衡问题, 所以, 这也是一种过采样技术, 通常用Synthetic Minority Oversampling Technique(SMOTE)来形容这项技术. 可以找paper看看.
Imbalance-XGBoost
这个库实现了在XGBoost中使用加权损失和焦点损失, 具体的用法可以看一下原文.
通过pypi安装pip install imbalance-xgboost
.