在雾散时告别 2025-11-12 22:09 采纳率: 75%
浏览 7
已结题

多输出回归模型评价时遇到的问题

模型训练又出现问题啦,希望得到大家的help。
前情提要:
BP神经网络、输出输出都包括数值型和类别型,因此采用one-hot编码对类别型处理。由于不同数之前的维度差别较大,采用了log预处理、归一化的处理方式。在最终计算指标的时候,进行了反归一化和反log化。在此基础上直接计算了MSE、RMES、MAE等指标。
现有问题:
(1)评价模型时,是全部都用归一化模型的这种指标,还是类别型的要用分类指标呢?
个人感觉是都用归一化这种就行吧。但是那one-hot这种怎么处理。
(2)评价模型前,是否需要将one-hot这种预测的列,将一个类别的数据中的向量,找出max直接设置为1,其他变成0?然后在进行评价?
因为考虑到工程实际问题,采用的时候也是需要这种的,因为类别型只能是某一类。
(3)计算评价指标的时候,这些one-hot向量是按照向量计算的吗?还是每列值呢?
训练模型真是一个漫长的过程,总是以为要结束了,结果是发现了一个新问题。
加油吧!希望大家可以帮我解答一下。

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-12 22:26
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案能帮助您,请采纳,非常感谢!
    .
    每日一句正能量,让它带给您好心情:生活中的每一个小进步,都值得被庆祝。
    .

    您好!您遇到的问题在多输出回归(混合数据类型输出)建模中非常典型,处理方式的好坏直接影响到模型评价的合理性和工程应用的可行性。我们来逐一分析并解决您提出的问题。

    问题核心分析

    您的模型输出包含两种类型的数据:

    1. 数值型:如价格、温度等,是连续的。
    2. 类别型:如物种、等级等,是离散的,您已用 one-hot 编码处理。

    关键在于:对这两种本质不同的输出,应该采用不同的评价策略。将它们混为一谈,统一用回归指标或分类指标来评价,都是不合适的。


    问题解答

    (1)评价模型时,是全部都用归一化模型的这种指标,还是类别型的要用分类指标呢?

    结论:必须分开评价。数值型输出用回归指标,类别型输出用分类指标。

    • 对于数值型输出
    • 您的做法(反归一化、反log化后计算MSE, RMSE, MAE)是完全正确的。这些指标衡量的是预测值与真实值在原始尺度上的差距,具有明确的物理意义(例如,价格预测误差了10元)。
    • 切勿在归一化后的数据上计算这些指标,因为其数值大小失去了实际意义。
    • 对于类别型输出
    • 绝对不能用MSE、MAE等回归指标来评价。one-hot向量之间的欧氏距离(如MSE)并不能准确反映分类的正确性。一个预测为 [0.1, 0.9, 0.0] 的向量(真实值为 [0, 1, 0])的MSE可能比 [0.4, 0.35, 0.25] 要小,但前者清晰地预测了第二类,而后者则非常模糊。
    • 必须使用分类指标,如准确率精确率召回率F1-Score混淆矩阵等。

    所以,您的模型最终应该输出两套评价结果:

    1. 一套针对数值型输出的:MSE, RMSE, MAE。
    2. 一套针对类别型输出的:Accuracy, Precision, Recall, F1。

    (2)评价模型前,是否需要将one-hot这种预测的列,将一个类别的数据中的向量,找出max直接设置为1,其他变成0?

    结论:是的,这是将模型输出转化为最终分类结果的必要步骤,通常称为 argmax 操作。

    • 为什么需要这么做?
    • 您的神经网络最后一层对于类别输出通常使用 softmax 激活函数,它的输出是一个概率分布,表示属于每个类别的可能性。例如 [0.05, 0.85, 0.10]
    • 在工程应用和最终评价时,我们需要一个确定的类别,而不是一个概率分布。因此,需要取概率最大的那个维度作为预测类别,即 argmax([0.05, 0.85, 0.10]) = 1,并将其转换为 one-hot 向量 [0, 1, 0]
    • 如何进行?
    • 在得到模型的原始预测输出后,您需要将对应于类别输出的那部分数据(即one-hot编码的部分)进行 argmax 处理。
    • 同时,您的真实标签(ground truth)本身已经是 one-hot 格式(如 [0, 1, 0])。
    • 然后,用处理后的预测结果 [0, 1, 0] 和真实的 one-hot 标签 [0, 1, 0] 来计算上述的分类指标(准确率等)。

    示例代码(Python):

    import numpy as np
    from sklearn.metrics import accuracy_score, mean_squared_error
    
    
    # 假设 model_output 是模型的原始预测,包含数值型和类别型输出
    # 假设前2维是数值型,后3维是一个3类别的one-hot输出
    model_output = np.array([
        [10.5, 20.1, 0.1, 0.7, 0.2],  # 预测样本1
        [12.1, 18.9, 0.8, 0.1, 0.1]   # 预测样本2
    ])
    
    
    # 1. 分离输出
    numeric_pred = model_output[:, :2]  # 前两列是数值预测
    category_pred = model_output[:, 2:] # 后三列是类别概率
    
    
    # 2. 对类别输出进行 argmax 并转回 one-hot (用于后续计算指标)
    category_pred_hard = np.eye(category_pred.shape[1])[np.argmax(category_pred, axis=1)]
    
    
    print("原始类别预测(概率):")
    print(category_pred)
    print("\nArgmax 后的 one-hot 预测:")
    print(category_pred_hard)
    
    
    # 假设我们有对应的真实标签
    y_true_numeric = np.array([[10.0, 20.0], [12.0, 19.0]])
    y_true_category = np.array([[0, 1, 0], [1, 0, 0]]) # 真实的 one-hot 标签
    
    
    # 3. 分别计算指标
    mse = mean_squared_error(y_true_numeric, numeric_pred)
    accuracy = accuracy_score(
        np.argmax(y_true_category, axis=1), # 将真实one-hot转为类别索引
        np.argmax(category_pred, axis=1)    # 将预测概率转为类别索引,这里直接用argmax结果,无需转回one-hot
    )
    
    
    print(f"\n数值输出 MSE: {mse:.4f}")
    print(f"类别输出 Accuracy: {accuracy:.4f}")
    

    (3)计算评价指标的时候,这些one-hot向量是按照向量计算的吗?还是每列值呢?

    这个问题的答案取决于您指的是什么指标。

    • 对于回归指标(错误做法):如果您错误地计算了MSE,那么它是按向量/元素计算的。它会比较预测向量 [0.1, 0.7, 0.2] 和真实向量 [0, 1, 0] 中每一个对应位置的值。
    • 对于分类指标(正确做法):分类指标不是基于one-hot向量的逐元素比较。
    • 它们是基于 argmax 操作后的结果进行比较的。计算流程是:
    1. 预测概率向量 -> argmax -> 得到预测类别索引 (如 1)。
    2. 真实 one-hot 向量 -> argmax -> 得到真实类别索引 (如 1)。
    3. 比较这两个索引是否相等,从而判断这个样本是否预测正确。
    • 准确率就是所有样本中预测正确的比例。
    • 精确率、召回率等则是在这个基础上,按类别进行统计计算的。

    总结一下正确的评价流程:

    1. 模型预测:获取模型的原始输出。
    2. 结果分离:将输出分离为数值部分和类别概率部分。
    3. 后处理
    • 数值部分:进行反归一化、反log化,恢复到原始尺度。
    • 类别部分:进行 argmax 操作,得到每个样本的预测类别。
    1. 计算指标
    • 用处理后的数值部分和真实的数值标签计算 MSE, RMSE, MAE
    • argmax 得到的预测类别和真实的类别标签计算 Accuracy, Precision, Recall, F1

    您的感觉是对的,训练模型就是一个不断发现和解决问题的过程。您能考虑到这些细节,已经走在正确的路上了。分开处理和评价是解决这个问题的关键。加油!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月12日