如何使用 class_weight 参数进行验证集?

数据挖掘 Python 喀拉斯 加权数据
2021-09-19 07:11:19

我正在使用 Keras 的class_weight参数来处理不平衡的类问题。我这样做是为了定义权重:

weights = class_weight.compute_class_weight('balanced',np.unique(trainY),trainY)

然后,在我的网络中:

model.add(LSTM(..., class_weight=weights,...,callbacks=callbacks_list))

但是,我还使用回调列表来防止过度拟合,方法是基于validation_accuracy...强加 EarlyStopping:

earlystop = EarlyStopping(monitor='val_acc', min_delta=0.001, patience=5, verbose=1, mode='auto')
callbacks_list = [earlystop]

但是,我的权重仅根据我的训练集定义......但我的验证集也包含不平衡的数据,与训练集的比例不同,我也想给予适当的权重以对val_loss参数进行公平的评估...... .

所以我的问题是

  1. 计算的权重是val_loss多少?使用参数中给出的权重class_weight还是这个参数只用于训练损失?

  2. 我如何定义可用于验证集的权重,以获得更准确的值val_loss

谢谢

2个回答

您不应该对验证集应用权重,因为它应该衡量模型的性能。如果你这样做,你可能会得到更好的验证结果,但一旦你的模型被部署,它在新数据上的表现会更差。加权、重采样技术等——它们都应该只在训练集上完成!

如此处所述您可以定义自定义指标。您只需要使用验证集权重来计算分数。

def my_metric(y_true, y_pred):
     sw=compute_sample_weight('balanced',y_true)
     return accuracy_score(y_true, y_pred, sample_weight=sw)