Я попытался протестировать функцию фокальных потерь, чтобы решить проблему дисбаланса классов. Я использовал пример обнаружения мошеннической карты, доступный здесь (https://www.tensorflow.org/tutorials/structured_data/imbalanced_data). Но вопреки ожиданиям, полученный отзыв (0,46) слаб по сравнению с версией с взвешенной кросс-энтропией (отзыв = 0,9). Не понимаю такой результат, и в чем может быть проблема. если у кого есть решение ...
Код:
import tensorflow_addons as tfa
METRICS = [
keras.metrics.TruePositives(name='tp'),
keras.metrics.FalsePositives(name='fp'),
keras.metrics.TrueNegatives(name='tn'),
keras.metrics.FalseNegatives(name='fn'),
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc'),
]
def make_model(metrics = METRICS, output_bias=None):
if output_bias is not None:
output_bias = tf.keras.initializers.Constant(output_bias)
model = keras.Sequential([
keras.layers.Dense(
16, activation='relu',
input_shape=(train_features.shape[-1],)),
keras.layers.Dropout(0.5),
keras.layers.Dense(1, activation='sigmoid',
bias_initializer=output_bias),
])
fl = tfa.losses.SigmoidFocalCrossEntropy()
model.compile(
optimizer=keras.optimizers.Adam(lr=1e-3),
loss=fl,
metrics=metrics)
return model
model = make_model()
model.load_weights(initial_weights)
baseline_history = model.fit(
train_features,
train_labels,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks = [early_stopping],
validation_data=(val_features, val_labels))