【问题标题】:Multi labeled image classification with imbalanced data, how to split it?具有不平衡数据的多标签图像分类,如何拆分?
【发布时间】:2021-02-26 11:25:59
【问题描述】:

我正在处理多标签图像分类。这是我的数据框:

[更新]

您可以看到标有 26 个特征的图像。 “1”表示存在,“0”表示不存在。

我的问题是许多标签的数据不平衡。例如:

[1] train_df.value_counts('Eyeglasses')

Output:

Eyeglasses
0    54735
1     1265
dtype: int64

[2] train_df.value_counts('Double_Chin')

Output:
Double_Chin
0    55464
1      536
dtype: int64

如何将训练数据和验证数据两者平衡地拆分?

[更新]

我试过

from imblearn.over_sampling import SMOTE
smote = SMOTE()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
                                                        random_state=42)

X_train_smote, y_train_smote = smote.fit_sample(X_train, y_train)

ValueError: Imbalanced-learn 当前支持二进制、多类和 二进制编码的多类目标。多标签和多输出 不支持目标。

【问题讨论】:

    标签: python machine-learning scikit-learn data-analysis imbalanced-data


    【解决方案1】:

    您的问题混合了两个概念:将多类、多标签图像数据集拆分为具有比例表示的子集,以及处理类不平衡的重采样方法。我将只关注问题的分裂部分,因为这就是标题的内容。

    我会使用分层随机拆分,以确保每个子集具有相等的表示。这是来自维基百科的分层抽样的方便视觉效果:

    为此,我推荐skmultilearnIterativeStratification 方法。它支持多标签数据集。

        from skmultilearn.model_selection.iterative_stratification import IterativeStratification
    
        stratifier = IterativeStratification(
            n_splits=2, order=2, sample_distribution_per_fold=[1.0 - train_fraction, train_fraction],
        )
        # this class is a generator that produces k-folds. we just want to iterate it once to make a single static split
        # NOTE: needs to be computed on hard labels.
        train_indexes, everything_else_indexes = next(stratifier.split(X=img_urls, y=labels))
    
        # s3url array shape (N_samp,)
        x_train, x_else = img_urls[train_indexes], img_urls[everything_else_indexes]
        # labels array shape (N_samp, n_classes)
        Y_train, Y_else = labels[train_indexes, :], labels[everything_else_indexes, :]
    

    我在a blog post 中写了一个更完整的解决方案,包括单元测试。

    skmultilearn 的一个缺点是它没有得到很好的维护并且有一些损坏的功能。我在我的博客文章中记录了其中一些尖锐的角落和陷阱。另请注意,当您处理数百万张图像时,此分层过程非常缓慢,因为分层器仅使用单个 CPU。

    【讨论】:

    • 我尝试了你的代码,但它的原因是内存不足,即使形状是everything_else_indexes (500,26) 和 img_urls (500,)。我更新了我的问题,你可以看到我的数据框。此外,您的视觉解释没有意义,因为我无法拆分值,例如,如果 x 标签不平衡而 y 标签平衡,我无法对它们进行分层,因为它们会影响另一个标签。如果我错了,请纠正我。
    • @claymorehack 我不确定拥有平衡的 x 标签但不平衡的 y 标签意味着什么。
    • 我总共有 26 个功能。正如您在 df.png 中看到的那样,每张图片都有这些功能,我总共有 15000 张图片。总的来说,大多数特征是不平衡的,例如“Big_Nose”特征有 {0:14234, 1:766},“Doubly_Chin”特征有{0:7800, 1:7200}。问题是每个功能都相互关联,因此将它们分层是没有意义的。如果我尝试将积极的“Big_Nose”特征分层,也许我现在可以面对不平衡的“Doubly_Chin”。如果我错了,请纠正我。
    • 所以你的x 是图像本身,y 是其余的列(你的特征)。您用相关特征描述的问题是多标签数据集中的常见情况,使用IterativeStratificationorder=2 将在分层时考虑多个标签。 skmultilearn 文档中有更多详细信息和讲座视频:scikit.ml/api/…
    • 好的,我现在明白了,但棘手的一面是我的内存(16GB)即使是小数据也不够。
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 2020-02-01
    • 2017-11-01
    • 2021-04-19
    • 2017-11-03
    • 2017-05-26
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多