【问题标题】:Class weights in binary classification model with Keras使用 Keras 的二元分类模型中的类权重
【发布时间】:2017-09-09 10:50:34
【问题描述】:

我们知道,对于二元分类模型中的不平衡数据,我们可以在 fit 方法中传递一个类权重字典。我的问题是,当输出层中仅使用 1 个节点进行 sigmoid 激活时,我们还能在训练期间应用类权重吗?

model = Sequential()
model.add(Dense(64, activation='tanh',input_shape=(len(x_train[0]),)))
model.add(Dense(1, activation='sigmoid')) 

model.compile(
    optimizer=optimizer, 
    loss=loss, 
    metrics=metrics)

model.fit(
    x_train, y_train, 
    epochs=args.e, 
    batch_size=batch_size,
    class_weight={0: 1, 1: 3})

【问题讨论】:

  • 根据我后来的经验,答案是肯定的。无论我们使用哪个输出层,类权重始终可以应用于数据集。
  • 据我了解,班级权重适用于真阳性和真阴性。是否还有一种方法可以赋予误报和误报权重,或者它们是相互依赖的?
  • @JieHE 感谢您的关注和评论。

标签: classification keras


【解决方案1】:

如果你想完全控制这个权重,为什么不写一个自定义的损失函数呢?

from keras import backend as K
def weighted_binary_crossentropy( y_true, y_pred, weight=1. ) :
    y_true = K.clip(y_true, K.epsilon(), 1-K.epsilon())
    y_pred = K.clip(y_pred, K.epsilon(), 1-K.epsilon())
    logloss = -(y_true * K.log(y_pred) * weight + (1 - y_true) * K.log(1 - y_pred))
    return K.mean( logloss, axis=-1)

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 2021-07-20
    • 2019-08-27
    • 2020-11-04
    • 2016-07-05
    • 2021-08-29
    • 2017-10-25
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多