如何为不平衡的多类分类问题提高 f1 分数,尝试使用 smote 但结果不佳?

how to improve f1 score for a imbalanced multiclass classification problem, tried using smote but it is giving bad results?

数据集:train.csv

接近

我有四个 类 需要预测,它们确实非常不平衡,所以我尝试使用 SMOTE 和前馈网络,但与测试数据上的原始数据集相比,使用 smote 的结果非常差

模型架构

#model architecture

from tensorflow.keras.layers import Dense, BatchNormalization, Dropout, Flatten

model = tf.keras.Sequential()

model.add(Dense(512, activation='relu', input_shape=(7, )))
model.add(BatchNormalization())
model.add(Dense(256, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu'))
model.add(Dense(4, activation='softmax'))

earlystopping = tf.keras.callbacks.EarlyStopping(
    monitor="val_loss",
    patience=40,
    mode="auto",
    restore_best_weights=True,
)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

那么如何解决这个问题并提高测试数据集上的 f1 分数 感谢任何帮助

下面是对您的案例的最佳方法的解释。

打击
  • 通常 SMOTE 通过随机上采样来平衡数据,所以即使你有像 Class A[=33= 这样的数据样本分布] 有 15000 条记录Class B200 条记录 它会对 Class B15000 条记录
  • 200 条记录 中生成的随机样本过多有时会使模型很难学习和区分 class,因为上采样显着通过复制将 Class B 记录从 200 增加到 15000。
可能的解决方案
  1. 而不是 SMOTE 我建议在 train/test 之间尝试 Stratified Sampling,然后尝试在其上构建模型。
  2. 将 class 权重作为参数是另一种最佳方法,它几乎适用于所有 ML 算法。对于 Keras,您可以 Refer Here 它可能非常有帮助。