使用creme-ml处理不平衡数据集的实用指南

使用creme-ml处理不平衡数据集的实用指南

river 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提供了多种有效策略:

  1. 类别权重调整:简单有效,但仅适用于梯度类模型
  2. Focal Loss:源自深度学习的新颖方法
  3. 欠采样:通用性强,还能加速训练
  4. 过采样:保留所有信息,但计算成本高
  5. 混合采样:灵活控制数据量和类别分布
  6. 组合策略:往往能取得最佳效果

实际应用中,建议根据具体场景和需求选择合适的策略或组合。对于关键任务如欺诈检测,组合策略通常是最佳选择。

river river 项目地址: https://gitcode.com/gh_mirrors/river12/river

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆璋垒Estelle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值