Precios lineales con ruido - Regresión lineal vs Red neuronal


Problema

Supongamos unos datos de precios de vivienda en base a un solo parámetro: una distancia que va de 0 a 1.

Tenemos 100 datos reales que relacionan Distancia y Precio mostrados en la siguiente tabla y gráfica:


 
DISTANCIAPRECIO
0,00128300
0,01128300
0,0280691
.........
.........
0,98190436
0,99195652
1,00228311

Planteamiento

Como podemos observar la nube de precios sigue un patrón lineal con cierto "ruido" creciendo el precio con la distancia. El problema pues se puede plantear como:

  • Regresión lineal simple donde ajustamos una recta a la nube de datos. Azure ML nos ofrece 2 cálculos:
    • "Regresión lineal con el Método de mínimos cuadrados ordinarios". Una introducción matemática simple se puede ver aquí.
    • "Regresion lineal con el método de Descenso de gradiente en línea". Un video sobre este método se puede ver aquí.
  • Regresión no lineal donde ajustamos una curva que se adapte a la nube de datos. Azure ML ofrece "Regresión de Red Neuronal" donde configuramos una red neuronal para este objetivo y que se puede ver aquí.

Existe todo un curso completo de Machine Learning aquí.


 

Azure Machine Learning

Es una herramienta basada en servicios cloud que permite realizar todo el proceso de análisis de datos de forma sencilla como se puede ver aquí.

Crearemos 2 experimentos con 2 de los planteamientos citados y optimizaremos sus configuraciones para obtener los mejores resultados.
En ellos tomaremos las distancias / precios que existen entrenando a un subconjunto de datos para predecir el valor del resto. Esto generará un error entre el valor predicho y el real que trataremos de mejorar según la configuración de cada subexperimento.

Partiendo de unas configuraciones iniciales obtenemos la calidad de los modelos:


 

MÉTODO DE MÍNIMOS CUADRADOS

Nuestro experimento calcula la linea recta que mejor se ajusta a un 75% de nuestra nube de puntos generando un error de predicción sobre el resto.

Veamos el esquema - configuración - resultados

La configuración elegida se basa en:

  • L2 regularization weight: Dejamos el valor por defecto para la regularización de los pesos en un sobreajuste, como se explica aquí y desde un punto de vista matemático aquí.
  • Include intercept term: Es obvio que la recta entre precios y distancias debe cortar el eje a una cierta altura.
  • Random number seed: Lo dejamos vacío puesto que no queremos mantener los mismos resultados al ejecutar nuevamente nuestro proyecto.
  • Allow unknow categorical levels: Dejamos el valor por defecto, seleccionado, aunque en este caso no hay ningún precio nulo en los datos introducidos.

El resultado es que la Regresión lineal con el Método de mínimos cuadrados ordinarios nos deja un Coeficiente de Determinación (ver aquí) = 0.773809


 

 

REGRESIÓN POR RED NEURONAL

Nuestro experimento entrena con un 75% de los datos y comprueba la precisión de dicho entrenamiento con:

  • El 25% restante.
  • El mismo 75%. Esto se hace para detectar el sobreajuste del que hablaremos más adelante.


 

"Juguemos" con las distintas configuraciones de la red y su entrenamiento para obtener otros coeficientes de determinación (R2):

