我有一个数据集,其中看起来相似的类之一是不平衡的。这是一个数字数据集,其中类别标签的范围是1到10。
在训练集上按标签(y
)分组可以得到以下输出:
(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=uint8), array([13861, 10585, 8497, 7458, 6882, 5727, 5595, 5045, 4659,
4948]))
可以看出1
有13861
个数据点,而7
只有5595
个数据点。
为了避免1
和7
之间的类不平衡,我想为7
类添加一些额外的图像。
此处设置了train
:
from scipy.io import loadmat
train = loadmat('train.mat')
extra = loadmat('extra.mat')
train
和extra
都是字典,每个字典有2个键X
和y
。
以下是train
和extra
的形状:
train['X'] --> (32, 32, 3, 73257)
# 73257 images of 32x32x3
train['y'] --> (73257,1)
# 73257 labels of corresponding images
extra['X'] --> (32, 32, 3, 531131)
# 531131 images of 32x32x3
extra['y'] --> (531131, 1)
# 531131 labels of corresponding images
现在,我想用train
中的标签更新extra
数据集,主要是将x%
中7
中标签为extra
的数据{{1} }}。我该怎么办?
我尝试了以下操作:
train
但是我收到一个错误,说arr, _ = np.where(extra['y'] == 7)
c = np.concatenate(X_train, extra['X'][arr])
答案 0 :(得分:1)
这是仅用于numpy数组的有效示例,可以轻松转换为您的情况。编辑完毕后,使用numpy.where
在extra['y']
上查找所需的标签并保留这些索引。然后将它们与numpy.append
一起使用,以将原始数据集与多余的数据连接起来(X
的最后一个轴和y
的第一个轴)。
import numpy as np
np.random.seed(100)
# First find the indices of your y_extra with label 7
x_extra = np.random.rand(32, 32, 3, 10)
y_extra = np.random.randint(0, 9, size=(10,1))
indices = np.where(y_extra==7)[0] # indices [3,4] are 7 with seed=100
# Now use this indices to concatenate them in the original datase
np.random.seed(101)
x_original = np.random.rand(32, 32, 3, 10)
y_original = np.random.randint(1, 10, size=(10,1))
print(x_original.shape, x_extra[..., indices].shape) # (32, 32, 3, 10) (32, 32, 3, 2)
print(y_original.shape, y_extra[indices].shape) # (10, 1) (2, 1)
x_final = np.append(x_original, x_extra[..., indices], axis=-1)
y_final = np.append(y_original, y_extra[indices], axis=0)
print(x_final.shape, y_final.shape) # (32, 32, 3, 12) (12, 1)