Копирование значений из массива Numpy для балансировки набора данных - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть набор данных, в котором один из похожих классов выглядит несбалансированным.Это набор данных с номерами, в которых метки классов идут от 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 в train.Как я мог это сделать?

Я попробовал следующее:

arr, _ = np.where(extra['y'] == 7)
c = np.concatenate(X_train, extra['X'][arr])

Но я получаю сообщение об ошибке IndexError: index 32 is out of bounds for axis 0 with size 32

1 Ответ

1 голос
/ 22 апреля 2019

Вот рабочий пример только с пустыми массивами, которые легко переводятся в ваш случай. Как вы редактировали, используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...