【机器学习】平衡你的数据集的几项技巧

作者 | Praveen Thenraj

编译 | VK
来源 | Towards Data Science

“如果你被问题的规模所压倒,把它分解成更小的部分……”

机器学习中的类不平衡是一个重要的问题,也是处理数据集时最受关注的问题之一。类不平衡的数据集往往更具欺骗性,如果处理不当,结果可能导致错误的决策。

最近我碰巧在一个数据集中工作,它有一个类不平衡的问题。我不太喜欢数据生成技术,并且由于不平衡的严重性,我不想使用像分层K-fold这样的技术,所以我使用了另一种技术,它帮助模型比传统技术更好地学习数据。

也许我有点晚使用这个技术,但我想在这里分享它。

import pandas as pd

train=pd.read_csv('/Desktop/Files/train_data.csv')
print(train['Top-up Month'].value_counts())

No Top-up Service    106677
 > 48 Months           8366
36-48 Months           3656
24-30 Months           3492
30-36 Months           3062
18-24 Months           2368
12-18 Months           1034
Name: Top-up Month, dtype: int64

以上是训练数据中因变量的值计数。从上面可以清楚地看到,“No Top-up Service”类和其他类之间存在严重的类不平衡。


方法

所以我在这里采用的方法是将大多数类数据分成大小为“n”的小折。每个数据块(折)都有与大多数类相关的“k”个数据点。所有其他次要类数据点都聚集在一起('m')

def chunks(df,folds):

    df_no_topup=df.loc[df['Top-up Month']==0]
    df_topup=df.loc[df['Top-up Month']==1]

    recs_no_topup=int(df.loc[df['Top-up Month']==0].shape[0]/folds)

    start_no_topup=0
    stop_no_topup=recs_no_topup
    list_df=[]

    for fold in range(0,folds):
        fold_n=df_no_topup.iloc[start_no_topup:stop_no_topup,:]
        start_no_topup=stop_no_topup
        stop_no_topup=start_no_topup+recs_no_topup
        df=pd.concat([fold_n,df_topup],axis=0)
        list_df.append(df)
    return list_df

上面的代码片段将主要类数据划分为多个折,每个折包含相同数量的数据点。然后大多数类数据的第一个折(在上面的代码中被引用为fold_n)与次要类(df_topup)的所有数据连接在一起。

以上在一个循环中发生,循环将继续,直到等于折“n”的大小。可以看到,每次,大多数类数据的一个新块与次要类的完整数据连接,从而允许模型在训练阶段在比例相同的数据下进行训练。

Major class initially - 106677
Fold size(n) - 5
Major class data(k) per fold=106677/5 - 21335
Minor class(all minor classes combined) - 21978
Total data per fold(major+minor) - 43313


下面代码片段中的代码也可以验证这一点。

list_data=chunks(df_train_main,5)
list_data_shape=[df.shape for df in list_data]
print(list_data_shape)

[(43313, 6), (43313, 6), (43313, 6), (43313, 6), (43313, 6)]

现在可以看到,一个具有严重类不平衡问题的大数据集被划分为5个小数据集

不过,以下是我从上述方法中认识到的两个问题:

  • 添加到每个折中的大多数类数据的分布。因为我们只是将整个大类数据划分为折(n),折的分布与原有分布不同。

  • 不过,在所有需要解决的问题中,类(12-18个月)和主要类(“No Top-up Service”)之间仍然存在不平衡。但对于二类,这种方法效果更好。

这些折的数据然后被传递到一个模型,以训练模型使用更少的不平衡数据。这是一种通用的方法,不仅可以应用于结构化数据,还可以应用于图像等非结构化数据。

我个人在一个Kaggle竞赛中应用了同样的方法进行图像分类,并获得了更好的准确度。

往期精彩回顾



适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值