Sé que hay una posibilidad en Keras con el class_weights
diccionario de parámetros al ajuste, pero no he podido encontrar ningún ejemplo. ¿Alguien tan amable de proporcionar uno?
Por cierto, en este caso, la práctica adecuada es simplemente ponderar a la clase minoritaria proporcionalmente a su representación insuficiente.
classification
keras
weighted-data
Hendrik
fuente
fuente
Respuestas:
Si está hablando del caso normal, donde su red produce solo una salida, entonces su suposición es correcta. Para forzar a su algoritmo a tratar cada instancia de la clase 1 como 50 instancias de la clase 0 , debe:
Defina un diccionario con sus etiquetas y sus pesos asociados.
Alimente el diccionario como parámetro:
EDITAR: "tratar cada instancia de la clase 1 como 50 instancias de la clase 0 " significa que en su función de pérdida asigna un valor más alto a estas instancias. Por lo tanto, la pérdida se convierte en un promedio ponderado, donde el peso de cada muestra se especifica por class_weight y su clase correspondiente.
De documentos de Keras: class_weight : índices de clase de asignación de diccionario (enteros) opcionales a un valor de peso (flotante), utilizado para ponderar la función de pérdida (solo durante el entrenamiento).
fuente
Simplemente podría implementar el
class_weight
desklearn
:Importaremos el módulo primero
Para calcular el peso de la clase, haga lo siguiente
En tercer y último lugar, agréguelo al ajuste del modelo
Atención : edité esta publicación y cambié el nombre de la variable de class_weight a class_weight s para no sobrescribir el módulo importado. Ajuste en consecuencia cuando copie el código de los comentarios.
fuente
class_weight.compute_class_weight
produce una matriz, necesito cambiarla a un dict para poder trabajar con Keras. Más específicamente, después del paso 2, useclass_weight_dict = dict(enumerate(class_weight))
y_train
es(300096, 3)
numpy array. Entonces, laclass_weight=
línea me da TypeError: tipo no compartible: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.Yo uso este tipo de regla para
class_weight
:math.log
suaviza los pesos para clases muy desequilibradas! Esto devuelve:fuente
n_total_samples / n_class_samples
para cada clase.NOTA: Ver comentarios, esta respuesta está desactualizada.
Para ponderar todas las clases por igual, ahora puede simplemente establecer class_weight en "auto" de esta manera:
fuente
class_weight='auto'
en la documentación de Keras ni en el código fuente. ¿Puedes mostrarnos dónde encontraste esto?class_weight
y no tendrá ningún efecto. Por lo tanto, esta respuesta no es correcta.class_weight está bien, pero como dijo @Aalok, esto no funcionará si está codificando en caliente las clases de múltiples etiquetas. En este caso, use sample_weight :
sample_weights se usa para proporcionar un peso para cada muestra de entrenamiento . Eso significa que debe pasar una matriz 1D con el mismo número de elementos que sus muestras de entrenamiento (indicando el peso de cada una de esas muestras).
class_weights se usa para proporcionar un peso o sesgo para cada clase de salida . Esto significa que debe pasar un peso para cada clase que está tratando de clasificar.
sample_weight debe tener una matriz numpy, ya que se evaluará su forma.
Consulte también esta respuesta: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-sequence-labelling
fuente
Agregando a la solución en https://github.com/keras-team/keras/issues/2115 . Si necesita más que una ponderación de clase donde desee costos diferentes para falsos positivos y falsos negativos. Con la nueva versión de Keras ahora puede anular la función de pérdida respectiva como se indica a continuación. Tenga en cuenta que
weights
es una matriz cuadrada.fuente
Encontré el siguiente ejemplo de codificación de ponderaciones de clase en la función de pérdida utilizando el conjunto de datos minist. Ver enlace aquí: https://github.com/keras-team/keras/issues/2115
fuente
Esto funciona con un generador o estándar. Su clase más grande tendrá un peso de 1, mientras que las demás tendrán valores superiores a 1 en relación con la clase más grande.
los pesos de clase aceptan una entrada de tipo diccionario
fuente