[英]Google Cloud Platform - Vertex AI training with custom data format
[英]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.