--- library_name: skops license: mit pipeline_tag: tabular-regression tags: - scikit-learn - tabular-regression - engagement-prediction - viralst - poc model-index: - name: raviearjun/engagement-predictor results: - task: type: tabular-regression dataset: name: viralst-engagement-synthetic-poc type: synthetic-poc metrics: - type: mean_absolute_error value: 0.01142 - type: root_mean_squared_error value: 0.01458 - type: r_squared value: 0.71023 --- # engagement-predictor A regression model (`scikit-learn` `Ridge` inside a `Pipeline`) that predicts `engagement_score` for brand-creator campaign content, part of the **Viralst** application. ## Overview Given campaign brief attributes (tone, hook type, target audience, creator tier, objective, etc. — typically extracted from a brief document via an LLM parser) and planned content execution details (duration, upload time, caption), the model predicts the expected `engagement_score` (`(likes + comments + shares) / views`). It is served through the `POST /engagement/predict` endpoint of the Viralst `ai/` service. ## Training data and methodology The model is trained on a **synthetically generated dataset** (2,000 rows, 300 unique briefs, 30 unique brands) produced by `training/generate_poc_data.py`. Feature-to-target relationships were deliberately encoded (with variable noise per row) so the training pipeline — feature engineering, model selection, evaluation, and serving — could be validated end-to-end ahead of onboarding real campaign data. Results below characterize how well the model recovers the encoded synthetic relationships, not real-world campaign performance. ## Training procedure - Model: `sklearn.linear_model.Ridge` inside a `Pipeline` (`OneHotEncoder` for single-value categorical features, `StandardScaler` for numeric and multi-hot features). - Alpha selected via grid search using `GroupKFold` (grouped by `brief_id`), so evaluation reflects generalization to unseen briefs rather than leaking the same brief across train/test folds. - Serialized with `skops.io.dump` (not raw pickle) for safer loading. ## Evaluation results ``` { "alpha": 10.0, "n_rows": 2000, "n_groups": 300, "cv_mae": 0.011419824566734465, "cv_rmse": 0.01458130687031906, "cv_r2": 0.7102257580449983, "baseline_mae": 0.021489796999999998, "baseline_rmse": 0.027087352583401354 } ``` Mean-predictor baseline RMSE: `0.027087352583401354`. The final model outperforms this baseline by a wide margin on the synthetic dataset described above. ## Feature schema See `config.json` in this repo for the full list and order of feature columns the model expects. The canonical definition lives in `src/engagement_predictor/features.py` in the application repository (https://github.com//viralst). ## Training dataset The raw synthetic dataset used to train this model is included in this repo under `dataset/` (`brands.csv`, `briefs.csv`, `contents.csv` — 30 brands, 300 briefs, 2000 content rows). It was generated by `training/generate_poc_data.py`; see "Training data and methodology" above for why it is synthetic and what it does and does not represent. ## How to use ```python import pandas as pd import skops.io as sio from huggingface_hub import hf_hub_download path = hf_hub_download(repo_id="raviearjun/engagement-predictor", filename="engagement_ridge.skops") untrusted = sio.get_untrusted_types(file=path) model = sio.load(path, trusted=untrusted) # X must be a DataFrame with columns matching config.json -> feature_columns prediction = model.predict(X) ``` ## Limitations - Trained on synthetic data; does not reflect real-world engagement distributions, platform trends, or actual creator/audience behavior. - Feature quality depends on upstream LLM extraction from brief documents; prediction quality degrades if that extraction is inaccurate or incomplete. - Not yet validated against real campaign data from brands outside the training set. ## Reproducibility Training environment (see `requirements.txt` in this repo for exact pins): ``` scikit-learn==1.7.2 skops==0.14.0 numpy==1.26.4 pandas==2.3.3 ```