【问题标题】:Balance dataset using pandas使用 pandas 平衡数据集
【发布时间】:2021-04-15 21:06:29
【问题描述】:

这是一个机器学习程序。

我正在使用一个dataset,它有一个包含 id 的 csv,用于另一个目录中的 .tif 图像,以及一个标签,1 或 0。csv 中有 220,025 行。我已将此 csv 作为熊猫数据框加载。目前在数据框中,有 220,025 行,其中 130,908 行标签为 0,89,117 行标签为 1。

标签为 0 的行比标签 1 多 41,791 行。我想随机删除标签为 1 的额外行。之后,我想将样本大小从 178,234 减少到仅 50,000,每个标签有 25,000 个 id。

另一种方法可能是随机删除标签为 1 的 105,908 行和标签为 0 的 64,117 行。

如何使用 pandas 做到这一点?

我已经研究过使用.groupby,然后使用.sample,但这会在两个标签中删除相同数量的行,而我只想在一个标签中删除行。

csv 样本:

id,label
f38a6374c348f90b587e046aac6079959adf3835,0
c18f2d887b7ae4f6742ee445113fa1aef383ed77,1
755db6279dae599ebb4d39a9123cce439965282d,0
bc3f0c64fb968ff4a8bd33af6971ecae77c75e08,0
068aba587a4950175d04c680d38943fd488d6a9d,0
acfe80838488fae3c89bd21ade75be5c34e66be7,0
a24ce148f6ffa7ef8eefb4efb12ebffe8dd700da,1
7f6ccae485af121e0b6ee733022e226ee6b0c65f,1
559e55a64c9ba828f700e948f6886f4cea919261,0
8eaaa7a400aa79d36c2440a4aa101cc14256cda4,0

【问题讨论】:

    标签: python pandas csv machine-learning


    【解决方案1】:

    就个人而言,我会将其分解为以下步骤:

    由于您的 0 比 1 多,我们首先要确保将每个的数量均等化。在这里,我使用您粘贴的示例数据为df

    • 计算 1 的数量(因为这是我们的较小值)
    ones_subset = df.loc[df["label"] == 1, :]
    number_of_1s = len(ones_subset)
    
    print(number_of_1s)
    3
    
    • 仅采样零以匹配number_of_1s 的数量
    zeros_subset = df.loc[df["label"] == 0, :]
    sampled_zeros = zeros_subset.sample(number_of_1s)
    
    print(sampled_zeros)
    
    • 将这 2 个块(来自我们的 ones_subset 和我们匹配的 sampled_zeros 的所有 1 粘在一起,形成一个干净的数据帧,其中包含相同数量的 1 和 0 标签
    clean_df = pd.concat([ones_subset, sampled_zeros], ignore_index=True)
    
    print(clean_df)
                                             id  label
    0  c18f2d887b7ae4f6742ee445113fa1aef383ed77      1
    1  a24ce148f6ffa7ef8eefb4efb12ebffe8dd700da      1
    2  7f6ccae485af121e0b6ee733022e226ee6b0c65f      1
    3  559e55a64c9ba828f700e948f6886f4cea919261      0
    4  f38a6374c348f90b587e046aac6079959adf3835      0
    5  068aba587a4950175d04c680d38943fd488d6a9d      0
    

    现在我们有了一个清理过的数据集,我们可以继续最后一步:

    • 使用您提到的groupby(...).sample(...) 方法进一步对该数据集进行下采样。从每个标签有 3 个(三个 1 和三个 0)的数据集中取到较小的匹配大小(两个 1 和两个 0)
    downsampled_df = clean_df.groupby("label").sample(2)
    
    print(downsampled_df)
                                             id  label
    4  f38a6374c348f90b587e046aac6079959adf3835      0
    5  068aba587a4950175d04c680d38943fd488d6a9d      0
    1  a24ce148f6ffa7ef8eefb4efb12ebffe8dd700da      1
    0  c18f2d887b7ae4f6742ee445113fa1aef383ed77      1
    

    【讨论】:

    • 感谢您的回答!我实现了它并且它有效。我还打乱了数据框并在之后重置了索引。感谢您的帮助!
    猜你喜欢
    • 2022-10-16
    • 2018-07-28
    • 2022-07-17
    • 2023-03-15
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-03-15
    相关资源
    最近更新 更多