¿Alguien puede decirme cuál es la forma más sencilla de aplicar class_weight en Keras cuando el conjunto de datos no está equilibrado?
Sólo tengo dos clases en mi objective.
Gracias
Usando class_weight del kit sklearn.
También estoy usando este método para lidiar con los datos de desequilibrio
from sklearn.utils import class_weight class_weight = class_weight.compute_class_weight('balanced' ,np.unique(Y_train) ,Y_train)
entonces model.fit
Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10 ,validation_data= (test_X,test_Y),class_weight = class_weight )
El parámetro class_weight
de la función fit()
es un diccionario que asigna clases a un valor de peso.
Digamos que tiene 500 muestras de clase 0 y 1500 muestras de clase 1 de las que alimenta en class_weight = {0: 3, 1: 1}. Eso le da a la clase 0 tres veces el peso de la clase 1.
train_generator.classes
le da los nombres de clase adecuados para su ponderación.
Si desea calcular esto mediante progtwigción, puede usar scikit-learn´s sklearn.utils.compute_class_weight () .
La función analiza la distribución de tags y produce ponderaciones para penalizar igualmente a las clases con una representación insuficiente o excesiva en el conjunto de entrenamiento.
Vea también este útil hilo aquí: https://github.com/fchollet/keras/issues/1875
Y este hilo también podría ser de ayuda: ¿Es posible inferir automáticamente el class_weight de flow_from_directory en Keras?
¿Está preguntando sobre la ponderación correcta para aplicar o cómo hacerlo en el código? El código es simple:
class_weights = {} for i in range(2): class_weights[i] = your_weight
y luego pasa el argumento class_weight=class_weights
en model.fit
.
La ponderación correcta a utilizar sería algún tipo de frecuencia inversa; También puedes hacer un poco de prueba y error.
1- Defina un diccionario con sus tags y sus pesos asociados.
class_weight = {0: 0.1, 1: 1., 2: 2.}
2- Alimentar el diccionario como un parámetro:
model.fit(X_train, Y_train, batch_size = 100, epochs = 10, class_weight=class_weight)