Clasificador Multiclase — Dry Bean Dataset
Curso: Fundamentos de Machine Learning
Nombre: Alejandro Lembke Barrientos | Carné: 12002840
Dataset: Dry Bean Dataset (UCI ID 602) — 7 clases, 16 features morfológicas, 13,611 instancias
Repo: https://gitea.p-lao.com/aleleba/Machine_Learning_Aplicado
Objetivo
Clasificar automáticamente variedades de frijol seco (BARBUNYA, BOMBAY, CALI, DERMASON, HOROZ, SEKER, SIRA) a partir de 16 medidas morfológicas extraídas de imágenes. El problema replica un sistema de control de calidad agrícola automatizado.
Se comparan tres familias de modelos (Random Forest, XGBoost, Red Neuronal) con ≥5 experimentos cada una, y se construye un ensamble por majority voting con bootstrap.
Setup
pip install -r requirements.txt
El dataset se descarga automáticamente desde UCI vía ucimlrepo — no requiere ningún archivo local.
Estructura
proyecto-final/
├── dry_bean_classifier.ipynb # único notebook entregable
├── outputs/
│ ├── bitacora_experimentos.csv # log append de todos los experimentos
│ └── figures/ # gráficas de feature importance
├── src/
│ └── utils.py # metricas(), registrar(), plot_importancia()
└── requirements.txt
Secciones del Notebook
| # | Sección | Descripción |
|---|---|---|
| 1 | Setup & Imports | Librerías, RANDOM_STATE = 42, fetch_ucirepo |
| 2 | Carga y Exploración | fetch_ucirepo(id=602), distribución de clases, estadísticas |
| 3 | Preparación de Datos | Split 80/20 estratificado + StandardScaler para la NN |
| 4 | Bitácora — Funciones | metricas() y registrar() (helpers en src/utils.py) |
| 5 | Experimentos — Random Forest | ≥5 experimentos variando n_estimators, max_depth, min_samples_leaf, max_features, criterion |
| 6 | Experimentos — XGBoost | ≥5 experimentos variando n_estimators, max_depth, learning_rate, subsample, colsample_bytree, reg_lambda |
| 7 | Experimentos — Red Neuronal (Keras) | ≥5 experimentos variando capas, neuronas, dropout, lr, batch_size, epochs |
| 8 | Feature Importance | mejor_rf vs mejor_xgb — barplots + comparación de rankings |
| 9 | Ensamble | Majority voting + bootstrap; NN usa features escaladas |
| 10 | Tabla Comparativa | F1 train/test de los 4 modelos + Δ + diagnóstico |
| 11 | Conclusiones | Resumen automático basado en resultados reales |
Archivos del Proyecto
| Archivo | Descripción |
|---|---|
| dry_bean_classifier.ipynb | Notebook principal con todo el código |
| outputs/bitacora_experimentos.csv | Bitácora de todos los experimentos (append) |
| outputs/figures/feature_importance__random_forest.png | Feature importance — Random Forest |
| outputs/figures/feature_importance__xgboost.png | Feature importance — XGBoost |
| src/utils.py | Helpers: metricas(), registrar(), plot_importancia() |
| requirements.txt | Dependencias del proyecto |
Tabla Comparativa Final
| Modelo | F1 train | F1 test | Δ | Diagnóstico |
|---|---|---|---|---|
| Random Forest | 0.9739 | 0.9280 | 0.0459 | Bien ajustado |
| XGBoost | 0.9779 | 0.9327 | 0.0452 | Bien ajustado |
| Red Neuronal (Keras) | 0.9565 | 0.9404 | 0.0161 | Bien ajustado |
| Ensamble (majority voting) | 0.9754 | 0.9361 | 0.0393 | Bien ajustado |
Mejor modelo individual: Red Neuronal (Keras) con F1 test = 0.9404
Conclusiones
-
Mejor modelo: La Red Neuronal (Keras + StandardScaler) obtuvo el mayor F1 en test (0.9404), superando a XGBoost (0.9327) y Random Forest (0.9280).
-
Ensamble: El majority voting con bootstrap obtuvo F1 test = 0.9361, sin superar al mejor modelo individual (Δ = 0.0043). Los tres modelos votaron de forma coherente en la mayoría de casos.
-
Diagnóstico: Los cuatro modelos quedaron bien ajustados. La NN tuvo el menor Δ (0.0161), lo que indica muy buena generalización sin overfitting.
-
Feature Importance: ShapeFactor3 fue la feature más importante para RF y XGBoost. ShapeFactor4, Solidity y Extent coincidieron como las menos relevantes. Mayor discrepancia en Perimeter (RF rank 2 vs XGB rank 9).
-
Aprendizaje clave: La Red Neuronal (Keras) con
StandardScalersuperó a los modelos basados en árboles cuando las features están correctamente escaladas. El escalado es crítico para el desempeño de redes neuronales con datos de magnitudes muy distintas.