Я работаю над проблемой последовательной маркировки с несбалансированными классами.
Я использую keras sample_weight для улучшения обнаружения класса меньшинства, но это не помогает.
Чего мне не хватает?
Мои несбалансированные выходные классы сбалансированы с class_weight:
class_weights = {0: 0.0 # ignore padding, mask_zero = True
1: 1.6
2: 0.44
3: 11.0
train_sample_weight = np.array([class_weights[cls] for cls in y_train])
val_sample_weight = np.array([class_weights[cls] for cls in y_val])
Я устанавливаю необходимые параметры в model.compile и model.fit
model.compile(optimizer="rmsprop",
loss="categorical_crossentropy",
sample_weight_mode="temporal", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=32, epochs=20,
sample_weight=train_sample_weight,
validation_data=[X_val, y_val, val_sample_weight])
Но мои результаты классификации не меняются.
Для меня важен 1 класс. Хочу улучшить его обнаружение.
С весом образца:
precision recall f1-score support
0 0.00 0.00 0.00 0
1 0.54 0.91 0.68 2354
2 0.97 0.77 0.86 8214
3 0.61 0.83 0.70 333
micro avg 0.80 0.80 0.80 10901
macro avg 0.53 0.62 0.56 10901
weighted avg 0.86 0.80 0.81 10901
[[ 0 0 0 0]
[ 0 2132 209 13]
[ 1 1739 6309 165]
[ 0 42 16 275]]
без веса образца
precision recall f1-score support
0 0.00 0.00 0.00 0
1 0.65 0.73 0.69 2354
2 0.91 0.89 0.90 8214
3 0.98 0.71 0.82 333
micro avg 0.85 0.85 0.85 10901
macro avg 0.64 0.58 0.60 10901
weighted avg 0.86 0.85 0.85 10901
[[ 0 0 0 0]
[ 1 1723 630 0]
[ 2 896 7312 4]
[ 0 29 68 236]]
Эти отчеты clf создаются на основе данных проверки. Аналогичные результаты для данных испытаний, а также для разных моделей архитектуры.
Для класса 1 я вижу, что с весами выборки отзыв выше, но точность уменьшается. В целом - f1 остается прежним.
Какой из них лучше?
Я что-то упускаю, чтобы добавить лучшие результаты с весом образца? Спасибо!