jesuszambrano13's picture
Upload 158 files
84ec0e0 verified
|
Raw
History Blame Contribute Delete
5.17 kB
# Datasets para YouTube Boost AI
Este documento explica los datasets reales que actualmente entrenan el modelo y cómo agregar más en el futuro.
## 1. Datasets actualmente integrados
`data/raw/` contiene **dos datasets reales** de Kaggle:
### 1.1 `daily_trending_videos.csv`
- **Origen:** scrap diario de YouTube Trending por región.
- **Tamaño:** ~100 MB, **674.141 filas** crudas.
- **Cobertura:** 92 países, periodo 2025-01 → 2025-07.
- **Columnas:** `video_id, title, channel, country, views, likes, comments, published_at, fetch_date`.
- **Limitaciones:** sin `description`, sin `tags`, sin `category_id`, sin `duration_seconds`. Cada `video_id` se repite varias veces (uno por día en trending).
### 1.2 `youtube_trending_in_kaggle_datasnaek_2017_2018.csv`
- **Origen:** Kaggle `datasnaek/youtube-new` (Trending YouTube Video Statistics).
- **Tamaño:** ~67 MB, **37.352 filas** crudas.
- **Cobertura:** India (sólo región IN), periodo 2017-2018.
- **Columnas:** `video_id, title, description, tags, category_id, views, likes, dislikes, comments, published_at, region, country, ...`.
- **Limitaciones:** `duration_seconds=0` siempre (la fuente no la trae); duplicados por `video_id` para apariciones diarias.
## 2. Pipeline de ingesta
Cuando ejecutas `python -m src.train`:
1. **Carga** ambos CSV concatenados → 711.493 filas crudas.
2. **Normaliza** columnas con `src.features.normalize_training_dataframe` (vectorizado, ~20s).
3. **Deduplica** por `video_id`, **quedándose con la fila de máximo views** → 68.526 filas únicas.
4. **Etiqueta** `boost_candidate` por percentil 70 del `organic_performance_score`.
5. Guarda dataset procesado en `data/processed/youtube_training_dataset.csv`.
6. Genera `outputs/eda_summary.{md,json}` con estadísticas reales del corpus.
7. Entrena 3-4 modelos (HGB es opt-in con `ENABLE_HGB=1`).
8. Persiste el mejor en `models/best_model.joblib` y metadata en `models/model_metadata.json` con `"dataset_kind": "real_kaggle"`.
## 3. Verificación
Después de entrenar:
```bash
# Confirmar origen real
python -c "import json; print(json.load(open('models/model_metadata.json'))['dataset_kind'])"
# → real_kaggle
# Ver EDA generado
head -30 outputs/eda_summary.md
```
## 4. Métricas obtenidas
Con percentil del target = 0.70 (clase positiva ≈ 30%):
| Modelo | F1 | ROC-AUC | Recall | Precision |
|---|---|---|---|---|
| LogisticRegression (best) | 0.521 | 0.733 | 0.567 | 0.482 |
| RandomForest | 0.472 | 0.744 | 0.378 | 0.628 |
| LinearSVC calibrado | 0.425 | 0.735 | 0.301 | 0.722 |
| HistGradientBoosting | 0.390 | 0.755 | 0.255 | 0.826 |
> **Nota metodológica importante:** estas métricas son **honestas** porque el set de features de entrenamiento **excluye deliberadamente** las variables que componen el target (`engagement_rate`, `views_per_day`, `text_power_score`, etc.). Sin esta exclusión el modelo tendría F1 ≈ 0.99, pero solo estaría memorizando su propia etiqueta. Ver sección "Anti-leakage" en `docs/ANALISIS_METODOLOGICO.md`.
## 5. Sesgo de selección a declarar en defensa
Ambos datasets contienen únicamente videos que **estuvieron en trending**. El modelo aprende a distinguir "muy buenos" del resto, no "buenos" de "malos". Implicaciones:
- Las probabilidades del modelo tienden a ser altas incluso para inputs débiles.
- La regla del recomendador (`ajustar antes de impulsar` cuando faltan señales) compensa esta tendencia.
- Para una versión sin sesgo se necesitaría una muestra aleatoria de YouTube (no disponible públicamente).
## 6. Cómo agregar más datasets
Cualquier CSV agregado a `data/raw/` se ingiere automáticamente. Las columnas reconocidas (con autorenombrado):
| Columna canónica | Variantes aceptadas |
|---|---|
| `views` | `view_count`, `views_count` |
| `likes` | `like_count`, `likes_count` |
| `comments` | `comment_count`, `comments_count` |
| `published_at` | `publishedAt`, `publish_time` |
| `category_id` | `categoryId` |
| `channel_title` | `channelTitle`, `channel` |
Si tu CSV usa otros nombres, agrégalos al diccionario `rename_candidates` en `src/features.py::normalize_training_dataframe`.
### Datasets adicionales recomendados
| Slug Kaggle | Contenido | Tamaño |
|---|---|---|
| `rsrishav/youtube-trending-video-dataset` | Trending diario, 10+ regiones | ~150 MB |
| `nelgiriyewithana/global-youtube-statistics-2023` | Estadísticas globales de canales top | ~1 MB |
Para descargar automáticamente con credenciales Kaggle:
```bash
pip install kaggle
mkdir -p ~/.kaggle && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json
python scripts/download_kaggle_datasets.py
python -m src.train
```
## 7. Subset rápido para iterar
Si quieres entrenar más rápido sobre un subset (estratificado por clase):
```bash
MAX_TRAIN_ROWS=10000 python -m src.train
```
## 8. Cuándo regenerar el modelo
- Tras agregar un nuevo CSV a `data/raw/`.
- Tras modificar `NUMERIC_COLS`, `CATEGORICAL_COLS` o `TEXT_COL` en `src/train.py`.
- Tras modificar la lógica de `normalize_training_dataframe` en `src/features.py`.
- Tras modificar la fórmula de `organic_performance_score` en `create_boost_candidate_target`.