【问题标题】:Best way to combine the output of 2 neural networks?结合2个神经网络输出的最佳方法?
【发布时间】:2022-01-12 20:54:37
【问题描述】:

我有 2 个神经网络模型(预训练的变压器 BERT,但每个模型的输入数据(微调数据)不同)这是一个二进制分类任务(1 或 0)。

模型 1 --> 实现了 45% 的 F-measure(当然这不是很好)

模型 2---> 实现了 80% 的总体 F 测量(更好)。

然而,在model 2中被错误分类的大部分句子(80%)在model 1中被正确分类(尽管它达到了低F-测量,但它得到了 model2 没有得到的东西)。

结合 model1 和 model2 的输出的最佳方法是什么? 输出可以是 0 或 1,或者我们可以查看每个分数的概率 [3.2,0.5] 前者是 0 的概率,后者是 prob。 1(即:soft-max 层输出)。

我所做的是对每个标签的每个模型输出的概率进行软投票,如下面的代码所示,但它只提高了 1%,所以 F-measure 是 81% 而不是 80%,这就是我想要的原因检查是否有更好的方法?

soft_voting=[]
import collections
for model1, model2 in zip(model_outputs,model_outputs2):
    
    prob_zero=max(model1[0],model2[0])
    prob_one=max(model1[1],model2[1])
    soft_voting_result=0 if prob_zero>prob_one else 1
    soft_voting.append(soft_voting_result)

我也尝试用平均值或加权平均值替换最大值,但没有发现太大差异。

【问题讨论】:

  • 您必须记住的一件事是,如果数据不平衡(比如说 80/20),80% 的准确率可能是平均性能。在这种情况下,我认为堆叠 2 个模型是不相关的。
  • @DimitriK.Sifoua,数据是平衡的,但是,我打乱了训练和测试集,所以 80% 实际上在 79~83 之间波动,而 45% 在 40~46 之间波动。
  • 如果数据是平衡的,你必须在训练和测试集中保持相同的比例(分层)。话虽如此,数据平衡良好的F1分数中有45%是糟糕的表现。所以我建议你在尝试集成这两个模型之前继续尝试改进模型 1。
  • @DimitriK.Sifoua,说得好,scitkitlearn train_test split 函数支持分层,我将它添加到函数调用中。问题是 45% 的模型实际上来自于对类似任务(但不是同一任务)的训练,这就是为什么它比模型 2 更好地预测看不见的句子,但它的整体性能并不是那么好。当我通过在模型 2 数据集(原始火车)然后模型 1 数据集(类似任务)上训练我的模型进行 2 阶段训练时,模型 1 提高到近 55%,但仍然投票使模型 2 的性能提高了 1%,所以不多改进!有什么想法吗?

标签: python tensorflow deep-learning neural-network ensemble-learning


【解决方案1】:

我取得的最好结果是实际使用了 3 个模型。我将 A 的情况作为最终预测:所有模型都预测相同的类别,或者如果不是这种情况 B:选择 3 个模型中的 2 个同意的类别。由于您正在进行二进制分类,因此总是会出现这种情况。

【讨论】:

  • 感谢您的回答,格里。问题是模型 1 使用来自不同任务的数据集,这就是为什么它达到了 45% 左右的低水平,但它得到了模型 2 没有的正确答案。我尝试了您使用模型3 提出的建议,其中模型3 在原始任务的相同数据集上进行训练,因此它的性能与模型2 一样大约80%,但在模型2 失败的情况下它也失败了,所以我没有从多数投票中获得任何收益,因为模型2和 model3 几乎总是一致的。
  • 你试过合并两个数据集吗?
  • 是的,性能波动79~82%,所以主要像model2的性能,虽然来自model1的数据集是model2的两倍
猜你喜欢
  • 2017-11-21
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2019-07-14
  • 2015-02-23
相关资源
最近更新 更多