Segment and temporal monitoring

Monitoring functions reuse the same validated evaluation pipeline as portfolio reports. They do not redefine metrics or create a monitoring score.

Portfolio segments

evaluate_by_segment() returns an EvaluationResult for every segment meeting min_observations. compare_by_segment() repeats an aligned multi-model comparison within each segment. Missing or empty labels are rejected; labels that would collide after string normalization are also rejected.

Small segments are recorded in skipped_segments. They are not silently folded into another group. Statistical credibility remains the caller's responsibility.

Temporal validation

evaluate_over_time() treats labels as ordered strings, sorts them, and reports each metric's signed change from the first retained period. ISO dates and lexically ordered labels such as 2026-Q1 satisfy the ordering contract.

Changes are descriptive. A positive change may be favorable, unfavorable, or neither depending on the metric's direction or target.

Prediction drift

prediction_drift() constructs fixed cut points from weighted reference-score quantiles. It reports:

  • population stability index (PSI);
  • each bin's reference/current portfolio share and PSI contribution;
  • absolute and relative mean-prediction shifts.

Zero bin shares are clipped only inside the logarithm calculation using the recorded epsilon. Reported portfolio shares remain unmodified.

PSI has no universal significance or action threshold. ActEval deliberately does not label a value as acceptable, moderate, or severe. Operational limits should be calibrated to the portfolio, score behavior, governance policy, and cost of action.