Creater Training ModeHidden layer specificationNumber of hidden nodesLearning rateNumber of learning iterationsInitial learning weightMomentumType of normalizerCoeficiente de determinación
Single ParameterFully-connected case1000,0061000.10.1Gaussian0,786952
Single ParameterFully-connected case1020,0061000.10.1Gaussian 0,663372
Single ParameterFully-connected case980,006 1000.10.1Gaussian0,764834
Single ParameterFully-connected case980,008 1000.10.1Gaussian0,715826
Single ParameterFully-connected case1000,0081000.10.1Gaussian0,630218
Single ParameterFully-connected case1000,0041000.10.1Gaussian0,449265
Single ParameterFully-connected case1000,0071000.10.1Gaussian0,740706
Single ParameterFully-connected case1000,0081200.10.1Gaussian0,711450
Single ParameterFully-connected case1000,0061200.10.1Gaussian0,613479
Single ParameterFully-connected case1000,00690 0.10.1Gaussian0,747638
Single ParameterFully-connected case980,006 900.10.1Gaussian0,761415
Single ParameterFully-connected case1000,0061000.10.2Gaussian0,676800
Single ParameterFully-connected case1000,0061000.10.09Gaussian0,672099
Single ParameterFully-connected case1000,0061000.50.1Gaussian0,242066
Single ParameterFully-connected case1000,0061000.010.1Gaussian-2,380000
Single ParameterFully-connected case2000,0062000.10.1Gaussian0,362436
Single ParameterFully-connected case2000,0062000.10.99Gaussianxxx
Single ParameterFully-connected case2000,0064000.10.1Gaussian0,458760
Creater Training ModeCustom definition - Net#Learning rateNumber of learning iterationsInitial learning weightMomentumType of normalizerCoeficiente de determinación
Single Parameter input Data auto; hidden H1[100] from Data all; output VALOR[1] from H1 all; 0.006 100 0.1 0.1 Gaussian 0.680794
Single Parameter input Data auto; hidden H1[200] from Data all; output VALOR[1] from H1 all; 0.006 100 0.1 0.1 Gaussian 0.069099
Single Parameter input Data auto; hidden H1[400] from Data all; output VALOR[1] from H1 all; 0.006 100 0.1 0.1 Gaussian 0.507965
Single Parameter input Data auto; hidden H1[300] from Data all; output VALOR[1] from H1 all; 0.006 100 0.1 0.1 Gaussian -0.307134
Single Parameter input Data auto; hidden H1[250] from Data all; output VALOR[1] from H1 all; 0.006 100 0.1 0.1 Gaussian -3.064412
Single Parameter input Data auto; hidden H1[150] from Data all; output VALOR[1] from H1 all; 0.005 100 0.1 0.1 Gaussian 0.573491
Single Parameter input Data auto; hidden H1[98] from Data all; output VALOR[1] from H1 all; 0.005 100 0.1 0.1 Gaussian 0.764317
Single Parameter input Data auto; hidden H1[95] from Data all; output VALOR[1] from H1 all; 0.005 100 0.1 0.1 Gaussian 0.715185
Single Parameter input Data auto; hidden H1[97] from Data all; output VALOR[1] from H1 all; 0.005 100 0.1 0.1 Gaussian 0.705737
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] from H1 all; 0.005 100 0.1 0.1 Gaussian 0.812208
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] from H1 all; 0.005 200 0.1 0.1 Gaussian 0.750725
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] from H1 all; 0.005 160 0.1 0.1 Gaussian 0.76817
Single Parameter input Data auto; hidden H1 auto from Data all; output VALOR auto from H1 all; 0.005 100 0.1 0.1 Gaussian 0.719983
Single Parameter input Data auto; hidden H1 auto from Data all; output VALOR auto from H1 all; 0.005 200 0.1 0.1 Gaussian 0.699857
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] from H1 all; 0.005 260 0.1 0.1 Gaussian 0.823814
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] linear from H1 all; 0.005 260 0.1 0.1 Gaussian 0.740535
Single Parameter input Data auto; hidden H1 auto from Data all; output VALOR auto from H1 all; 0.005 80 0.1 0.1 Gaussian 0.717714

Podemos conocer que significan los distintos parámetros de las configuraciones aquí. El mejor resultado con un Coeficiente de Determinación = 0.823814 lo encontramos en la fila marcada de color azul: red personalizada a una sola capa oculta de 99 neuronas con 260 iteraciones.


Pero, ¿que sistema predictivo hemos creado?

1. Cada neurona está haciendo su trabajo:

  • El sumatorio de, multiplicar cada valor por un peso determinado (el inicial para la iteración 1) y sumarle un cierto número o umbral también denominado bias.
  • Al cálculo anterior asignarle una función de activación.
    En nuestro caso al no especificarla Azure ML le asigna la función sigmoidal.

2.Entrenamiento:

Este lo definimos como una serie de iteraciones para reducir el error definido en la función de coste.

Aunque la función de coste más común es la del "Error cuadrático medio" Azure ML toma para este experimento "Cross Entropy" siendo ésta más óptima como se puede ver aquí.

Para calcular el mínimo de dicha función a base de iteraciones utilizamos el método descenso de gradiente.


Un proceso completo se puede ver aquí.


 

Conclusiones

La configuración de red neuronal:

Creater Training ModeCustom definition - Net#Learning rateNumber of learning iterationsInitial learning weightMomentumType of normalizerCoeficiente de determinación
Single Parameter input Data auto; hidden H1[99] from Data all; output VALOR[1] from H1 all; 0.005 260 0.1 0.1 Gaussian 0.823814

mejora la predicción siendo el Coeficiente de Determinación R2=0.823814 frente al de la regresión lineal R2=0.773809.

Y para asegurarnos que no estamos sobreajustando el sistema si comparamos los precios entrenados 75% con ellos mismos obtenemos un Coeficiente de Determinación de R2=0.726789 así que no aparecen grandes diferencias.

El Coeficiente de Determinación es una medida del error en la predicción para regresiones lineales como se comprueba aquí que podemos extrapolar a la regresión en nuestro experimento.

 

Veamos en una gráfica animada e interactuando con los botones habilitados como se aproxima al valor óptimo de R2 en sucesivas iteraciones de entrenamiento:

  • Coeficiente de Determinación Regresión Lineal
  • Número de Iteraciones Entrenamiento
  • Coeficiente de Determinación Red Neuronal


 

Resumen

Para realizar una aproximación a una estimación de precios en la comunidad de Madrid hemos generado un sistema con precios falsos que solo dependen de una variable distancia.

En este sistema simplificado y con ayuda de Azure ML la regresión no lineal mediante una red neuronal mejora la predicción alcanzando un Coeficiente de Determinación R2=0.823814 frente al de la regresión lineal R2=0.773809.

 

En el siguiente capítulo reconfiguraremos tanto la red como los parámetros de entrenamiento generando un sistema predictivo para precios reales tomados de los principales portales inmobiliarios en esta zona.