Files
Machine_Learning_Aplicado/proyecto-final
..
2026-06-24 07:43:49 +00:00
2026-06-24 07:43:49 +00:00
2026-06-24 07:43:49 +00:00
2026-06-24 07:43:49 +00:00

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

  1. 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).

  2. 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.

  3. Diagnóstico: Los cuatro modelos quedaron bien ajustados. La NN tuvo el menor Δ (0.0161), lo que indica muy buena generalización sin overfitting.

  4. 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).

  5. Aprendizaje clave: La Red Neuronal (Keras) con StandardScaler superó 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.