如何为不平衡的多类分类问题提高 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 B 有 200 条记录 它会对 Class B 到 15000 条记录。
- 从 200 条记录 中生成的随机样本过多有时会使模型很难学习和区分 class,因为上采样显着通过复制将 Class B 记录从 200 增加到 15000。
可能的解决方案
- 而不是 SMOTE 我建议在 train/test 之间尝试 Stratified Sampling,然后尝试在其上构建模型。
- 将 class 权重作为参数是另一种最佳方法,它几乎适用于所有 ML 算法。对于 Keras,您可以 Refer Here 它可能非常有帮助。
数据集: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 B 有 200 条记录 它会对 Class B 到 15000 条记录。
- 从 200 条记录 中生成的随机样本过多有时会使模型很难学习和区分 class,因为上采样显着通过复制将 Class B 记录从 200 增加到 15000。
可能的解决方案
- 而不是 SMOTE 我建议在 train/test 之间尝试 Stratified Sampling,然后尝试在其上构建模型。
- 将 class 权重作为参数是另一种最佳方法,它几乎适用于所有 ML 算法。对于 Keras,您可以 Refer Here 它可能非常有帮助。