多标签不平衡数据集分类

Multi Label Imbalanced dataset classification

我目前正在处理一个高度不平衡的多标签时尚项目数据集 我尝试使用 class_weights 来解决它,但每个时期的准确度仍然停留在 0.7556。有什么办法,我可以避免这个问题。我是否以错误的方式实施了 class 权重?我也尝试过使用数据扩充。

我在火车集中有 224 个独特的 classes。有的只有一个例子,很郁闷

也尝试借助此 notebook 解决问题,但我无法获得相同的准确度分数。看起来,在这个笔记本中没有考虑数据集不平衡的可能性。

def calculating_class_weights(classes,df):
  number_dim = np.shape(classes)[0]
  weights = np.empty([number_dim, 2])
  for i in range(len(classes)):
    weights[i] = compute_class_weight(class_weight='balanced', classes=[0.,1.], y=df[classes[i]])
  return weights

def get_weighted_loss(weights):
  def weighted_loss(y_true, y_pred):
    y_true = tf.cast(y_true, tf.float32)
    return K.mean((weights[:,0]**(1-y_true))*(weights[:,1]**(y_true))* K.binary_crossentropy(y_true, y_pred), axis=-1)
  return weighted_loss

weights=calculating_class_weights(train_labels,train_df)

train_dataGen = ImageDataGenerator(
                                  rescale=1./255,
                                  rotation_range=40,
                                  width_shift_range=0.2,
                                  height_shift_range=0.2,
                                  shear_range = 0.2,
                                  zoom_range=0.2,
                                  horizontal_flip=True,
                                  fill_mode='nearest',
                                  )
                
valid_dataGen = ImageDataGenerator(rescale=1./255)

model = keras.models.Sequential([
    keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(256,256,3)),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding="same"),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    keras.layers.Flatten(),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(224, activation='sigmoid')
])

model.compile(loss=get_weighted_loss(weights), optimizer='adam', metrics=['accuracy'])

model.fit(train_generator,
          epochs=10,
          validation_data=valid_generator,
          callbacks=[tensorboard_cb,lrr])

首先,Precision和Recall等指标只关注正class,避免了class多class关注指标遇到的问题】 失衡。因此,如果我们继续考虑所有指标,我们可能无法获得有关负面 class 表现的足够信息。 Haibo He 等人建议使用以下指标对这两项进行评分:

  1. 几何平均数。
  2. F-测量。
  3. 宏观平均准确度。
  4. 阈值指标的新组合:平均值-Class-加权精度、优化精度、调整几何平均值、平衡精度指数。

我的建议:

  1. 使用 PR 曲线和 F1 分数
  2. 尝试使用几何变换、光度变换、随机遮挡(避免过度拟合)、SMOTE、Tomek 链接(对多数欠采样)等
  3. 随机欠采样可能会删除数据集的相关特征。同样,使用 KNN 和其他类似技术分析您的数据集。
  4. 查看这本书:H. He 和 Y. Ma,不平衡学习:基础、算法和应用,新泽西州霍博肯:Wiley-IEEE 出版社,2013 年。