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

机器学习初学者

共 3368字,需浏览 7分钟

 ·

2021-05-10 20:47

作者 | 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)

[(433136), (433136), (433136), (433136), (433136)]
现在可以看到,一个具有严重类不平衡问题的大数据集被划分为5个小数据集
不过,以下是我从上述方法中认识到的两个问题:
  • 添加到每个折中的大多数类数据的分布。因为我们只是将整个大类数据划分为折(n),折的分布与原有分布不同。
  • 不过,在所有需要解决的问题中,类(12-18个月)和主要类(“No Top-up Service”)之间仍然存在不平衡。但对于二类,这种方法效果更好。
这些折的数据然后被传递到一个模型,以训练模型使用更少的不平衡数据。这是一种通用的方法,不仅可以应用于结构化数据,还可以应用于图像等非结构化数据。
我个人在一个Kaggle竞赛中应用了同样的方法进行图像分类,并获得了更好的准确度。

往期精彩回顾





本站qq群851320808,加入微信群请扫码:

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报