--- language: es tags: - svm - fashion-mnist - flask - api - machine-learning license: mit datasets: - fashion-mnist metrics: - accuracy --- # SVM Fashion-MNIST — API Flask Proyecto que entrena un clasificador **SVM + PCA** sobre el dataset **Fashion-MNIST** y lo sirve como API REST con Flask. --- ## Estructura del proyecto ``` svm_fashion_flask/ ├── train_model.py ← Entrena y guarda los artefactos (.pkl) ├── app.py ← API Flask (endpoint de predicción) ├── test_api.py ← Script de prueba de los endpoints ├── requirements.txt └── models/ ← Generado automáticamente por train_model.py ├── scaler.pkl ├── pca.pkl └── svm_model.pkl ``` --- ## Instalación ```bash # 1. Crear entorno virtual (recomendado) python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 2. Instalar dependencias pip install -r requirements.txt ``` --- ## Uso ### Paso 1 — Entrenar el modelo ```bash python train_model.py ``` > Descarga Fashion-MNIST, aplica PCA, busca hiperparámetros con GridSearchCV > y guarda los artefactos en `models/`. > **Tiempo estimado: 10-30 min** según el hardware. > La precisión objetivo es **≥ 90 %**. ### Paso 2 — Iniciar la API ```bash python app.py ``` La API queda disponible en `http://127.0.0.1:5000`. ### Paso 3 — Probar los endpoints ```bash python test_api.py ``` --- ## Endpoints ### `GET /health` Verifica que la API y el modelo estén operativos. ```json { "status": "ok", "model_loaded": true, "message": "API operativa" } ``` --- ### `GET /model/info` Metadatos del modelo cargado. ```json { "model_type": "SVC", "kernel": "rbf", "C": 50, "gamma": 0.01, "classes": ["T-shirt/top", "Trouser", "..."], "pca_components": 187, "pca_variance_ratio": 0.9502, "input_features": 784 } ``` --- ### `POST /predict` Clasifica **una** imagen. **Body:** ```json { "pixels": [0, 128, 255, ...] // 784 valores enteros (0-255) } ``` **Respuesta:** ```json { "class_id": 7, "class_name": "Sneaker", "confidence": 0.9423, "probabilities": { "T-shirt/top": 0.01, "Sneaker": 0.9423, "..." }, "inference_ms": 12.4 } ``` --- ### `POST /predict/batch` Clasifica **múltiples** imágenes en una llamada. **Body:** ```json { "images": [ [0, 128, 255, ...], [...] ] } ``` **Respuesta:** ```json { "results": [ {"class_id": 7, "class_name": "Sneaker", "confidence": 0.94}, {"class_id": 1, "class_name": "Trouser", "confidence": 0.88} ], "count": 2, "inference_ms": 25.1 } ``` --- ## Clases Fashion-MNIST | ID | Nombre | |----|--------------| | 0 | T-shirt/top | | 1 | Trouser | | 2 | Pullover | | 3 | Dress | | 4 | Coat | | 5 | Sandal | | 6 | Shirt | | 7 | Sneaker | | 8 | Bag | | 9 | Ankle boot | --- ## Notas técnicas - Split **80 % entrenamiento / 20 % prueba** sobre 30 000 muestras estratificadas. - **PCA** conserva el 95 % de la varianza (~180-200 componentes). - **GridSearchCV** con `C ∈ {10, 50}`, `gamma ∈ {0.001, 0.01}`, kernel `rbf`, cv=3. - `SVC(probability=True)` habilita scores de confianza por clase.