要重新采样不平衡数据集的数据框

问题描述 投票:1回答:3

Glass Identification Database是不平衡的数据集,我想进行一些重采样。

有5种玻璃的214行数据。每种类型具有不同的行数。在下面,我想执行随机欠采样,将所有类型的采样数减到最小(即每个类型仅包含9行。)

import pandas

dataset = pandas.read_csv("C:\\temp\\glass.csv"]), sep = ",")

dataset['Type'] = pandas.Categorical(dataset['Type']).codes

# Class count
count_class_0, count_class_1, count_class_2, count_class_3, count_class_4, count_class_5 = dataset.Type.value_counts()

# Divide by class
df_class_0 = dataset[dataset['Type'] == 0]
df_class_1 = dataset[dataset['Type'] == 1]
df_class_2 = dataset[dataset['Type'] == 2]
df_class_3 = dataset[dataset['Type'] == 3]
df_class_4 = dataset[dataset['Type'] == 4]
df_class_5 = dataset[dataset['Type'] == 5]

class_count = dataset.Type.value_counts()
print('Class 0:', class_count[0]) # 70
print('Class 1:', class_count[1]) # 76
print('Class 2:', class_count[2]) # 13
print('Class 3:', class_count[3]) # 29
print('Class 4:', class_count[4]) # 9
print('Class 5:', class_count[5]) # 17

# Random under-sampling
df_class_0_under = df_class_0.sample(count_class_4)
df_test_under = pandas.concat([df_class_0_under, df_class_4], axis=0)

print('Random under-sampling:')
print(df_test_under.Type.value_counts())

它显示未正确完成:

Random under-sampling:
0    13
4     9

完成它的正确方法是什么? (将所有类型带到最小数量,即每种类型仅具有9行。)

谢谢。

python pandas dataframe resampling
3个回答
1
投票

[第一个想法是使用GroupBy.head,并且只减少GroupBy.head列的数量:

Type

对于采样使用lambda函数:

dataset1 = dataset.groupby('Type').head(dataset.Type.value_counts().min())

1
投票

首先,我计算dataset1 = dataset.groupby('Type').apply(lambda x: x.sample(dataset.Type.value_counts().min())) ,即9:

min_count_type

然后,我得到所有不同类型的玻璃的列表:

min_count_type = dataset.Type.value_counts().min() -> 9

并且我根据类型过滤数据集,并仅对其采样9行。将此子数据框存储在列表中,然后连接所有子数据框:

glass_types = list(dataset.Type.unique())

0
投票

欠采样并非总是一个好选择,更好的选择是过采样,参考:[subdatasets = list() for glass_type in glass_types : dataset_glass_type = dataset[dataset['Type']==glass_type] dataset_glass_type = dataset_glass_type.sample(min_count_type) subdatasets.append(dataset_glass_type) dataset_undersampled = pd.concat(subdatasets) -> What you want !

© www.soinside.com 2019 - 2024. All rights reserved.