【发布时间】: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