这是在数据极度不均衡的场景下的一个二分类实现,使用了“weighted class”
,“oversampling”
,focal loss
等多种方式进行了实验,主要是进行了方法的验证和各种方法结果的对比;对比是主要参看了指标混淆矩阵 和 auc,最后本实验中还着重对focal loss进行了简单的调参:
- load_data_and_model.py主要用于加载数据,对数据进行基本的预处理(数据的归一化,部分数据取log,丢弃无用数据等,可以看作是简单的特征工程);然后定义了评价指标并定义了创建模型的方法,对训练的一些超参如epochs和batchsize也是在此文件定义。模型代码使用tf2的keras.Sequential创建了一个简单的模型,仅用来验证几种不同的处理不均衡的方法。模型代码和绘图代码参考于tensorflow2 tutorial的官网实现:https://tensorflow.google.cn/tutorials/structured_data/imbalanced_data ,我增加了focal loss的实现,并一起进行对比。
- draw_helper.py是一些绘图的辅助函数;
- comparison.py里使用
添加经验bias
的方法、类别加权
、上采样
、使用focal loss
的方法分别训练模型,并得出评价,以及对比结果;- tune_params_for_focal_loss.py主要是对focal loss的
$\alpha$ 和$\gamma$ 进行调参,主要就是选定了一个范围,两重循环,类似于网格搜索
- python3.6.9
- tensorflow 2.4.x
- gpu:NVIDIA V100 (32G)
上图可以看出,bias有助于改善模型训练,模型的初期几个epoch不用再学习bias的变化。
接下来就以加了先验bias的模型作为baseline,分别验证其他各种解决样本不均衡的方法
上图可以看出,各路方法都在baseline的基础上有所提升。
调参使用的是tune_params_for_focal_loss.py,测试了一组$\alpha$ 和
alphas = np.arange(0.1, 0.41, 0.05)#[0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4]
gammas = np.arange(1., 4.1, 0.5)#[1.0, 1.5, 2., 2.5, 3., 3.5, 4.]
可见$\alpha=0.3$ 和
关于Focal Loss想要了解更多的,可参考我的博客:Focal Loss原理以及代码实现和验证(tensorflow2):https://blog.csdn.net/u010366748/article/details/108697771