Clasificación de conjuntos de datos desequilibrados de etiquetas múlti

Clasificación de conjuntos de datos desequilibrados de etiquetas múltiples

Actualmente estoy trabajando en un conjunto de datos de artículos de moda de varias marcas que está muy desequilibrado. Intenté usar class_weights para abordarlo, pero aún así la precisión está atascada en 0.7556 en cada época. ¿Hay alguna manera, puedo evitar este problema. ¿Implementé los pesos de clase de manera incorrecta? También intenté usar el aumento de datos.

Tengo como 224 clases únicas en el juego de trenes. Y algunos de ellos solo tienen un ejemplo, lo cual es muy frustrante

Traté de resolver el problema con la ayuda de este notebook también , pero no puedo obtener la misma puntuación de precisión. Parece que en este cuaderno no se considera la posibilidad de desequilibrio en el conjunto de datos.

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])
Mostrar la mejor respuesta

Este tutorial demuestra cómo clasificar un conjunto de datos altamente desequilibrado en el que la cantidad de ejemplos en uno clase supera en gran medida a los ejemplos en otra.

En primer lugar, las métricas como Precision y Recall se centran solo en la clase positiva, lo que evita los problemas que encuentran las métricas de enfoque multiclase en el caso del desequilibrio de clase. Por lo tanto, es posible que no obtengamos suficiente información sobre el desempeño de la clase negativa si seguimos considerando todos los indicadores. Haibo He et al sugieren las siguientes métricas para calificar ambos elementos:

  1. Media geométrica.
  2. Medida F.
  3. Precisión del promedio macro.
  4. Combinaciones más recientes de métricas de umbral: precisión ponderada de clase media, precisión optimizada, media geométrica ajustada, índice de precisión equilibrada.

Mis sugerencias:

  1. Use la curva PR y la puntuación F1.
  2. Pruebe con transformaciones geométricas, transformaciones fotométricas, oclusiones aleatorias (para evitar el sobreajuste), SMOTE, enlaces Tomek (para mayorías de submuestreo), etc.
  3. El submuestreo aleatorio puede eliminar características relevantes de su conjunto de datos. Nuevamente, analice su conjunto de datos usando KNN y otras técnicas similares.
  4. Consulte este libro: H. He and Y. Ma, Imbalanced Learning: Foundations, Algorithms, and Applications, Hoboken, New Jersey: Wiley-IEEE Press, 2013.