curl --request GET \
--url https://api.example.com/monitoring/drift{
"samples_observed": 123,
"drift_score_max_abs_z": 123,
"drifted_features": [
{}
],
"predicted_positive_rate": 123,
"training_positive_rate": 123,
"should_retrain": true,
"reason": "<string>",
"recommended_action": "<string>"
}curl --request GET \
--url https://api.example.com/monitoring/drift{
"samples_observed": 123,
"drift_score_max_abs_z": 123,
"drifted_features": [
{}
],
"predicted_positive_rate": 123,
"training_positive_rate": 123,
"should_retrain": true,
"reason": "<string>",
"recommended_action": "<string>"
}Documentation Index
Fetch the complete documentation index at: https://mintlify.com/RaviTejaMedarametla/Data-Science-AI-Portfolio/llms.txt
Use this file to discover all available pages before exploring further.
GET /monitoring/drift
GET /monitoring/retraining_trigger
/monitoring/retraining_trigger path is an alias for semantic clarity in retraining workflows.
baseline_not_loaded - Drift baseline file missingno_predictions_observed - No predictions made yetinsufficient_samples - Need more samples for reliable drift detectionbelow_threshold - No significant drift detectedfeature_distribution_drift - Features have drifted significantlyprediction_rate_shift - Prediction rate has changed significantlyrun_training_to_generate_baseline - Run training pipeline to create baselinecollect_inference_samples - Continue collecting prediction datacollect_more_samples - Need more data for drift analysiscontinue_monitoring - Keep monitoring, no action neededtrigger_retraining_pipeline - Initiate model retrainingcurl -X GET "http://localhost:8000/monitoring/drift" \
-H "accept: application/json"
{
"samples_observed": 1247,
"drift_score_max_abs_z": 1.8342,
"drifted_features": [],
"predicted_positive_rate": 0.3456,
"training_positive_rate": 0.3512,
"should_retrain": false,
"reason": "below_threshold",
"recommended_action": "continue_monitoring"
}
{
"samples_observed": 2834,
"drift_score_max_abs_z": 4.2187,
"drifted_features": [
"minutes_watched",
"practice_exams_started"
],
"predicted_positive_rate": 0.2891,
"training_positive_rate": 0.3512,
"should_retrain": true,
"reason": "feature_distribution_drift",
"recommended_action": "trigger_retraining_pipeline"
}
{
"samples_observed": 1523,
"drift_score_max_abs_z": 2.1456,
"drifted_features": [],
"predicted_positive_rate": 0.4789,
"training_positive_rate": 0.3512,
"should_retrain": true,
"reason": "prediction_rate_shift",
"recommended_action": "trigger_retraining_pipeline"
}
{
"samples_observed": 42,
"drift_score_max_abs_z": 2.8921,
"drifted_features": ["courses_started"],
"predicted_positive_rate": 0.4286,
"training_positive_rate": 0.3512,
"should_retrain": false,
"reason": "insufficient_samples",
"recommended_action": "collect_more_samples"
}
{
"samples_observed": 0,
"drift_score_max_abs_z": 0.0,
"drifted_features": [],
"predicted_positive_rate": 0.0,
"training_positive_rate": 0.0,
"should_retrain": false,
"reason": "baseline_not_loaded",
"recommended_action": "run_training_to_generate_baseline"
}
src/api.py:300-302
Response Model: DriftStatusResponse (src/api.py:56-64)
class DriftStatusResponse(BaseModel):
samples_observed: int
drift_score_max_abs_z: float
drifted_features: List[str]
predicted_positive_rate: float
training_positive_rate: float
should_retrain: bool
reason: str
recommended_action: str
_compute_drift_status() (src/api.py:91-172)
config.yaml under the monitoring section:
monitoring:
drift_min_samples: 100 # Minimum samples needed for drift analysis
drift_zscore_threshold: 3.0 # Z-score threshold for feature drift
drift_min_features: 2 # Minimum drifted features to trigger retraining
class_rate_shift_threshold: 0.10 # Prediction rate shift threshold (10%)
(current_mean - baseline_mean) / baseline_std|z-score| >= drift_zscore_thresholddrifted_features.count >= drift_min_features|predicted_rate - training_rate| >= class_rate_shift_thresholddrift_min_samples before analyzing drift_LOCK) to ensure atomic updates:
src/train.py):
artifacts/drift_baseline.jsonartifacts.drift_baseline_fileartifacts/drift_baseline.json
import requests
import time
while True:
response = requests.get("http://api:8000/monitoring/drift")
status = response.json()
if status["should_retrain"]:
print(f"Drift detected: {status['reason']}")
print(f"Action: {status['recommended_action']}")
# Trigger retraining pipeline
trigger_training_job()
time.sleep(86400) # Check daily
else:
time.sleep(3600) # Check hourly
drift_score_max_abs_zshould_retrain flag alertsdrift_zscore_threshold and class_rate_shift_threshold based on your model’s stability