Plantilla de ML con Cookiecutter paso a paso

Resumen

Crear una plantilla personalizada con Cookiecutter te permite estandarizar proyectos de Machine Learning, acelerar el inicio de cada nuevo desarrollo y mantener consistencia entre los miembros de tu equipo. Es una herramienta clave si trabajas en ciencia de datos y necesitas que tus repositorios sigan siempre la misma estructura.

¿Qué estructura debe tener una plantilla para Machine Learning?

La idea es replicar un directorio que cubra los componentes típicos de un proyecto de datos: gestión de datasets, código fuente, notebooks, modelos y documentación.

La estructura base que vas a construir incluye:

  • Una carpeta data para almacenar los conjuntos de datos.
  • Una carpeta source con el código fuente del proyecto.
  • Una carpeta para los notebooks exploratorios.
  • Una carpeta de models para guardar los modelos entrenados.
  • Archivos raíz como environment, requirements.txt, README.md y la licencia.

Todo esto vive dentro de una carpeta especial nombrada con la sintaxis de Jinja: {{cookiecutter.project_name}}. Ese motor de plantillas es el que permite reemplazar variables dinámicas según lo que el usuario ingrese [01:30].

¿Qué es Jinja en Cookiecutter? Es el motor de plantillas que reemplaza variables como {{cookiecutter.project_name}} por los valores que el usuario escribe al generar el proyecto. También soporta condicionales con {% if %}.

¿Cómo defines las variables en cookiecutter.json?

El archivo cookiecutter.json vive en la raíz del template y declara todas las variables que el usuario completará al ejecutar el comando. Cada valor en el JSON funciona como valor por defecto: si el usuario presiona enter sin escribir nada, ese será el valor asignado [03:45].

Las variables típicas para un proyecto de ML son:

  1. project_name: nombre del proyecto.
  2. author_name: autor o equipo responsable.
  3. python_version: versión de Python, por ejemplo 3.8 o 3.12.
  4. license: lista con opciones como MIT, GPL y Apache.

Cuando defines la licencia como una lista de tres elementos, Cookiecutter automáticamente muestra un menú numerado al usuario y toma la primera opción como predeterminada.

¿Cómo personalizar README, environment y la licencia con Jinja?

Cada archivo dentro del template puede invocar variables y aplicar lógica condicional. Así logras que la documentación generada se adapte al proyecto sin intervención manual.

¿Cómo se usan variables en el README?

En el README.md empiezas con un título dinámico usando markdown y Jinja:

markdown

{{cookiecutter.project_name}}

Proyecto de Machine Learning creado por {{cookiecutter.author_name}}

Luego añades la descripción, los requisitos y las instrucciones de instalación. La versión de Python también se inyecta desde la variable correspondiente, lo que evita inconsistencias entre la documentación y el entorno real.

¿Cómo aplicar condicionales para múltiples licencias?

El archivo de licencia usa la sintaxis de control de Jinja con {% %}. Esto te permite mostrar contenido distinto según la opción que el usuario eligió [07:20]:

jinja {% if cookiecutter.license == 'MIT' %} Licencia MIT. Derechos pertenecen a {{cookiecutter.author_name}}. {% elif cookiecutter.license == 'GPL' %} Licencia GPL... {% elif cookiecutter.license == 'Apache' %} Licencia Apache... {% endif %}

Fíjate en tres detalles: las cadenas como 'MIT' van entre comillas, cada bloque debe cerrar con %}, y todo el condicional termina con {% endif %}. Olvidar uno de estos signos es el error más común al construir plantillas.

¿Cómo configurar el environment.yml?

En el archivo de entorno defines el nombre dinámico, los canales de conda y las dependencias base:

  • name: {{cookiecutter.project_name}}.
  • Canales de conda correctamente indentados.
  • Dependencias como numpy, pandas y python={{cookiecutter.python_version}}.

La indentación es crítica en YAML, así que valida cada nivel antes de guardar.

¿Cómo organizar y ejecutar tu template de Cookiecutter?

Para mantener orden cuando manejas varios templates, conviene crear una carpeta contenedora, por ejemplo my-ml-template, y dentro colocar el cookiecutter.json junto con la carpeta {{cookiecutter.project_name}} al mismo nivel.

¿Cómo ejecuto un template local de Cookiecutter? Desde la terminal en el directorio padre, corre cookiecutter my-ml-template. La herramienta te pedirá los valores de cada variable y generará el proyecto con la estructura completa.

Una vez activado tu entorno virtual, por ejemplo notebooks_env, ejecutas el comando y respondes las preguntas: nombre del proyecto, autor, versión de Python (puedes elegir 3.12) y la licencia. Al terminar, verás una nueva carpeta lista para abrirse en Visual Studio Code con todos los archivos personalizados según tus respuestas [13:50].

Una buena práctica adicional es comenzar siempre desde la plantilla oficial para ciencia de datos que provee Cookiecutter y luego adaptarla a las necesidades de tu equipo. Sube tu template personalizada a GitHub y comparte el enlace en los comentarios para que otros puedan reutilizarla.