如何使用C#为PredictionServiceClient序列化payload并调用GCP AutoML预测接口
解决方法
1. 修复区域端点不匹配问题
Google.Cloud.AutoML.V1库默认调用全球通用端点,部署在eu区域的模型必须指定对应区域专属端点,你需要在创建客户端时手动配置PredictionServiceSettings的Endpoint属性:
var settings = new PredictionServiceSettings { Endpoint = "eu-automl.googleapis.com" }; // 传入自定义配置创建客户端 PredictionServiceClient predictionServiceClient = PredictionServiceClient.Create(settings);
如果未在系统环境变量中配置GOOGLE_APPLICATION_CREDENTIALS,也可以手动加载服务账号密钥:
var credential = GoogleCredential.FromFile("[MY-SERVICE-ACCOUNT-KEY-FILE].json"); var settings = new PredictionServiceSettings { Endpoint = "eu-automl.googleapis.com", Credential = credential };
2. 修复Payload未填充问题
你当前初始化的ExamplePayload为空对象,针对Tables类型的预测,需要将待预测的特征数据填充到ExamplePayload.Tables属性中,数据内容对应你PowerShell请求里[MY-REQUEST-FILE].json的入参:
ExamplePayload payload = new ExamplePayload { Tables = new TablesPayload { Row = new Row { // 按你训练模型时的输入特征顺序,依次填入待预测的特征值 Values = { Value.ForString("特征1的值"), Value.ForNumber(123), // 数值类型特征 Value.ForBool(true) // 布尔类型特征 // 其余特征按顺序补充 } } } };
完整代码示例
using Google.Cloud.AutoML.V1; using Google.Protobuf.WellKnownTypes; using Google.Apis.Auth.OAuth2; using System.Collections.Generic; // 配置客户端 var settings = new PredictionServiceSettings { Endpoint = "eu-automl.googleapis.com", // 若已配置环境变量可省略下面的Credential配置 Credential = GoogleCredential.FromFile("[MY-SERVICE-ACCOUNT-KEY-FILE].json") }; PredictionServiceClient predictionServiceClient = PredictionServiceClient.Create(settings); // 配置请求参数 ModelName name = ModelName.FromProjectLocationModel("[MY-PROJECT-ID]", "eu", "[MY-MODEL-ID]"); ExamplePayload payload = new ExamplePayload { Tables = new TablesPayload { Row = new Row { Values = { // 替换为你实际的待预测特征值,顺序与训练时输入特征顺序一致 Value.ForString("xxx"), Value.ForNumber(xx), // 补充所有特征 } } } }; IDictionary<string, string> @params = new Dictionary<string, string> { { "feature_importance", "true" } }; // 发起请求 PredictResponse response = predictionServiceClient.Predict(name, payload, @params); // 输出预测结果,对应你PowerShell返回的payload内容 foreach (var result in response.Payload) { System.Console.WriteLine($"分类: {result.Tables.Value}, 置信度: {result.Tables.Score}"); }
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

