SageMaker

passage d'un tableau numpy à predict_fn lors de l'inférence pour le modèle xgboost

J'ai un modèle qui est formé localement et déployé dans SageMaker pour faire des inférences/invoquer le point de terminaison.Lorsque j'essaie de faire des prédictions,j'obtiens l'exception suivante.

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

Mon model est un modèle xgboost avec un pré-traitement (encodage variable) et un réglage hyper-paramètre. Voici à quoi ressemble l'objet model

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

Mes données de test sont une chaîne de valeurs flottantes qui sont transformées en un tableau car les données doivent être transmises en tant que tableau 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]

J'ai essayé de remodeler le tableau numpy de 1d à 2d,cependant,cela ne fonctionne pas car le nombre de caractéristiques entre les données de test et le modèle entraîné ne correspondent pas.

Ma question est la suivante:comment puis-je passer un tableau numpy de la même longueur que le nombre de caractéristiques dans le modèle formé ? Je suis capable de faire des prédictions en passant les données de test comme une liste localement.

Plus d'informations sur le script d'inférence ici : 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

Essayez de convertir votre liste en un tableau numpy 2d comme ceci :

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

et remplacez [1, 2, 3] par votre liste.




XGBoost,similaire à scikit-learn,attend X comme des données 2D (n_échantillons,n_caractéristiques).Afin de prédire un échantillon,vous devez remodeler votre liste ou votre vecteur de caractéristiques en un tableau 2D.

import numpy as np

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