gpt4 book ai didi

python - Keras:class_weight 实际上试图平衡什么?

转载 作者:太空狗 更新时间:2023-10-30 01:31:22 25 4
gpt4 key购买 nike

我的数据具有极度的类别不平衡。约99.99%的样本为阴性;积极因素(大致)平均分配给其他三个类别。我认为我正在训练的模型基本上一直在预测多数类(class)。出于这个原因,我正在尝试对类(class)进行加权。

型号

model = Sequential()

#Layer 1
model.add(Conv1D( {{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6, 8])}}, activation='relu', kernel_initializer=kernel_initializer, input_shape=X_train.shape[1:]))
model.add(BatchNormalization())

#Layer 2
model.add(Conv1D({{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6])}}, activation='relu',kernel_initializer=kernel_initializer))
model.add(Dropout({{uniform(0, 0.9)}}))

#Flatten
model.add(Flatten())

#Output
model.add(Dense(4, activation='softmax'))

({{...}} 用于 Hyperas。)

我是如何尝试加权的

\1.在 model.fit()

中使用 class_weight
model.fit(X_train, Y_train, batch_size=64, epochs=10, verbose=2, validation_data=(X_test, Y_test), class_weight={0: 9999, 1:9999, 2: 9999, 3:1})

\2。在 model.fit() 中使用 class_weightsklearn compute_class_weight()

model.fit(..., class_weight=class_weight.compute_class_weight("balanced", np.unique(Y_train), Y_train)

\3.使用自定义损失函数

from keras import backend as K
def custom_loss(weights):
#gist.github.com/wassname/ce364fddfc8a025bfab4348cf5de852d

def loss(Y_true, Y_pred):
Y_pred /= K.sum(Y_pred, axis=-1, keepdims=True)
Y_pred = K.clip(Y_pred, K.epsilon(), 1 - K.epsilon())

loss = Y_true * K.log(Y_pred) * weights
loss = -K.sum(loss, -1)
return loss

return loss

extreme_weights = np.array([9999, 9999, 9999, 1])
model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy'],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)

#(then fit *without* class_weight)

结果

可怜。所有类别的准确度为 ~.99,所有类别的不平衡准确度为 ~.5。但更有意义的指标,如 auPRC,讲述了一个不同的故事。大多数类别的 auPRC 接近 1,其余类别接近 0

这就是 Keras 平衡类的方式吗?它只是确保它们之间的准确性相同——或者这两个指标是否也应该相等或可比?还是我指定的权重有误?

最佳答案

Keras 在训练期间使用类权重,但准确性并未反射(reflect)这一点。准确性是在所有样本中计算的,与类之间的权重无关。这是因为您在 compile() 中使用了指标“准确度”。您可以定义自定义和更准确的加权精度并使用它或使用 sklearn 指标(例如 f1_score() 可以是“二进制”、“加权”等)。

例子:

def macro_f1(y_true, y_pred):
return f1_score(y_true, y_pred, average='macro')


model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy', macro_f1],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)

关于python - Keras:class_weight 实际上试图平衡什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com