La dirección de GitHub para este repositorio es la siguiente: Repositorio.
En este proyecto se trata de predecir el tráfico de Madrid, modelando una red neuronal LSTM, arquitectura capaz de captar patrones temporales a partir de secuencias de datos. Se hace esto con el objetivo de reducir las congestiones, reduciendo también por lo tanto las emisiones y mejorando la calidad de vida de los ciudadanos. A partir del modelo entrenado, se realizan predicciones, las cuales facilitarán la generación una red de carreteras con intensidades (valores predichos) asignadas a los nodos. Y ya por último, se calcula el camino mínimo mediante el algoritmo de Dijkstra, mundialmente conocido y con un costo computacional bajo, además de estimar el tiempo del trayecto basándose en la distancia recorrida (se calcula la distancia euclidea entre dos puntos) y la velocidad media (valor que también predice el modelo).
En el repositorio actual se pueden encontrar varios cuadernos de Jupyter con Python y Markdown que, celda por celda, van desarrollando todo el proceso descrito.
Para entrenar un modelo para que prediga el tráfico, se necesita acceso a los siguientes datos:
- Un historial de datos de tráfico de Madrid, a partir de los cuales el modelo aprenderá e identificará patrones para predecir el tráfico correctamente.
- Datos en tiempo real que se emplean para realizar simulaciones de hora de llegada estimada y recomendaciones de horas de salida a partir de una hora de llegada dada.
¿De dónde se obtienen los datos? Para este estudio, se recopilaron datos desde el portal de datos abiertos del Ayuntamiento de Madrid, más concretamente, el histórico de datos de tráfico desde 2013 y los datos del tráfico en tiempo real, pero no han sido adjuntados en este repositorio debido a su gran volumen.
El repositorio está organizado de la siguiente manera:
- Una carpeta general, desde la cual se puede acceder a el códio completo laldama
Traffic. - Una carpeta llamada
modelsdonde se encuentran las cuatro distintas variaciones de modelos desarrollados a lo largo del estudio:lstm.ipynbpara la red más básica,lstm2.ipynbpara una red algo más compleja,lstm2_cyclical.ipynbpara la misma red anterior pero aplicando transformaciones sobre las variables cíclicas ylstm_attention.ipynbalgo más sencilla que la anterior (aplicando también la transformación sobre las variables cíclicas) e integrando en la red una capa de atención. - Una carpeta llamada
optimizationdesde la cual se hacen todas las simulaciones de cálculo de camino mínimo y estimación de tiempo de trayecto. Se pueden encontrar dos archivos:graph.ipynbque se encarga de generar el grafo y actualizar sus intensidades según los valores predichos, ydijkstra.ipynbque, a partir del grafo con intensidades, calcula el camino mínimo y estima la hora de salida o llegada, según el caso. - Una carpeta llamada
predictionsque contiene tan solo un documento,prediction.ipynbque se encarga de cargar un modelo entrenado, hacer las predicciones correspondientes y guardarlas para su uso a posteriori. - Una carpeta llamada
process data, encargada de todo lo que tiene que ver sobre el análisis de datos previo a todo el entrenamiento de modelos y predicciones. Se pueden unir los datos mensuales en un único CSV (unite_data.ipynb), visualizar los datos en un mapa (map_data.ipynb), generar gráficas de los datos (visualization.ipynb) y separar los datos en dsitintos CSVs según su identificador (separate_data.ipynb).
Todos estos archivos y documentos constituyen el código generado para mi trabajo de fin de grado.
Para que se ejecuten todos los archivos de código correctamente, se debe seguir el siguiente flujo de proceso:
- Descargar los datos del portal de datos abiertos del Ayuntamiento de Madrid y almacenarlos en una nueva carpeta llamada
data, dentro deTraffic. Además, guardar los datos históricos mensuales en otra carpeta dentro dedatallamadamonthly data. - Ejecutar el archivo
unite_data.ipynbpara unir en un único CSV las entradas mensuales de datos. - En caso de querer visualizar los datos, ejecutar
map_data.ipynbyvisualization.ipynb. - Para preparar los datos para entrenar modelos, ejecutar
separate_data.ipynb, de esta manera se separan los datos según identificadores. - Ejecutar cualquiera de los modelos que se deseen dentro de la carpeta
models, pudiendo cambiar el conunto de datos de entrenamiento libremente para cada caso. El modelo y escalador se guardan automáticamente en una carpeta llamadasaved. - Antes de ejecutar el código de
prediction.ipynb, ejecutar un modelo para cada set de datos separados en el paso 4 y guardarlo en una carpeta llamadafinaldentro demodels. - Cuando ya se tiene un modelo por cada punto seleccionado, se pueden realizar las predicciones de
prediction.ipynb, obteniendo 3 archivos tipopkl. - Una vez hechas las predicciones, se puede generar el grafo y asignarle intensidades, ejecutando el archivo
graph.ipynbdentro de la carpetaoptimization. - Con el grafo generado y con ponderaciones, se puede calcular el camino mínimo ejecutando
dijkstra.ipynb, donde tambén se obtiene la estimación de la duración del trayecto.