8 cosas que la mayoría de los programas de ciencia de datos no enseñan (pero deberías saber) – Parte 1

8 cosas que programas de ciencia de datos no enseñan - Parte 1

Data Science 101

MIT llama a esto “el semestre perdido de tu educación en ciencias de la computación”

Creado usando Midjourney.

Tal vez hayas oído hablar o experimentado antes la regla 80/20 de la ciencia de datos:

Solo el 20% del tiempo de los científicos de datos se dedica al análisis. La mayoría del tiempo, el 80%, se gasta simplemente preparando los datos.

Creo que en mi caso podría ser realmente 90/10. Esa es simplemente la realidad de mi trabajo: trabajamos con conjuntos de datos muy complejos.

Eso no es, sin embargo, para lo que se preparan la mayoría de los programas, campamentos de entrenamiento y cursos de ciencia de datos.

Lo más probable es que hayas aprendido a usar modelos predictivos complejos, agrupar datos no estructurados y analizar series de tiempo. Sin este conocimiento, no eres un científico de datos.

Pero el 80% de tu tiempo no se gastará usando estas técnicas. En cambio, estarás recolectando, moviendo y limpiando datos, configurrando bases de datos, gestionando entornos de computación remotos y ocupándote de muchas otras tareas no analíticas.

El problema es que no saber qué herramientas existen para abordar estas tareas puede afectar en gran medida tu productividad y potencialmente los resultados del proyecto. De hecho, este es un problema tan común que MIT tiene un curso dedicado exclusivamente a llenar este vacío, el curso se llama “el semestre perdido de tu educación en ciencias de la computación”. (Este es un gran curso que inspiró la forma en que pienso sobre algunos de los temas tratados aquí.)

Esta publicación es el comienzo de una serie en la que hablaré sobre algunas lecciones prácticas que aprendí (principalmente) mientras trabajaba dentro del bloque del 80%. El objetivo es explorar qué herramientas existen para abordar estas tareas y compartir algunas buenas prácticas que aprendí en mi carrera.

Esto es lo que cubriremos:

Parte 1 (esta publicación):

  1. Sentirse cómodo usando Linux
  2. Ser capaz de usar de manera efectiva sistemas de cómputo remoto
  3. Usar un entorno de Python separado para cada proyecto
  4. Saber cómo depurar y perfilar tu código

Parte 2 (próximamente):

  1. Ayuda a tu futuro cuidando la reproducibilidad
  2. Versionar todo, incluidos datos y modelos
  3. Organizar tus experimentos con herramientas de seguimiento de experimentos de ML
  4. Probar y documentar tu código

En futuras publicaciones separadas profundizaré en cada uno de estos temas.

1. Sentirse cómodo usando Linux

Incluso si tu sistema operativo de elección es Windows, hay muchas razones por las cuales tener un conocimiento básico de Linux puede ser muy útil.

Los entornos de cómputo compartido como AWS y GCP típicamente se ejecutan en Linux. Linux también viene con la shell, que es una herramienta poderosa que puede ayudarte a resolver muchas tareas con unos pocos comandos simples.

Esto es lo que Software Carpentry, cuyos talleres suelen comenzar con un curso básico de shell, tiene que decir al respecto:

“La shell de Unix ha existido más tiempo que la mayoría de sus usuarios. Ha sobrevivido porque es una herramienta poderosa que permite a los usuarios realizar tareas complejas y poderosas, a menudo con solo unos pocos golpes de teclado o líneas de código. Ayuda a los usuarios a automatizar tareas repetitivas y combinar fácilmente tareas más pequeñas en flujos de trabajo más grandes y poderosos. El uso de la shell es fundamental para una amplia gama de tareas avanzadas de computación, incluida la computación de alto rendimiento.”

Esto es una lista de conceptos básicos que debes conocer y que te ayudarán a convertirte en un usuario eficiente de Linux. Estas son herramientas que uso a diario.

  • Comprender y navegar por el sistema de archivos: conceptos como la estructura de directorios, el directorio de inicio, los permisos de archivos y directorios y los enlaces de archivos.
  • La variable $PATH y las variables de entorno.
  • Cómo listar los procesos en ejecución y detener o matar un proceso.
  • Comandos básicos de la shell para trabajar con archivos y directorios como cd, ls, cat, less, mkdir, mv, rm, grep y find.
  • Combinar comandos y redirigir la salida de comandos.
  • Saber cómo editar un archivo en la terminal usando un editor de texto como nano o vim.
  • Crear un script básico de shell para poder guardar tus comandos y volver a ejecutarlos fácilmente.

