Este proyecto implementa una API REST para predecir la especie de pingüinos basada en características físicas como:
- culmen_length_mm
- culmen_depth_mm
- flipper_length_mm
- body_mass_g
- sex
El modelo utiliza un Decision Tree Classifier entrenado con el dataset de Palmer Penguins, el cual es capaz de identificar tres especies: Adelie, Chinstrap y Gentoo.
- Desarrollo: Python 3.14
- ML: Scikit-learn, Pandas, NumPy
- Backend: FastAPI + Uvicorn
- Containerización: Docker
- Persistencia: Docker Volumes
- Python 3.14.2
- pip
- Virtual environment (pyenv)
# 1. Clonar el repositorio
git clone <URL_DEL_REPOSITORIO>
cd penguin-proyect
# 2. Crear el entorno virtual
python3 -m venv ceniaenv
# 3. Activar el entorno virtual
source ceniaenv/bin/activate # En macOS/Linux
# Actualizar pip
pip install --upgrade pip
# Instalar dependencias del proyecto
pip install -r requirements.txt# Desde el directorio app/
cd app
# Ejecutar con uvicorn
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadLa API se encuentra disponible en: http://localhost:8000
- Docker instalado y en funcionamiento
# Desde la raíz del proyecto
docker build -t penguin1 .# Crear volumen para persistencia de modelos (realizar una sola vez)
docker volume create penguin_models
# Ejecutar el contenedor
# Esto debe ser con un mapeo de los puertos para que el localhost exponga al docker
docker run -p 8000:8000 -v penguin_models:/app/app/models penguin1- URL base:
http://localhost:8000 - Documentación interactiva:
http://localhost:8000/docs(Swagger UI)
Descripción: Devuelve información general sobre la API y los endpoints disponibles.
Método HTTP: GET
Parámetros: Ninguno
Respuesta:
{
"message": "Bienvenido a Penguin Species Prediction API",
"version": "1.0.0",
"endpoints": {
"docs": "/docs",
"health": "/health",
"predict": "/predict",
"train": "/train",
"test": "/test"
}
}Descripción: Verifica que la API está funcionando correctamente.
URL: http://127.0.0.1:8000/health
Método HTTP: GET
Parámetros: Ninguno
Respuesta:
{
"status": "API is running"
}Descripción: Entrena un nuevo modelo Decision Tree con el dataset de pingüinos.
URL: http://127.0.0.1:8000/train
Método HTTP: POST
Parámetros: Ninguno
Respuesta:
{
"message": "modelo entrenado exitosamente",
"results": {
"status": "success",
"training_samples": 266,
"test_samples": 67,
"metrics": {
"accuracy": 1.0,
"precision": 1.0,
"recall": 1.0
}
}
}Descripción: Evalúa el modelo entrenado con el dataset de prueba.
URL: http://127.0.0.1:8000/test
Método HTTP: GET
Parámetros: Ninguno
Respuesta:
{
"message": "evaluación completada exitosamente",
"metrics": {
"accuracy": 1.0,
"precision": 1.0,
"recall": 1.0
}
}Descripción: Predice la especie de un pingüino según sus características físicas.
URL: http://127.0.0.1:8000/predict
Método HTTP: POST
Content-Type: application/json
Parámetros de Entrada:
{
"culmen_length_mm": 40.0,
"culmen_depth_mm": 18.0,
"flipper_length_mm": 200.0,
"body_mass_g": 4000,
"sex": "MALE"
}Respuesta:
{
"predicted species": "Adelie",
}curl http://localhost:8000/healthRespuesta:
{"status": "API is running"}curl -X POST http://localhost:8000/trainRespuesta:
{
"message": "modelo entrenado exitosamente",
"results": {
"status": "success",
"training_samples": 266,
"test_samples": 67,
"metrics": {"accuracy": 1.0, "precision": 1.0, "recall": 1.0}
}
}curl -X POST http://localhost:8000/predict \
-H "Content-Type: application/json" \
-d '{
"culmen_length_mm": 40.0,
"culmen_depth_mm": 18.0,
"flipper_length_mm": 200.0,
"body_mass_g": 4000,
"sex": "MALE"
}'Respuesta:
{
"predicted species": "Adelie",
}curl http://localhost:8000/testRespuesta:
{
"message": "evaluación completada exitosamente",
"metrics": {"accuracy": 1.0, "precision": 1.0, "recall": 1.0}
}1. Iniciar contenedor
docker run -p 8000:8000 -v penguin_models:/app/app/models penguin1
2. Verificar que la API está activa
curl http://localhost:8000/health
3. Entrenar el modelo (primera vez)
curl -X POST http://localhost:8000/train
4. Hacer predicciones
curl -X POST http://localhost:8000/predict -H "Content-Type: application/json" -d '{"culmen_length_mm": 40, "culmen_depth_mm": 18, "flipper_length_mm": 200, "body_mass_g": 4000, "sex": "MALE"}'
5. Ver métricas
curl http://localhost:8000/test
6. Acceder a documentación interactiva
http://localhost:8000/docs
7. Detener contenedor
Ctrl + C