Измените массив изображений 3D numpy на массив 2D numpy для ввода XGBoost DMatrix - PullRequest
0 голосов
/ 03 мая 2020

У меня есть набор изображений в 3D-массиве (индекс размеров * высота * ширина).

x_train, x_test, y_train, y_test = train_test_split(X, yy, test_size=0.2, random_state=42, stratify=y)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

dtrain = xgb.DMatrix(data=x_train, label=y_train)
dtest = xgb.DMatrix(data=x_test)

Я получаю сообщение об ошибке ввода XGBoost DMatrix:

ValueError: ('Expecting 2 dimensional numpy.ndarray, got: ', (2164, 120, 431))

Форма массивов из рисунка выше:

(2164, 120, 431) (542, 120, 431) (2164, 3) (542, 3)

Я не совсем понимаю, как изменить данные. Это должно быть 2164 строки * 1 столбец?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Читая документацию , кажется, что X должен быть двумерным, а Y должен быть одномерным. Таким образом, X должен иметь форму (index_of_sample, features), поэтому ширина и высота должны быть сведены в один вектор (это не очень хорошая идея для изображений, поскольку вы теряете структурную ценность, но опять же это должно произойти, поскольку модель имеет формат xgb)

Таким образом, вам необходимо изменить форму X, чтобы она была

x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)

Также в документации говорится, что Y должен быть одномерным. Таким образом, вам нужно каким-то образом изменить Y, чтобы он стал категориальным значением вместо текущего (я предполагаю) кодирования в одно касание.

1 голос
/ 03 мая 2020

Просто измените ваши x numpy массивы.

x_train = x_train.reshape(x_train.shape[0], -1)

x_test = x_test.reshape(x_test.shape[0], -1)

...