繁体   English   中英

调用 Vertex AI 自定义作业端点时出现格式问题

[英]Format issue when calling Vertex AI Custom Job Endpoint

我在 Vertex AI 的 sklearn 0.23 中开发了自定义训练作业,并成功部署到端点。 但是,当我调用端点时,出现以下错误:

raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.FailedPrecondition: 400 "Prediction failed: Exception during sklearn prediction: Expected 2D array, got 1D array instead:\narray=['instances'].\nReshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample."

端点告诉我正确的格式是:

{
  "instances": [
    { "instance_key_1": "value", ... }, ...
  ],
  "parameters": { "parameter_key_1": "value", ... }, ...
}

我有以下代码,来自 dataframe df ,我从那里获取 5 个示例和 71 列:

x=np.array(df.iloc[0:5,:-3].T)

instances_list = {"instances":[{coluna: valor for coluna, valor in zip(list(df.columns[0:-3]), list(df.iloc[0,0:-3]))}]}

####instances = [json_format.ParseDict(s, Value()) for s in instances_list]

results = endpoint.predict(instances=instances_list)

我的instances_list格式如下:

{'instances': [{'ID_CONTRIBUINTE': '21327662000215', 'TOTAL_E12': '354032.54', 'TOTAL_PRODUTO_E12': '352693.82', 'TOTAL_INTERESTADUAIS_E12': '282.0', 'TOTAL_INTERNAS_E12': '353750.54'}]}

但它不起作用。 有时我会收到Unable to coerce value的错误,有时端点需要一个2D array

我还遵循了以下预测格式: https://codelabs.developers.google.com/codelabs/vertex-ai-custom-code-training#7 ,在这种情况下,代码将是:

instances_list = {"instances":[valor for valor in [list(i) for i in np.array(df.iloc[0:5,0:-3])]]}

但它返回相同的错误。

看起来我们的指导方针相互矛盾。 GCP 控制台告诉我负载格式是键值对:

instance_dict={ "instance_key_1": "value", ...}

Codelabs 告诉我提交一个数组:

{
    "instances": [
      ["male", 29.8811345124283, 26.0, 1, "S", "New York, NY", 0, 0], 
      ["female", 48.0, 39.6, 1, "C", "London / Paris", 0, 1]]
}

关于如何克服这个问题的任何想法?

我解决了这个问题。 在使用ColumnTransformer预处理数据后,如task.py文件中的 package 的一部分,我创建了一个列表并成功提交到端点。

preprocessor = ColumnTransformer(
        transformers=[
            ('bin', OrdinalEncoder(), BINARY_FEATURES),
            ('num', StandardScaler(), NUMERIC_FEATURES),
            ('cat', OneHotEncoder(handle_unknown='ignore'), CATEGORICAL_FEATURES)], n_jobs=-1)

x=preprocessor.fit_transform(df)


instances_list = [list(y) for y in x[0:5]]

results = endpoint.predict(instances=instances_list)

Output:

Prediction(predictions=[0.0, 0.0, 0.0, 0.0, 0.0], deployed_model_id='123456789', explanations=None)

因此,使用sklearn进行自定义训练的正确预测格式是:

instances_list=[[1.0, 29.881134, 26.0, 1.0, 44.0, 88.0, 0.0, 0.0], 
      [0.0, 48.0, 39.6, 1,.0 22.0, 57.0, 0.0, 1.0]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM