import gradio as gr import joblib import numpy as np import pandas as pd import plotly.graph_objects as go # ----------------------------- # Load trained model # ----------------------------- MODEL_PATH = "models/influencer_roi_model.joblib" model = joblib.load(MODEL_PATH) # IMPORTANT: These must match the training feature columns (X.columns) # We'll load them from a saved list if you created one. # If you didn't save feature names yet, do Step 2.1 below. FEATURES_PATH = "models/feature_columns.joblib" feature_columns = joblib.load(FEATURES_PATH) # ----------------------------- # Helper: create input row # ----------------------------- def build_input_row(platform, influencer_category, campaign_type, engagements, estimated_reach, campaign_duration_days, assumed_cost_usd): """ Converts UI inputs into a single-row DataFrame with exact feature columns. We one-hot encode platform/category/type to match training. """ # Base numeric features base = { "engagements": engagements, "estimated_reach": estimated_reach, "campaign_duration_days": campaign_duration_days, } # Build a raw dataframe with the same pre-encoded columns you had before encoding: raw = pd.DataFrame([{ **base, "platform": platform, "influencer_category": influencer_category, "campaign_type": campaign_type }]) # One-hot encode like training (drop_first=True) encoded = pd.get_dummies( raw, columns=["platform", "influencer_category", "campaign_type"], drop_first=True ) # Align to training columns (missing columns -> 0, extra -> drop) for col in feature_columns: if col not in encoded.columns: encoded[col] = 0 encoded = encoded[feature_columns] return encoded # ----------------------------- # Main prediction function # ----------------------------- def predict_sales_and_roi(platform, influencer_category, campaign_type, engagements, estimated_reach, campaign_duration_days, assumed_cost_usd): """ Predict product_sales and compute an *estimated ROI* using user-provided cost. ROI = (Predicted Sales - Cost) / Cost """ # Guard against zero/negative cost if assumed_cost_usd <= 0: return "⚠️ Please enter a campaign cost greater than 0.", None X_input = build_input_row( platform, influencer_category, campaign_type, engagements, estimated_reach, campaign_duration_days, assumed_cost_usd ) # Predict sales pred_sales = float(model.predict(X_input)[0]) # Compute ROI (as %) roi = (pred_sales - assumed_cost_usd) / assumed_cost_usd roi_percent = roi * 100.0 # Label ROI quality if roi_percent >= 50: roi_label = "🟢 Strong ROI" elif roi_percent >= 0: roi_label = "🟡 Moderate ROI" else: roi_label = "🔴 Negative ROI" # Build Plotly chart: Cost vs Predicted Sales fig = go.Figure() fig.add_bar(name="Campaign Cost", x=["Campaign"], y=[assumed_cost_usd]) fig.add_bar(name="Predicted Sales", x=["Campaign"], y=[pred_sales]) fig.update_layout( barmode="group", title="Spend vs Predicted Return", xaxis_title="", yaxis_title="USD", height=420 ) # Suggestions (simple, user-friendly) tips = [] if engagements < 2000: tips.append("Increase engagement (better content hook, CTA, posting time).") if estimated_reach < 10000: tips.append("Improve reach (cross-post, collab posts, hashtags, boosted content).") if campaign_duration_days < 7: tips.append("Consider longer campaigns (more touchpoints often improves conversions).") if not tips: tips_text = "Your inputs look strong. Focus on creative quality + audience match." else: tips_text = " • " + "\n • ".join(tips) result_md = f""" # 📈 Influencer ROI Prediction ### Predicted Financial Return - **Predicted Product Sales:** `${pred_sales:,.2f}` - **Campaign Cost:** `${assumed_cost_usd:,.2f}` - **Estimated ROI:** **{roi_percent:,.2f}%** — {roi_label} ### What this means This prediction helps brands estimate whether a campaign is likely to be profitable **before spending money**. ### Suggestions to improve ROI {tips_text} """ return result_md, fig # ----------------------------- # UI (modern dashboard feel) # ----------------------------- with gr.Blocks(title="Influencer ROI Prediction Dashboard") as app: with gr.Tab("Home"): gr.Markdown(""" # ✨ Influencer ROI Prediction Dashboard This app predicts **financial return (product sales)** from influencer campaign inputs using **Regression ML**. ### Why it matters Marketing teams can use this to: - Compare influencer platforms (Instagram vs TikTok vs YouTube) - Estimate sales impact before launching a campaign - Run **what-if scenarios** (change budget, duration, engagement) ➡️ Go to the **Predict** tab to try it. """) with gr.Tab("Predict"): gr.Markdown("## 🧠 Predict Sales + Estimated ROI") with gr.Row(): with gr.Column(scale=2): platform = gr.Dropdown( choices=["Instagram", "YouTube", "TikTok", "Twitter", "Facebook"], value="Instagram", label="Platform" ) influencer_category = gr.Dropdown( choices=["Micro", "Macro", "Mega", "Nano"], value="Micro", label="Influencer Category" ) campaign_type = gr.Dropdown( choices=["Product Launch", "Brand Awareness", "Seasonal Promo", "Giveaway", "Affiliate"], value="Brand Awareness", label="Campaign Type" ) engagements = gr.Number(value=5000, label="Engagements (likes/comments/etc.)") estimated_reach = gr.Number(value=50000, label="Estimated Reach") campaign_duration_days = gr.Slider(1, 60, value=14, step=1, label="Campaign Duration (days)") assumed_cost_usd = gr.Number(value=1000, label="Campaign Cost (USD)") predict_btn = gr.Button("🚀 Predict ROI", variant="primary") with gr.Column(scale=3): output_md = gr.Markdown() output_plot = gr.Plot() predict_btn.click( fn=predict_sales_and_roi, inputs=[platform, influencer_category, campaign_type, engagements, estimated_reach, campaign_duration_days, assumed_cost_usd], outputs=[output_md, output_plot] ) if __name__ == "__main__": app.launch()