Esto puede parecer una larga lista para recordar, pero una vez que empieces a usar estas herramientas regularmente, se convertirán en algo natural.

2. Ser capaz de usar eficazmente sistemas de computación remota

Los entornos de computación remota como AWS, GCP y Azure son útiles por dos razones principales: te brindan más recursos informáticos que pueden estar disponibles localmente y te permiten ejecutar procesos largos (como entrenar modelos) sin tener que preocuparte por mantener tu computadora encendida todo el tiempo.

Un enfoque popular, rápido y sencillo para usar sistemas de computación remota es ejecutar un servidor de cuaderno Jupyter en la máquina remota. La desventaja de esta solución es que los cuadernos Jupyter no fueron diseñados para ejecutar procesos largos.

Si alguna vez has perdido algunos de tus resultados debido a una pérdida momentánea de conexión a Internet, sabes de lo que estoy hablando.

Afortunadamente, Linux proporciona un conjunto de herramientas diseñadas para ejecutar procesos largos. Si ya usas o planeas usar sistemas de computación remota, familiarizarte con estas herramientas puede ahorrarte muchos dolores de cabeza en el futuro.

Hay dos acciones clave que realizarás al usar sistemas de computación remota:

  • Conectarte a través de SSH y transferir datos hacia adelante y hacia atrás con herramientas como scp y rsync (rsync es una herramienta importante para tener en tu caja de herramientas porque con la opción -P puede reanudar una transferencia interrumpida, lo cual puede ser muy útil para archivos grandes).
  • Gestionar procesos en ejecución prolongada utilizando herramientas como nohup, screen y tmux para que los procesos no se detengan cuando te desconectas de la máquina remota.

Con estas herramientas, deberías poder ejecutar procesos en máquinas remotas como si estuvieras allí en persona.

3. Usar un entorno de Python separado para cada proyecto

Creo que esta es una idea bastante sencilla, pero en mi experiencia, es sorprendentemente poco común en la práctica.

Un error común que cometen los científicos de datos es no molestarse en usar entornos virtuales en absoluto o usar un entorno compartido para todos los proyectos.

Se ha escrito mucho sobre por qué debes usar entornos virtuales de Python, pero en pocas palabras, no usar un entorno virtual significa que cualquier biblioteca de terceros que necesites se instalará directamente en la instalación del sistema de Python. Esto podría afectar cualquier tarea del sistema que dependa de Python, y en el peor de los casos, podría dañar tu sistema operativo.

Usa entornos virtuales de Python (venv, conda, pipenv, o cualquiera que sea tu gestor de entornos virtuales favorito) para cada. proyecto. individual, sin importar lo pequeño que sea.

Es posible que muchos de tus proyectos compartan las mismas dependencias, como el típico conjunto de herramientas de Python para ciencia de datos. En este caso, compartir un entorno entre proyectos puede parecer una buena idea. Después de todo, te ahorra tiempo y espacio, ¿verdad?

Hay muchas razones por las que no debes hacerlo. Aquí tienes algunas de las principales:

  • Corres el riesgo de encontrarte con problemas de versiones de bibliotecas entre diferentes proyectos. ¿Has oído hablar del “infierno de dependencias”? Esto puede parecer un escenario poco común, pero puede ser más común de lo que piensas.
  • Es más difícil saber qué bibliotecas son necesarias para cada proyecto. Esto puede ser particularmente problemático si estás trabajando en un proyecto colaborativo y necesitas compartir tu entorno con el resto de tu equipo.

Mantener un entorno separado para cada proyecto puede parecer una carga adicional, pero hoy en día hay muchas herramientas que facilitan y simplifican la gestión de entornos virtuales (dos de mis favoritas son virtualenvwrapper y pipenv). Te recomiendo encarecidamente que pruebes diferentes herramientas para ver cuál funciona mejor con tu flujo de trabajo.

4. Saber cómo depurar y perfilar tu código

La realidad de escribir código es que nadie escribe código perfecto.

Es probable que en algún momento hayas pasado horas revisando la lógica de tu código porque simplemente no hace lo que quieres, solo para descubrir que intercambiaste variables o te olvidaste de llamar a model.eval(). Esta es una realidad frustrante para cualquiera que escriba código para vivir.

