UC-IIC2613 / Syllabus

27 stars 10 forks source link

[Tarea 4][Pregunta 3] Normalización de price #220

Open vicerc opened 3 years ago

vicerc commented 3 years ago

Hola, debido a los recorridos de tanh y sigmoid, considero que sería una buena idea normalizar los precios, ¿Puedo hacer esto? Entiendo que después tendría que adaptar los datos de mae y mse, ya que claramente obtendría valores mucho menores a los 800 pedidos en la pregunta 3 y los 600 de la 4.

IngElecPuc commented 3 years ago

Hola Es muy mala idea, a menos que puedas recuperar la normalización de vuelta, y puedas transformar las métricas a un equivalente previo a normalizado (spoiler alert: no puedes, por lo menos con la historia de los datos). Claramente en el papel verás que las métricas bajan mucho, pero ahora estarás calculando las cosas fuera del recorrido de tu problema. Obviamente esto no te daría puntaje, pues tu regresión estará entre 0 y 1. Imagina el precio de un diamante grande siendo estimado de esa manera. Incluso si vuelves a construir de vuelta el valor, te vas a dar más trabajo en hacerlo que en buscar que tus hiperparámetros estén correctos desde el principio, y para las métricas lo mismo al cuadrado. Saludos

vicerc commented 3 years ago

Entiendo, pero en una normalización min max, recuperar el mae es muy sencillo, ya que la transformación de min max es lineal, al igual que mae. Mse trae más problemas al ser cuadrático, pero puedo entregar una aproximación que es del mismo orden. Además, si adapto los datos que me entrega predict y los devuelvo al valor que tendrían sin min max, puedo calcular mae y mse correctamente según yo.

vicerc commented 3 years ago

Me dí cuenta que puedo llegar al valor exacto de mae y mse previo a la normalización de forma sencilla, si demuestro esto en el informe, ¿puedo realizar la normalización a price?

diegomendieta commented 3 years ago

@Vicerc por qué querrías hacer eso? Yo insisto en que no lo hagas. Lo único que consigues es perder resolución en el valor que predices, y me parecería extraño que tus resultados mejoren normalizando los valores a predecir. Te recomiendo, en lugar de eso, que pienses en las características de lo que quieres predecir, y si te conviene o no usar una función de activación en la capa de output.

vicerc commented 3 years ago

Porque así puedo sacar provecho al recorrido de tanh y de sigmoid, de esta forma obtengo mae cercanos a los 200 para el set de validación con tanh y sigmoid, mientras que sin la normalización eran cercanos a los 2000 si recuerdo bien.

Sobre no usar activación en la última, en realidad estaría utilizando, sólo que es una activación lineal (igual a relu, debido a que los precios > 0), por lo que no considero que sea una comparación justa entre las funciones de activación si la única función que puede predecir precios > 1 es la relu.

No me quedó claro eso si lo de la resolución, si te refieres a que reduzco el rango de precios, es cierto, pero no veo el problema en esto, ya que existe la misma cantidad de números entre 0 y 1 que entre el rango de precios.

En verdad me mejoran los mae y mse tanto de validation como test, por eso quiero implementarlo!

diegomendieta commented 3 years ago

Cuando dices que obtienes un MAE de 200 en el set de validación, te refieres al MAE después de invertir la normalización que propones? Tampoco me queda claro lo que dices de "sacarle provecho al recorrido".

Respecto de lo segundo que mencionas, concuerdo contigo: como los precios son números mayores que 0, hace sentido ocupar una activación relu.

En relación a lo último, me refiero a que estás apretando los valores de output entre 0 y 1 (en el caso de una sigmoide; entre -1 y 1 en el caso de tanh). Esto va a hacer que tu función de pérdida sea mucho más pequeña, y por lo tanto, se va a dificultar el aprendizaje para la red, porque un cambio pequeño en el output normalizado puede ser, en realidad, un cambio grande en el precio que quieres predecir. Además, si quieres hilar fino, se pueden producir errores de aproximación al pasar de enteros a floats (a esto me refiero con pérdida de resolución).

