Muy buenas, les saluda Luis y hoy les traigo otro tutorial.
Índice
Herramientas y técnicas prácticas que ayudaron a construir un proyecto final ganador
Han pasado unos meses desde que mi equipo de capstone concluyó el trabajo en nuestro proyecto de aprendizaje automático de gestión de incendios forestales. ¡Fue una gran experiencia que, en última instancia, resultó en que ganáramos el Concurso Capstone de Ingeniería de Software de Ontario en 2020! A medida que la escuela comienza y los estudiantes comienzan nuevos proyectos, pensé que sería útil compartir algunos consejos que me ayudaron mientras trabajaba en este proyecto.
En general, mi gran conclusión de trabajar en una piedra angular que involucra el aprendizaje automático fue que el 90% del trabajo consiste en enviar los datos rápidamente (o hacerse amigo de los datos, según su perspectiva).
Comprender la importancia de los datos limpios, el análisis de datos exploratorios y la disputa de datos fue absolutamente vital para el éxito de nuestro proyecto. Creo que este punto a menudo se subestima en el trabajo del curso y puede llevar a las personas a tener una percepción sesgada del trabajo involucrado en tal proyecto. Así que aquí hay algunas herramientas y técnicas (con ejemplos) que ayudaron a mi equipo a mantener una relación saludable con los datos y hicieron que el proyecto fuera mucho más agradable.
Colaboración con Google Colab
Google Colab es una herramienta para codificar y ejecutar Jupyter.
A tener en cuenta: books (a menudo utilizado para proyectos de aprendizaje automático) desde Google Drive. Hay dos grandes ventajas de usar Google Colab sobre los scripts de Python locales o incluso los cuadernos de Jupyter locales.
Primero, Colab le brinda acceso a una GPU en la nube gratuita que realmente puede acelerar su flujo de trabajo. En segundo lugar, el uso de Colab permite el almacenamiento de datos en Google Drive (cada cuenta tiene hasta 15 GB), lo que facilita la colaboración en la gestión de datos. Para aprovechar estas capacidades, nuestro equipo usó una carpeta compartida en Google Drive que contenía nuestros Colab A tener en cuenta:books y una carpeta de datos compartidos con archivos csv comprimidos con gzip que fueron generados por algunos portátiles y utilizados como entradas por otros. Dado que se compartió la carpeta de Google Drive, todos pudieron acceder fácilmente a los datos más recientes producidos por otros miembros del equipo.
A continuación, se muestra un ejemplo de cómo importar un csv comprimido con gzip desde una carpeta compartida utilizando un cuaderno de Google Colab:
Si está utilizando archivos csv grandes, le sugiero que los almacene con compresión gzip porque el paquete pandas puede descomprimir y leer el archivo en una línea de código y rápidamente.
En nuestro proyecto, teníamos 15 archivos de cuaderno activos que tenían diferentes interdependencias, por lo que tener un lugar inequívoco para el almacenamiento de datos fue muy útil.
Acelerar la adquisición de datos con aiohttp
La temperatura, el viento y la humedad tienen efecto significativo sobre si se producirá un incendio forestal y si se propagará. Dado que estos valores cambian significativamente a lo largo del día, tuvimos que obtener datos por hora de las estaciones meteorológicas de Canadá durante varios años.
Afortunadamente para nosotros, el Gobierno de Canadá (Medio Ambiente y Cambio Climático de Canadá) datos meteorológicos históricos por hora para cientos de estaciones meteorológicas en todo Canadá, ¡en algunos casos se remontan hasta 1866! Incluso proporcionaron un API para descargar los datos meteorológicos históricos de forma masiva.
La API para descargar datos por horas requería que el usuario especificará el ID de la estación, el año y el mes. Entonces, si quisiéramos datos de 150 estaciones durante los últimos 10 años, eso significaría 150x10x12 = 18,000 llamadas API. Hacer esas llamadas en secuencia llevaría mucho tiempo, por lo que usamos el paquete aiohttp para realizar las llamadas a la API al mismo tiempo.
El código anterior se puede utilizar para obtener cualquier tipo de datos csv disponibles a través de una URL.
Vectorización
Durante la ingeniería de características, nuestro equipo planteó la hipótesis de que la humedad absoluta puede proporcionar información adicional que ayudaría con la predicción de incendios forestales. La humedad absoluta se puede derivar de la temperatura y la humedad relativa utilizando una fórmula especial derivada aquí.
Aquí está la fórmula en código:
Hay varias formas de aplicar esto para cada hora de los datos meteorológicos en el marco de datos de pandas. Podríamos recorrer cada fila en el marco de datos y calcular la humedad absoluta:
%% timeit -n 3 abs_humidity_list = [] para índice, fila en df.iterrows (): temperatura = fila ['Temp (° C)'] rel_humidity = fila ['Humedad rel (%)'] abs_humidity = calcular_abs_humidity (temperatura, rel_humidity) abs_humidity_list.append (abs_humidity)
Resultado: 3 bucles, lo mejor de 3: 8,49 s por bucle
Aunque el código anterior hace el trabajo, calcula la función una vez por cada fila. Para obtener resultados más rápidos, se puede utilizar la función de aplicación de pandas:
%% timeit -n 3 abs_humidity_series = df.apply (fila lambda: Calculate_abs_humidity (fila ['Temp (° C)'], fila ['Humedad rel (%)']), eje = 1)
Resultado: 3 bucles, lo mejor de 3: 1,9 s por bucle
Aunque esto es más rápido, la función de aplicación de pandas sigue siendo fundamentalmente un bucle. Para un cálculo verdaderamente rápido, queremos aplicar el create_abs_humidity función a todos los pares de temperatura y humedad relativa en el Mismo tiempo. En la mayoría de nuestros cuadernos de proyectos, nuestro equipo usó numpy’s vectorizar función para esto:
importar numpy como np %% timeit -n 3 abs_humidity_np = np.vectorize (calculate_abs_humidity) ( df ['Temp (° C)'], df ['Hum Rel (%)'])
Resultado: 3 bucles, lo mejor de 3: 34,2 ms por bucle
No es una mala mejora. Sin embargo, durante la redacción de esta publicación descubrí que usar numpy’s vectorizar todavía no es verdadera vectorización. De hecho, no podemos hacer una verdadera vectorización con Calculate_abs_humidity porque dentro de esa función usamos math.exp que solo puede operar en un solo número a la vez y no en largas listas de números (vectores).
Afortunadamente, numpy tiene una función exponencial equivalente que funciona con vectores, np.exp, así que si hacemos un pequeño ajuste a nuestro original Calculate_abs_humidity función, cambiando las funciones exponenciales, obtenemos:
De repente, tenemos una función que puede incluir columnas completas de marcos de datos de pandas:
%% timeit -n 3 calculate_abs_humidity_np (df ['Temp (° C)'], df ['Rel Hum (%)'])
Resultado: 3 bucles, lo mejor de 3: 5,64 ms por bucle
¡Verdadera vectorización!
Podría decir: “¿Realmente importa tanto la vectorización? Ahorrar 8 segundos no parece tan importante «. Para conjuntos de datos pequeños, estoy de acuerdo en que no hará una gran diferencia. Como referencia, los ejemplos anteriores utilizaron datos por hora de los últimos 10 años de una sola estación meteorológica, lo que resultó en 78,888 filas (todavía relativamente pequeñas).
Pero, ¿qué pasaría si quisiéramos calcular la humedad absoluta para los datos de 100 estaciones meteorológicas para el mismo período de tiempo? Ahora, si está iterando a través de cada fila, tendría que esperar 13 minutos y aquí es donde la vectorización comienza a marcar una gran diferencia. La vectorización también tiene la ventaja adicional de hacer que su código sea más conciso y legible, por lo que le recomiendo que se acostumbre a usarlo cuando sea posible.
Notas finales
El eventual modelo de predicción de incendios forestales utilizado en el proyecto capstone se entrenó en un conjunto de datos que contenía más de 16 millones de filas (cada fila contenía información para una cuadrícula de 20 x 20 km en un día determinado en los últimos 10 años). La recopilación de este conjunto de datos resultó ser una parte crucial del proyecto y todo el proceso se hizo mucho más fácil mediante el uso de:
- Google Colab – para compartir y colaborar fácilmente en datos.
- aiohttp – para adquirir grandes cantidades de datos rápidamente.
- funciones vectorizadas – para realizar operaciones eficientes en conjuntos de datos con millones de filas.
He incluido todo el código de ejemplo en un archivo de cuaderno aquí: https://github.com/ivanzvonkov/examples-3-tips-for-ml-projects/blob/master/example-notebook.ipynb.
¡Espero que tenga la oportunidad de probar algunas de estas herramientas en su próximo proyecto!
Si desea consultar el repositorio del proyecto final real, puede encontrarlo aquí: https://github.com/ivanzvonkov/forestcasting.
Gracias por leer, se agradecen todos los comentarios.
Añadir comentario