如何让AzureML分类模型在线端点返回含传入ID的多字段响应
在AzureML在线端点中返回传入的ID字段以关联预测结果
要实现端点返回传入的ID字段并关联预测结果,需要同时修改请求代码和AutoML生成的评分脚本,具体步骤如下:
1. 更新调用端点的请求数据
确保传入的data1包含用于关联的ID字段(例如命名为record_id),让评分脚本可以获取到该字段。修改后的请求代码示例:
import json import urllib.request import pandas as pd # 示例:构造包含ID的特征数据 data1 = pd.DataFrame({ "record_id": [1001, 1002, 1003], "age": [32, 45, 29], "job": ["admin", "blue-collar", "technician"], "marital": ["married", "single", "married"], # 其他特征列... }) data = { "Inputs": { "data": data1.to_dict('records') }, "GlobalParameters": { "method": "predict_proba" } } body = str.encode(json.dumps(data)) url = 'http://MyDeployement.MyRegion.azurecontainer.io/score' headers = {'Content-Type':'application/json'} req = urllib.request.Request(url, body, headers) response = urllib.request.urlopen(req) result = response.read() encoding = response.info().get_content_charset('utf-8') JSON_object = json.loads(result.decode(encoding)) print(JSON_object)
2. 修改AutoML生成的评分脚本
需要调整输入输出Schema,并在预测逻辑中保留ID字段与结果合并,核心修改如下:
import pandas as pd import numpy as np import os import joblib from azureml.core import Model from azureml.automl.core.shared import logging_utilities, log_server from azureml.automl.core.shared.constants import DEFAULT_MODEL_NAME from azureml.automl.runtime.scoring_script import PandasParameterType, StandardPythonParameterType, NumpyParameterType # 更新输入样本:添加ID字段的示例 data_sample = PandasParameterType(pd.DataFrame({ "record_id": pd.Series([0], dtype="int64"), "age": pd.Series([0], dtype="int64"), "job": pd.Series(["example_value"], dtype="object"), "marital": pd.Series(["example_value"], dtype="object"), "education": pd.Series(["example_value"], dtype="object"), # 其他特征列... })) input_sample = StandardPythonParameterType({'data': data_sample}) method_sample = StandardPythonParameterType("predict") sample_global_params = StandardPythonParameterType({"method": method_sample}) # 更新输出样本:定义包含ID和预测结果的结构 result_sample = PandasParameterType(pd.DataFrame({ "record_id": pd.Series([0], dtype="int64"), "prediction": pd.Series(["example_value"], dtype="object"), "probability_class_0": pd.Series([0.5], dtype="float64"), "probability_class_1": pd.Series([0.5], dtype="float64") })) output_sample = StandardPythonParameterType({'Results': result_sample}) try: log_server.enable_telemetry(INSTRUMENTATION_KEY) log_server.set_verbosity('INFO') logger = logging.getLogger('azureml.automl.core.scoring_script_v2') except: pass def init(): global model model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'model.pkl') path = os.path.normpath(model_path) path_split = path.split(os.sep) log_server.update_custom_dimensions({'model_name': path_split[-3], 'model_version': path_split[-2]}) try: logger.info("Loading model from path.") model = joblib.load(model_path) logger.info("Loading successful.") except Exception as e: logging_utilities.log_traceback(e, logger) raise @input_schema('GlobalParameters', sample_global_params, convert_to_provided_type=False) @input_schema('Inputs', input_sample) @output_schema(output_sample) def run(Inputs, GlobalParameters={"method": "predict"}): data = Inputs['data'] # 确保输入数据转为DataFrame if not isinstance(data, pd.DataFrame): data = pd.DataFrame(data) # 提取ID并移除特征数据中的ID列(避免模型报错) record_ids = data['record_id'].values feature_data = data.drop(columns=['record_id']) # 执行预测并合并ID if GlobalParameters.get("method", None) == "predict_proba": result = model.predict_proba(feature_data) result_df = pd.DataFrame({ "record_id": record_ids, "probability_class_0": result[:, 0], "probability_class_1": result[:, 1] }) elif GlobalParameters.get("method", None) == "predict": result = model.predict(feature_data) result_df = pd.DataFrame({ "record_id": record_ids, "prediction": result }) else: raise Exception(f"Invalid predict method argument received. GlobalParameters: {GlobalParameters}") return {'Results': result_df.to_dict('records')}
关键注意事项
- 保持ID字段名称(如
record_id)在请求数据和评分脚本中统一 - 必须从特征数据中移除ID列后再传入模型,避免因模型训练时未包含该列导致报错
- 可根据实际需求调整输出结果的字段名称和格式
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

