使用creme-ml处理不平衡数据集的实用指南
river 项目地址: https://gitcode.com/gh_mirrors/river12/river
不平衡数据集概述
在机器学习实践中,不平衡数据集是非常常见的问题。特别是在在线学习场景中,如欺诈检测和垃圾邮件分类等二元分类任务,负类样本(0)通常远多于正类样本(1)。这种不平衡会严重影响分类器的性能表现。
数据集分析
我们以信用卡交易数据集为例,首先统计各类别的分布情况:
import collections
from river import datasets
X_y = datasets.CreditCard()
counts = collections.Counter(y for _, y in X_y)
for c, count in counts.items():
print(f'{c}: {count} ({count / sum(counts.values()):.5%})')
输出结果:
0: 284315 (99.82725%)
1: 492 (0.17275%)
可以看到数据集极度不平衡,正负样本比例约为1:578。
基准模型评估
我们先使用标准逻辑回归作为基准模型,评估其在原始不平衡数据上的表现:
from river import linear_model, metrics, evaluate, preprocessing
X_y = datasets.CreditCard()
model = (
preprocessing.StandardScaler() |
linear_model.LogisticRegression()
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
基准模型的ROC AUC得分为89.11%,虽然尚可接受,但仍有提升空间。
改进方法一:类别权重调整
对于梯度下降类模型(包括神经网络),我们可以通过调整类别权重来改善不平衡学习:
from river import optim
model = (
preprocessing.StandardScaler() |
linear_model.LogisticRegression(
loss=optim.losses.Log(weight_pos=5)
)
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
通过给正类样本5倍权重,ROC AUC提升至91.43%。
改进方法二:Focal Loss
目标检测领域提出的Focal Loss专门针对类别不平衡问题设计:
model = (
preprocessing.StandardScaler() |
linear_model.LogisticRegression(loss=optim.losses.BinaryFocalLoss(2, 1))
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
使用Focal Loss后,模型性能达到91.31%,与权重调整效果相当。
改进方法三:欠采样技术
欠采样是一种更通用的方法,适用于各种模型类型:
from river import imblearn
model = (
preprocessing.StandardScaler() |
imblearn.RandomUnderSampler(
classifier=linear_model.LogisticRegression(),
desired_dist={0: .8, 1: .2},
seed=42
)
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
通过欠采样将类别比例调整为4:1,ROC AUC显著提升至94.75%。欠采样还有减少训练样本量、加快训练速度的优势。
改进方法四:过采样技术
我们也可以通过过采样少数类来达到相同目的:
model = (
preprocessing.StandardScaler() |
imblearn.RandomOverSampler(
classifier=linear_model.LogisticRegression(),
desired_dist={0: .8, 1: .2},
seed=42
)
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
过采样后模型性能为91.71%,虽然不如欠采样,但避免了信息丢失。
改进方法五:混合采样策略
RandomSampler允许同时控制类别分布和训练数据量:
model = (
preprocessing.StandardScaler() |
imblearn.RandomSampler(
classifier=linear_model.LogisticRegression(),
desired_dist={0: .8, 1: .2},
sampling_rate=.01,
seed=42
)
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
这种方法在保持94.71%的高性能同时,只使用1%的训练数据,大幅提高了效率。
组合策略:欠采样+权重调整
最后,我们可以组合多种技术获得最佳效果:
model = (
preprocessing.StandardScaler() |
imblearn.RandomUnderSampler(
classifier=linear_model.LogisticRegression(
loss=optim.losses.Log(weight_pos=5)
),
desired_dist={0: .8, 1: .2},
seed=42
)
)
metric = metrics.ROCAUC()
evaluate.progressive_val_score(X_y, model, metric)
这种组合方法取得了96.52%的ROC AUC,是所有方法中表现最好的。
总结
处理不平衡数据集时,creme-ml提供了多种有效策略:
- 类别权重调整:简单有效,但仅适用于梯度类模型
- Focal Loss:源自深度学习的新颖方法
- 欠采样:通用性强,还能加速训练
- 过采样:保留所有信息,但计算成本高
- 混合采样:灵活控制数据量和类别分布
- 组合策略:往往能取得最佳效果
实际应用中,建议根据具体场景和需求选择合适的策略或组合。对于关键任务如欺诈检测,组合策略通常是最佳选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考