HackUPC / Smadex challenge. Explains why some mobile ad creatives perform better than others, detects fatigue, and recommends next actions — powered by a LightGBM v4 scorer and SHAP explainability pipeline.
cd src/frontend
npm install # first time only
npm run dev # starts at http://localhost:5173uv sync # install deps (first time)
uv run uvicorn src.backend.main:app --reload # starts at http://localhost:8000API docs available at http://localhost:8000/docs once running.
uv sync # install Python deps
jupyter lab # open notebooks/Notebooks run in order:
01_eda.ipynb— exploratory analysis02_model_scorer.ipynb— LightGBM v1/v204_multimodal_features.ipynb— v3/v4 scorer + SHAP + advantage function
| Route | Screen |
|---|---|
/ |
Advertiser Selector |
#/advertiser/:id |
Portfolio Overview |
#/campaigns/:id |
Campaign View |
#/campaigns/:id/fatigue |
Fatigue Detector |
#/campaigns/:id/recommendations |
Recommendations |
#/advertiser/:id/reviewer |
Creative Reviewer |
#/advertiser/:id/chat |
Copilot Chat |
- Frontend: React 18, Vite 5, Plotly.js (basic bundle)
- Modeling: LightGBM, SHAP, scikit-learn
- Data: 1,080 synthetic creatives across 36 advertisers and 180 campaigns