top of page
Search
  • Writer's picturesiria sadeddin

Suavizado de Clases para mejorar modelos de clasificación en Deep Learning

Hola de nuevo!


Este post está dedicado a una técnica de mejoramiento de Modelos de Deep Learning y prevención de overfiting (regularización) llamada Suavizado de Clases.


En un mundo ideal, los datos que usamos para entrenar nuestros modelos son perfectos y están 100% correctamente clasificados, pero como se podrán imaginar, esto no es así; sobre todo cuando trabajamos con miles o millones de datos. Esto debido a que lo datos muy probablemente fueron etiquetados por humanos, y es normal que los humanos cometan errores involuntarios.


Este problema puede afectar de forma considerable el desempeño de nuestros modelos de clasificación de dos maneras:


1) El loss, o función de costo de nuestro conjunto de pruebas no se optimizará consistentemente, nos encontraremos con un loss artificialmente grande debido a los casos de clasificación "errónea" que en realidad eran un error en la etiqueta de los datos.


2) Overfiting, cuando el accuracy de el entrenamiento es mayor al de pruebas estamos en presencia de overfiting. El overfiting se debe al ajuste exagerado del modelo sobre los datos de entrenamiento, perdiendo generalidad estadística, en este caso el overfiting tiene una doble desventaja, porque además el ajuste exagerado se hace sobre datos erróneos. 😬



En la imagen a la derecha, la linea verde representa la curva generada por un modelo de clasificación con overfiting. Esta curva separa a la perfección los puntos rojos de los azules pero, ¿representará esta curva un sistema real? La experiencia ha demostrado que este tipo de ajustes, al contrario de representar mejor el sistema de estudio, resultan con mayor error cuando se prueban sobre datos nuevos. Mientras que curvas mas generales, como la negra, aunque no separan perfectamente los datos de entrenamiento son mas efectivos cuando se aplican sobre datos desconocidos (o de prueba). Podemos imaginarnos lo que pasará si además, digamos que el 10% de los datos están mal clasificados, y el modelo hace overfiting sobre los datos...Un completo desastre 😐.


La función de loss que usamos normalmente para clasificación binaria es la siguiente:

Donde "y" representa la clase verdadera y "p" la probabilidad (entre 0 y 1) de pertenecer a la clase. El primer término de la ecuación corresponde al loss de clase positiva (y=1) y el segundo término corresponde al loss de la clase negativa (y=0). Cuando la diferencia entre "y" y "p" es muy grande el los se hace mayor.


Cuando tenemos etiquetas erróneas en nuestros datos el loss será artificialmente grande y se "penalizará" demasiado los casos el los que el modelo se equivoca cuando en realidad era la etiqueta la que estaba mal.


Para "suavizar" la penalidad que asigna el loss a los casos fallidos se modificarán los valores en las etiquetas explícitamente. En el código siguiente vemos un ejemplo de como hacerlo:


def smooth_labels(labelsfactor=0.2):
 # smooth the labels
    labels *= (1 - factor)
    labels += (factor / labels.shape[1])
 # returned the smoothed labels
 return labels

Supongamos que nuestros datos están etiquetados por vectores de One-Hot-Encoder como los que siguen:


(El archivo de la imagen no es una etiqueta)

Luego de aplicar la función para suavizar las etiquetas nos queda como sigue:



smooth=smooth_labels(df_class.iloc[:,1:9])
df=pd.concat([df.iloc[:,0],smooth],axis=1)
df.head()




Esta modificación permitirá que la diferencia entre la probabilidad de una clase y la clase verdadera sea menor cuando la clasificación sea errónea, disminuyendo así el loss.


Otra manera de hacer el Suavizado de Clases de forma automática, es incluir la variable label_smoothing en la función de loss cuando compilamos el modelo de keras. Por ejemplo:


from keras.losses import CategoricalCrossentropy
from keras.optimizers import SGD

opt = SGD(lr=0.001, momentum=0.9)
loss = CategoricalCrossentropy(label_smoothing=0.1) 
model.compile(loss=loss, optimizer=opt, metrics=["accuracy"])

Bueno, es hora de que prueben esta técnica ustedes mismos! Espero les sea de ayuda.

Hasta pronto! 🙂

67 views0 comments
Post: Blog2_Post
bottom of page