SageMaker

xgboost 모델에 대한 추론을 할 때 numpy 배열을 predict_fn에 전달

추론을 하거나 엔드포인트를 호출하기 위해 로컬에서 훈련되고 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)

내 테스트 데이터는 데이터가 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] 을 목록으로 바꿉니다 .




scikit-learn과 유사한 XGBoost는 X를 2D 데이터(n_samples, n_features)로 예상합니다. 하나의 샘플을 예측하려면 목록 또는 특징 벡터를 2D 배열로 변형해야 합니다.

import numpy as np

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