SageMaker

在对xgboost模型进行推理时,向predict_fn传递一个numpy数组

我有一个在本地训练的模型,并部署到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] 替换为您的列表。




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)