La realidad de escribir código es que nadie escribe código perfecto.

Un primer paso natural cuando te enfrentas a un error extraño es usar un montón de declaraciones de impresión y probar iterativamente el código. A menudo, esto es suficiente para identificar el problema, pero no siempre es una solución sin problemas (¿alguna vez encontraste una declaración de impresión de depuración olvidada en tu código antiguo?).

Ingresa a las herramientas de depuración.

Los depuradores te permiten ejecutar tu código paso a paso e inspeccionar el estado de cada variable en tu código. Básicamente, hacen lo mismo que tus declaraciones de impresión, pero de manera sistemática y con solo un clic de un botón.

Hay una larga lista de depuradores con los que puedes experimentar, como Python pdb, el depurador de PyCharm, el depurador de Visual Studio Code (mi favorito) y muchos otros. Si escribir código es algo que haces a diario, aprender a usar un depurador puede ser una inversión de tiempo muy útil que te puede ahorrar muchos dolores de cabeza a largo plazo.

Medición de tiempos y perfilado de código

Tal vez tu código funcione como se espera, pero se ejecuta más lento o utiliza más recursos de los que te gustaría. En mi propia programación, a menudo me enfoco primero en obtener una solución funcional y luego me preocupo por optimizar mi código más adelante (por supuesto, la parte de optimización no siempre sucede, pero espero que eventualmente esto se resuelva para mí mediante LLMs).

Aquí es donde la medición de tiempos y el perfilado pueden ayudar. Ambos te ayudan a hacer lo mismo: descubrir cuellos de botella e ineficiencias en tu código, cada uno utilizando un enfoque diferente.

La medición de tiempos simplemente mide cuánto tiempo ha transcurrido entre dos puntos en tu código. Puedes usar esto para medir cuánto tiempo tardó en ejecutarse una determinada función (el módulo timeit de Python tiene algunos ejemplos útiles).

Existen diferentes tipos de perfiles, pero todos te ayudan a hacer lo mismo: simplemente, miden cuánto tiempo se ha pasado en cada llamada de función. Python tiene un perfilador incorporado llamado cProfile, y también hay muchas opciones de terceros como Palanteer y Yappi.

Independientemente de la opción que decidas usar para el perfilado, si alguna vez reescribes y optimizas tu código, deberías considerar agregar un perfilador a tu caja de herramientas de Python.

Una nota sobre la depuración

Donde los depuradores de código tradicionales no son suficientes es en la depuración de algoritmos de aprendizaje. Tal vez tu modelo no converge o tiene un rendimiento muy bueno o muy pobre. Si bien técnicamente puedes usar un depurador en un modelo de regresión o un algoritmo de agrupamiento, a menos que los hayas implementado tú mismo, es probable que el algoritmo en sí esté bien y el problema se encuentre en otro lugar, como una elección incorrecta de algoritmo de aprendizaje, datos insuficientes, hiperparámetros inapropiados, etc.

La depuración de algoritmos de ciencia de datos requiere una combinación de comprensión de tus datos, tener cierta intuición sobre cómo funciona el algoritmo y tener conocimientos sobre técnicas como el análisis de errores, entre otras cosas. Andrew Ng ofrece consejos para depurar algoritmos de aprendizaje en esta fantástica conferencia. Hazme saber en los comentarios si estarías interesado en un artículo separado sobre este tema.

Si has llegado hasta aquí, ¡gracias por leer! Espero que hayas disfrutado este artículo. Si deseas recibir notificaciones cuando publique un nuevo artículo, considera registrarte para recibir notificaciones por correo electrónico aquí.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

AI 'Avance' Red neuronal tiene capacidad similar a la humana para generalizar el lenguaje

Una inteligencia artificial basada en redes neuronales supera a ChatGPT en la capacidad de incorporar rápidamente nue...

Inteligencia Artificial

Utilizando LLMs para codificar nuevas tareas para los robots

Un equipo de investigación desarrolló una herramienta que utiliza modelos de lenguaje grandes para codificar nuevas t...

Inteligencia Artificial

OpenAI desvela GPT-4 Turbo Un avance personalizable hacia el futuro de la inteligencia artificial

En una industria donde la innovación es tanto rápida como revolucionaria, OpenAI ha vuelto a empujar los límites de l...