SageMaker

passaggio di un array numpy a predict_fn durante l'inferenza per il modello xgboost

Ho un modello che è stato addestrato localmente e distribuito a SageMaker per fare inferenze/invocare endpoint.Quando provo a fare previsioni,ottengo la seguente eccezione.

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

Il mio model lo è un modello xgboost con alcune pre-elaborazioni (codifica delle variabili) e ottimizzazione degli iperparametri. Ecco come appare l'oggetto model lo :

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

I miei dati di test sono una stringa di valori float che viene trasformata in un array poiché i dati devono essere passati come array 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]

Ho provato a rimodellare l'array numpy da 1d a 2d,ma non funziona perché il numero di caratteristiche tra i dati di test e il modello addestrato non corrisponde.

La mia domanda è:come posso passare un array numpy uguale alla lunghezza del numero di caratteristiche nel modello addestrato? Sono in grado di fare previsioni passando i dati di test come un elenco in locale.

Maggiori informazioni sullo script di inferenza qui: 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

Provare a convertire l'elenco in un array numpy 2d in questo modo:

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

e sostituisci [1, 2, 3] con il tuo elenco.




XGBoost,simile a scikit-learn,si aspetta X come dati 2D (n_campioni,n_caratteristiche).Per prevedere un campione,è necessario rimodellare l'elenco o il vettore di caratteristiche in un array 2D.

import numpy as np

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