SageMaker

передача массива numpy в predict_fn при построении выводов для модели xgboost

У меня есть модель,которая обучена локально и развернута в SageMaker для создания выводов/вызова конечной точки.Когда я пытаюсь сделать предсказания,я получаю следующее исключение.

raise ValueError('Input numpy.ndarray must be 2 dimensional')
ValueError: Input numpy.ndarray must be 2 dimensional
    

Моя model представляет собой модель xgboost с некоторой предварительной обработкой (переменное кодирование) и настройкой гиперпараметров. Вот как выглядит объект model

XGBRegressor(colsample_bytree=xxx, gamma=xxx,
             learning_rate=xxx, max_depth=x, n_estimators=xxx,
             subsample=xxx)

Мои тестовые данные представляют собой строку значений float,которая превращается в массив,поскольку данные должны быть переданы как массив numpy.

testdata = [........., 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 2000, 200, 85, 412412, 123, 41, 552, 50000, 512, 0.1, 10.0, 2.0, 0.05]

Я пытался изменить форму массива numpy с 1d на 2d,однако это не сработало,поскольку количество признаков между тестовыми данными и обученной моделью не совпадает.

Мой вопрос заключается в том,как передать массив numpy,равный длине числа признаков в обученной модели? Я могу делать предсказания,передавая тестовые данные в виде списка локально.

Подробнее о сценарии вывода здесь: https://github.com/aws-samples/amazon-sagemaker-local-mode/blob/main/xgboost_script_mode_local_training_and_serving/code/inference.py

Traceback (most recent call last):
File "/miniconda3/lib/python3.6/site-packages/sagemaker_containers/_functions.py", line 93, in wrapper
return fn(*args, **kwargs)
File "/opt/ml/code/inference.py", line 75, in predict_fn
prediction = model.predict(input_data)
File "/miniconda3/lib/python3.6/site-packages/xgboost/sklearn.py", line 448, in predict
test_dmatrix = DMatrix(data, missing=self.missing, nthread=self.n_jobs)
File "/miniconda3/lib/python3.6/site-packages/xgboost/core.py", line 404, in __init__
self._init_from_npy2d(data, missing, nthread)
File "/miniconda3/lib/python3.6/site-packages/xgboost/core.py", line 474, in _init_from_npy2d
raise ValueError('Input numpy.ndarray must be 2 dimensional')
ValueError: Input numpy.ndarray must be 2 dimensional

Попробуйте преобразовать ваш список в массив numpy 2d следующим образом:

a = np.array([1, 2, 3])

и замените [1, 2, 3] своим списком.




XGBoost,подобно scikit-learn,воспринимает X как двумерные данные (n_samples,n_features).Чтобы предсказать одну выборку,необходимо преобразовать список или вектор признаков в двумерный массив.

import numpy as np

lst = [1, 2, 3]
lst_reshaped = np.array(lst).reshape((1,-1))
clf.predict(lst_reshaped)