vicerc commented 3 years ago

Así es, el mae del set de validación después de invertir la normalización. Claro, la función de pérdida será más pequeña, pero no veo el problema en esto, ya que el próposito de esta para la NN es que le permite escoger la menor, y como todas las funciones de pérdida disminuyen, se seguirá buscando la menor, por lo que no entiendo por qué se dificultaría el aprendizaje de la red.

Me cuesta entender por qué no me dejarían normalizar los precios, en especial si demuestro que el cálculo de mae y mse se puede devolver al original y es una técnica muy utilizada. Este regresor (con tanh) entrega mejores resultados y la única diferencia que tendría es que luego de predecir tengo que hacer una transformación lineal de los datos.

fjquintana commented 3 years ago

A mi me pasó lo mismo que a @Vicerc, cuando no normalizaba los outputs me daban mae y mse muy grandes en test (~2000 en mae), pero normalicé los outputs con MinMaxScaler para tanh y sigmoid, y me dió un resultado mucho mejor, mae cercano a 330 en test, después de escalar de vuelta los valores, o sea, predecir los valores, aplicar la transformación inversa del MinMaxScaler, y comparar el resultado con el valor real. También, según yo, si se puede llegar al valor exacto del mae y mse normal desde el mae y mse escalados, ya que como dice @Vicerc, es simplemente una transformación lineal. También, al hacer la regresión lineal, me dió un R2 cercano a 0.97. Por otro lado, comparé la diferencia entre el mae real (comparando las predicciones con el valor real) y el mae calculado (aplicando una transformación al mae escalado) y la diferencia era prácticamente insignificante, diferían en el cuarto número después de la coma, por lo que no parece haber una pérdida de precisión notable. Dado todo esto, no entiendo por qué sería malo normalizar los outputs.

diegomendieta commented 3 years ago

@Vicerc Efectivamente, la red busca minimizar la función de pérdida. Pero debes tener en cuenta que una red neuronal consta de un número potencialmente enorme de parámetros, y minimizar la pérdida depende de muchos factores, entre ellos el learning rate (que se volverá más difícil de afinar si la función de pérdida es más pequeña). Además, si entrenas con pérdida MSE, las penalizaciones son no lineales y dependerán de la escala a la que se esté trabajando, lo que también afectará el aprendizaje.

Y ahora, respecto también de tu comentario @fjquintana, estoy de acuerdo en que se puede recuperar el valor con una transformación lineal, y que puede que arroje resultados correctos esta vez. Pero insisto, es una mala práctica, y la idea de este curso no es que obtengan buenos resultados en una situación en particular, sino que aprendan a enfrentarse a un problema de manera correcta.

IngElecPuc commented 3 years ago

Si pueden devolver la transformación a los mae originales, y tienen valores altos de R2 con los precios reales entonces están prediciendo bien. No es lo que yo recomendaría pues se trata de más código, y hay soluciones más limpias, pero por lo menos tienen el suficiente dominio para hacer eso. Eso sí, no se lo recomiendo al resto que pudiera leer aquí. Con respecto a las funciones de activación, claro que no es justo, pues saturan. Y ese es el tipo de argumentos que queremos que pongan en sus tareas, se ve que están entendiendo lo que sucede con la teoría.

diegomendieta commented 3 years ago

Como último comentario, quiero señalar que si, por ejemplo, usaran sigmoid, están apretando todos los outputs entre 0 y 1. Por lo tanto, al momento de hacer una predicción, si su modelo arroja 0, esto corresponde al valor más bajo dentro del set de datos, y si arroja 1, corresponde al máximo. Con esto, puede que les den resultados correctos para los datos que han visto, pero su modelo es incapaz de predecir precios fuera del rango de los valores del set de entrenamiento.