Attuned Resonance Outcome Predictor β€” Multi-Head LSTM

The GitHub repo slug is still "CEPM" during the gradual rename; the Hugging Face slugs were migrated to attuned-resonance-* on 2026-05-09 (HF preserves the old cepm-* URLs as redirects).

Given an intake record (including voice-tone emotion probabilities), an advisor profile, and the advisor's recent call history, forecasts three call outcomes: handle time, first-contact resolution (FCR) probability, and CSAT. Designed to be composed downstream of the intake model and voice-tone classifier, and upstream of the PPO router.

Research/educational use only. See disclaimer below.

Architecture

intake_features  (17-dim)   ┐
  └─ 7 scalar features       β”‚
  └─ 10-dim tone_probs       β”œβ”€β”€β–Ά  concat ──▢  MLP fusion (64-dim) ─┬─▢ handle_time  (regression, Γ—1800s)
advisor_features (14-dim)   β”‚                                        β”œβ”€β–Ά fcr          (sigmoid)
advisor_history  (30 Γ— 6)   β”˜                                        └─▢ csat         (regression, 1–5)
                                   LSTM encoder
                                   (30-step history β†’ 64-dim hidden)

The 7 scalar intake features are: intent_idx, sentiment, urgency, complexity, jung_idx, campbell_idx, archetype_confidence β€” each normalized to [0, 1].

The 10-dim tone_probs vector is the softmax output of the voice-tone classifier over the emotion classes [angry, frustrated, sad, calm, anxious, satisfied, confused, neutral, urgent, hopeful]. At data-generation time this is Dirichlet-sampled (Ξ± biased by sentiment/urgency); at real inference it comes from VoiceToneClassifier.predict(audio_clip).probs.

Small model (~130k parameters). The LSTM encodes the advisor's last 30 calls as a temporal sequence; its final hidden state is concatenated with the fused intake+advisor features, then fed to three per-task heads.

Training

  • Data: synthetic data pipeline β€” 56,693 calls Γ— 500 advisors Γ— 30 days
  • Intake features: 17-dim β€” 7 normalized scalars + 10-dim Dirichlet-sampled voice-tone probability vector (cascade integration, 2026-05)
  • Optimizer: Adam, batch size 256
  • Epochs: 13 (early stop, patience=5)
  • Hardware: CPU
  • Tracked: MLflow experiment prod-predictor

Metrics (best checkpoint)

  • best_val_loss: 0.6353 (sum of handle-time MSE + FCR BCE + CSAT MSE)
  • train_loss: 0.6333 β€” minimal train/val gap, no overfitting

Cascade Position

audio ──▢ VoiceToneClassifier ──▢ tone_probs (10-dim)
                                        β”‚
transcript ──▢ IntakePredictor ──▢ intent, sentiment, urgency, ...
                                        β”‚
                              concat (17-dim) ──▢ OutcomeEstimator ──▢ handle_time, FCR, CSAT
                                                         β”‚
                                              advisor profile + history

Intended Use

  • Research on multi-task tabular+sequence regression
  • Educational demonstrations of cascade feature composition (audio β†’ NLP β†’ outcome)
  • Benchmarking against the synthetic-data environment in this repo

Out of Scope / Not Intended

  • Any production or commercial use. Not validated for operational deployment.
  • Real-world outcome prediction. Trained on synthetic data with known distributional simplifications.
  • High-stakes decision support.

Limitations

  • Synthetic data only β€” no real outcome distributions. The model learns the generator's biases.
  • Short history dependence β€” only the last 30 advisor calls are visible.
  • Feature encoding must match training. The 17-dim intake vector uses a specific normalization scheme (see models/predictor/dataset.py::_encode_intake). Mismatched encoding produces silently wrong predictions.
  • Tone probs are synthetic at training time. The Dirichlet draw approximates real classifier output but doesn't capture true audio-derived distributions. Will improve once real audio is available end-to-end.
  • Router integration pending. The PPO router will consume this predictor's outputs as part of its reward signal.

How to Load

import numpy as np
from models.predictor.inference import OutcomeEstimator
from pathlib import Path

estimator = OutcomeEstimator(
    model_path=Path("trained_models/predictor/model.pt"),
    device="cpu",
)

# 17-dim intake: 7 scalars + 10-dim tone_probs from VoiceToneClassifier
intake_features  = np.array([...], dtype=np.float32)  # shape (17,)
advisor_features = np.array([...], dtype=np.float32)  # shape (14,)
advisor_history  = np.array([...], dtype=np.float32)  # shape (30, 6)

outcome = estimator.predict(intake_features, advisor_features, advisor_history)
# {'handle_time_seconds': 1185.0, 'fcr_probability': 0.48, 'csat_predicted': 3.69}

Full pipeline code at tedrubin80/CEPM.

License

CC-BY-NC-4.0. Non-commercial use only. Attribution required.

Citation

@software{attuned_resonance_predictor_2026,
  author = {Rubin, Ted},
  title = {Attuned Resonance Outcome Predictor: Multi-Head LSTM for Call Outcome Forecasting},
  year = {2026},
  url = {https://github.com/tedrubin80/CEPM}
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support