You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不重塑3D数组的情况下用mlflow.evaluate()评估PTBXL多分类模型

问题

我基于PTBXL数据集开展5类多分类任务,数据集输入为形状(21837, 12, 5000)的3D张量——每个样本包含12导联,每导联有5000个时间步。我希望使用mlflow.evaluate()评估模型,但该函数要求输入为2D numpy数组或DataFrame,与PTBXL的3D数据格式不符。我见过的同类多分类任务示例中输入均为2D数组,但我的模型要求输入为12通道,不想通过重塑数组适配(否则需修改模型结构)。此外,我的标签是(2000,5)的独热编码格式,而mlflow.evaluate()要求标签为1D数组,转换标签的话又担心需要调整模型。

请问是否无需重塑输入数组,就能将形状为(2000,1000,12)的输入数据和(2000,5)的标签传入mlflow.evaluate()?当前处理数据的代码运行报错,代码如下:

test_signals = np.array(signals[dataset.strat_fold == 10])
test_labels = np.array(labels[dataset.strat_fold == 10])

test_labels2=np.argmax(test_labels, axis=1)
test_signals_reshaped = test_signals.reshape((test_signals.shape[0],test_signals.shape[1]*test_signals.shape[2]))

with mlflow.start_run(experiment_id=24) as run:

    # Evaluate the logged model
    result = mlflow.evaluate(
        model_uri,
        data=test_signals_reshaped,
        targets=test_labels2,
        model_type="classifier",
        evaluators=["default"],
    )
解决方案

1. 无需重塑输入的适配方法

mlflow.evaluate()的默认评估器仅支持2D输入,但可以通过模型包装+逻辑适配实现3D输入的兼容,无需修改原模型结构:

  • 先加载已训练好的原模型,创建一个包装类/函数,接收输入后直接调用原模型进行推理,自动处理形状匹配。
  • 将包装后的模型作为model参数传入mlflow.evaluate(),而非使用model_uri(也可将包装模型重新log到MLflow后使用URI调用)。

示例代码:

import mlflow
import numpy as np

# 加载原模型
original_model = mlflow.pyfunc.load_model(model_uri)

# 创建模型包装器,适配3D输入
class ModelWrapper(mlflow.pyfunc.PythonModel):
    def __init__(self, original_model):
        self.original_model = original_model
    
    def predict(self, context, model_input):
        # 自动识别输入形状,转换为原模型需要的3D格式
        if len(model_input.shape) == 2:
            # 若传入的是重塑后的2D数组,转回3D
            input_3d = model_input.reshape((model_input.shape[0], 1000, 12))
        else:
            # 直接传入3D数组则无需转换
            input_3d = model_input
        return self.original_model.predict(input_3d)

# 初始化包装后的模型
wrapped_model = ModelWrapper(original_model)

test_signals = np.array(signals[dataset.strat_fold == 10])
test_labels = np.array(labels[dataset.strat_fold == 10])
# 转换标签为1D索引,此步骤不影响模型本身
test_labels_argmax = np.argmax(test_labels, axis=1)

with mlflow.start_run(experiment_id=24) as run:
    # 直接传入3D输入数据进行评估
    result = mlflow.evaluate(
        model=wrapped_model,
        data=test_signals,
        targets=test_labels_argmax,
        model_type="classifier",
        evaluators=["default"],
    )

2. 独热标签的处理说明

mlflow.evaluate()要求标签为1D类别索引是评估逻辑的要求,无需修改模型本身——模型输出独热编码完全正常,仅需在评估阶段将标签转换为1D索引(即你代码中np.argmax(test_labels, axis=1)的操作),这一步不会改变模型的结构或推理逻辑。

3. 进阶方案:自定义评估器

若不想包装模型,可自定义MLflow评估器,直接处理3D输入和独热标签。这种方式适合需要定制评估指标的场景,需继承mlflow.models.Evaluator类,实现evaluate()方法,在方法中直接用3D数据调用模型、处理独热标签并计算指标。

关键注意点

  • 若直接传入3D numpy数组作为data参数,默认评估器可能无法识别,因此模型包装是最稳妥的适配方式,确保输入形状与原模型完全匹配。
  • 包装模型时需注意predict方法的输入类型:若data传入的是DataFrame,需先转换为numpy数组再调整形状;若传入的是numpy数组则可直接处理。

内容的提问来源于stack exchange,提问作者bambuTR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:37