Tan solo imagine que usted es un agente de bienes inmuebles, y desea un sistema que le prediga el precio de una casa, tomando en cuenta factores como número de cuartos y la ubicación de la misma.
Para resolver este problema usaremos conceptos básicos de Machine Learning. Para ello lo primero que ocupamos son datos históricos para entrenar una pequeña red neuronal (los mismos se pueden encontrar en UCI).
Exploración de datos
De esta información, es importante definir los features (información de entrada que va a definir la salida) y el target (variable que nos interesa predecir).
Dentro de los features tenemos:
- RM (número de cuartos)
- LSTAT(% de vecinos cerca de clase baja)
- PTRATIO (relación de estudiantes y profesores en el vecindario)
Y el target es:
- MEDV (precio de la casa)
Es importante analizar los datos, sobre todo el target. Como por ejemplo, conocer el mínimo y máximo de los precios, así como la media, el promedio y la desviación estándar de los mismos. Esto permitirá analizar situaciones como: si aumentamos RM (el número de cuartos) se va a aumentar el precio de las casas (MEDV), por el hecho que se requiere más área de construcción; si se aumenta LSTAT el precio de la casa baja, ya que vecindarios de clase baja hacen que los mismos sean más inseguros reduciendo el costo de las propiedades en esas zonas (muy pocos quieren vivir con esas condiciones) y de igual manera cuando se aumenta PTRATIO, el precio de las casas baja.
Desarrollando un modelo
Ahora bien, ya que se entiende bien el problema, así como los datos que vamos a usar para solucionarlo, es hora de empezar a darle una solución al mismo. Lo primero que ocupamos es revolver los datos aleatoriamente y luego dividirlos, una parte será para el entrenamiento (alrededor de un 80% de los datos) de la red y el resto (20%) será destinado para probar que la solución está prediciendo correctamente los resultados esperados.
Analizando el rendimiento del modelo
El análisis del modelo a usar es muy importante a tomar en cuenta, por el hecho de que es este quien nos va a solucionar el problema y tiene que hacerlo de la mejor forma.
Partiendo del hecho que se va a usar el Árbol de decisión (Decision Tree) como algoritmo para predecir las casas, se debe determinar cual es el máximo depths permitido para resolver el problema de la forma más eficiente y exacta. Usando gráficas de curvas de aprendizaje se puede ver cual es el valor apropiado a usar, por ejemplo: con un max_depth = 3 se obtiene un alto puntaje (0.8), tanto para el entrenamiento como para las pruebas, y conforme se aumenta los datos estos se mantienen juntos y estables, tendiendo a converger en un mismo punto y el más alto alcanzado (0.8), esto significa que con una mayor cantidad de datos se llegaría al modelo ideal, ya que el modelo se ajusta y se generaliza bien, sin problemas de high bias o high variance. En cambio con max_depth = 1 este no genera ni predice bien (el máximo resultado es 0.4), y se presenta el problema de High Bias (ya que por más datos que se agregue al modelo, este no va a predecir bien los precios de las casas, se va a mantener en 0.4). Adicionalmente, con max_depth = 10, tampoco se predice bien los datos y se presenta problemas de High Variance (mucho espacio entre los datos entrenados y los validados) o Overfitting (el modelo está sobre entrenado tendiendo a predecir mal los precios de las casas).
Evaluando el rendimiento del modelo
En este punto es importante aclarar conceptos como Grid Search y Cross-Validation. El primero es una técnica para ajustar parámetros al modelo, utilizando la fuerza bruta para generar muestras para cada combinación de parámetros. Y junto con Cross-Validation permite determinar cual es el parámetro que ofrece el mejor rendimiento, ya que K-fold Cross-Calidation es una técnica de validación del modelo en la que la muestra original, donde esta es dividida de forma aleatoria en K submuestras de igual tamaño, y se utiliza una única submuestra como datos de prueba y las K-1 restantes, como datos de entrenamiento.
Finalmente, es hora de unir todo lo evaluado y discutido anteriormente en una sola solución. Usando librerías de Sklearn como ShuffleSplit (para dividir los datos), DecisionTreeRegressor (algoritmo de supervised learning), make_scorer y GridSearchCV, creamos un modelo que mejor se ajuste a la solución que estamos buscando. Si creamos el código y lo corremos vemos que el modelo óptimo que mejor se ajusta, debe tener un valor de max_depth = 4, independientemente si se usa GridSearchCV o RandomizedSearchCV (algo similar a lo que se discutió anteriormente).
Y por último, es hora de probar nuestro modelo usando datos de prueba reales, de clientes de un agente de bienes inmuebles:
Cliente 1: $406,933.33
Cliente 2: $232,200.00
Cliente 3: $938,053.85
Para los clientes 1 y 2, los precios están por debajo de la media y del promedio; para el cliente 2, parece razonable debido al alto nivel de pobreza y la proporción de estudiantes por maestro; para el cliente 1, también parece razonable debido al nivel de pobreza promedio y la proporción de alumnos por maestro; y el precio de la casa del cliente 3 está muy por encima del precio promedio y de la media, acercándose al precio máximo en el conjunto de datos, esto parece razonable dado el bajo nivel de pobreza, la proporción de estudiantes por maestro y por el alto número de cuartos.