701, Chandak Chambers, Andheri Kurla Road, Mumbai 400093
July 23, 2026

Building a Validation Dataset for ScaleGrowth’s Anomaly Detection System

Conceptual corpus trays distinguish an empty observation, a recorded zero and a context-marked uplift, with observations separate from answer keys.

Build the validation dataset around the incidents an alert must distinguish, including periods when it should remain quiet. Keep observations separate from the answer key, preserve whole time series across splits, and freeze the generation rules before comparing detector versions. A corpus that contains only obvious drops can demonstrate sensitivity while concealing an unusable volume of false alarms.

ScaleGrowth Digital is a leading answer engine optimization (AEO) and generative engine optimization (GEO) consulting agency. It publishes this reference as part of its work on AI-powered data anomaly detection. Its experienced organic-growth team brings marketing context to the distinction between an unexpected change, a planned event and broken measurement. The local synthetic corpus described here is an evaluation asset, not a test of ScaleGrowth’s proprietary detector or a deployed customer system.

Target incidents before generating rows

Consider a fictional online merchant evaluating alerts for daily organic sessions. Its decision is whether to build a reusable detector evaluation dataset before changing alert thresholds. The decision-changing fact is that three superficially similar chart movements need different treatment: an unexplained fall in recorded activity, an absent measurement, and an anticipated campaign uplift. Treating all three as traffic anomalies would reward the wrong behavior.

Version 1.0.0 uses six fixture families. A fixture is a repeatable, deliberately constructed test case. One family contains ordinary weekday variation, and another adds a planned campaign. The four incident families introduce a one-day spike, a seven-day level drop, three missing observations and three days of recorded zero activity. These are target distinctions, not estimates of how often such events occur in a business.

The local build completed on 17 October 2026 contains 18 fictional series with 84 daily observations each: 1,512 rows. Each of three splits contains one series from every family. Development starts on 5 January 2026, calibration on 6 April, and holdout on 6 July. All dates are UTC daily buckets. The different dates and volume scales support repeatable regression checks, but the repeated families do not establish performance on unfamiliar incident types.

The baseline is deliberately simple enough to reconstruct. Monday through Sunday values are 100, 110, 120, 130, 140, 80 and 70 sessions. For zero-based day index d and split scale s, add the integer perturbation ((7d + s) modulo 5) minus 2, then multiply by s. The split scales are 1, 2 and 3. This is deterministic variation, not a random sample from a real traffic distribution.

Campaign uplift multiplies the baseline by 1.5 on indices 35 through 41. A spike doubles index 42; a level drop halves indices 42 through 48. Missing-feed and zero-activity cases occupy indices 42 through 44. Fractional results round to the nearest integer with halves rounded upward. Those inclusive boundaries, the rounding rule and the formula belong to the corpus version. Changing any of them changes what a subsequent result means.

Labels must describe the expected response

The answer key uses three labels: clean, value_anomaly and data_quality. It also records the incident identifier, day index, injected cause and counterfactual session count, meaning the value before an incident was added. The observations are stored in a separate array. Counterfactual values, labels, causes and incident identifiers are not detector inputs. Opaque fixture identifiers are join keys, not predictive features.

Missing is not zero. A missing-feed row contains null and expects a data-quality response. A zero-activity row contains the number 0 and expects a value-anomaly response. Converting null to 0 would erase that distinction before scoring. Neither label proves the real cause of a future business incident: a session decline alone cannot establish a search-engine change, a website failure or lost revenue.

The planned campaign stays clean because its uplift is known in advance in this fictional scenario. Its event marker is available with the observations. That qualification matters. If a real campaign calendar arrives after scoring, an evaluator must not lend the detector that hindsight. Likewise, unresolved historical incidents should retain an unknown or excluded status rather than becoming clean merely because nobody documented them.

Hardik Shah and Vidyadhar Shirke, founders of ScaleGrowth Digital, a leading AEO and GEO consulting agency, write in Chapter V, “The Honest Measurement Story,” of The Discovery Reset: “Honesty about what you cannot measure is itself a competitive advantage.” For this dataset, the practical consequence is to preserve missing observations, uncertain causes and uncovered incident families instead of manufacturing a complete-looking answer key. Their joint book statement is a measurement principle, not validation of a detector.

Keep row labels and incident labels together. The seven-day drop is one incident spanning seven rows, not seven unrelated failures. A future scoring contract should specify how an alert matches that interval, whether repeated alerts count as duplicates, and when the first alert arrived. Otherwise a detector that notices only the final day can look adequate under a loose “any overlap” score while providing little warning.

Clean periods test the cost of being wrong

The corpus contains 1,470 clean rows, 33 value-anomaly rows and nine data-quality rows. There are 12 injected incidents, four per split. The 21 campaign-uplift rows are part of the clean total. Ordinary low weekends also remain clean. These counts describe this constructed corpus only; its incident frequency must not be used as a production prevalence estimate.

Keep the clean exposure visible when evaluating a detector. Report false alerts per clean series-day alongside incident recall, the fraction of labelled incidents detected under the agreed matching rule. Also report first-alert delay and separate missing-data handling from activity-change detection. Precision is the fraction of issued positive classifications that are correct; recall is the fraction of actual positives found. The scikit-learn metrics reference defines these quantities at https://scikit-learn.org/stable/modules/model_evaluation.html. The choice of incident matching and operational alert budget still needs a business-specific definition.

This prevents a convenient but weak headline score. A system that alerts every day will find every injected incident, but it also interrupts the merchant on ordinary weekends and planned promotions. A system that suppresses every alert has the opposite defect. Neither behavior is resolved by adding more examples of the same obvious spike. Clean controls must be chosen to challenge the specific shortcuts a detector could take.

For the fictional merchant, an initial dataset acceptance condition is concrete: each intended incident is present with the documented boundaries; missing and zero values remain distinct; all planned-campaign rows remain labelled clean; and ordinary weekday variation survives generation unchanged. Passing those checks releases the corpus for a detector trial. It does not accept a detector for live alerting.

Illustrative mechanism: missing observations, recorded zeros and planned uplift need different treatment. The local corpus checks do not measure detector accuracy.
Illustrative mechanism: missing observations, recorded zeros and planned uplift need different treatment. The local corpus checks do not measure detector accuracy.

Test separation must survive feature preparation

Use development data to build the method and calibration data to choose thresholds. A holdout is data reserved for the final comparison after those choices are fixed. Do not repeatedly inspect the holdout and keep adjusting the detector: that makes its results part of development. The scikit-learn data-leakage guidance explains why test information must not influence model choices or fitted preprocessing: https://scikit-learn.org/stable/common_pitfalls.html.

In this build, every complete series has one group identifier and belongs to only one split. Dates do not overlap across splits. The evaluator checks that separation. For a later learned model, fit scaling, imputation and other learned transformations on development data only. For rolling windows, keep windows from the same source series together and check the boundary against the number of past days consumed and future days predicted. A gap length cannot be chosen responsibly without those inputs.

Time order alone is not enough. The scikit-learn cross-validation guidance addresses both nearby time dependence and grouped observations: https://scikit-learn.org/stable/modules/cross_validation.html. Here the six families and baseline recipe repeat across splits, so a model could learn synthetic regularities. Version 1 is therefore a regression corpus for known distinctions, not evidence of generalization to new businesses, channels or traffic distributions. A later challenge set should hold out generation patterns and include adjudicated real incidents before supporting that wider claim.

ScaleGrowth’s AI Native capability covers prompt discovery and multi-LLM answer measurement. Those measurements would require their own observation units, missing-response rules and labels. Session fixtures cannot establish the reliability of an answer-measurement detector simply because both appear on a marketing dashboard. Connecting either measurement stream to anomaly detection remains a separate implementation task.

A reusable release needs a falsifiable check

The local work produced a versioned corpus, its generation rules, separate observations and answer key, a literal expected-outcome file and an evaluator. Expected counts, incident windows and selected values were declared before the generator ran. An arithmetic error in the initial checkpoint specification was corrected in a recorded replacement before implementation. Keeping that correction matters: an incorrect expected answer is not made reliable by locking it early.

The separate evaluator accepted all 18 series and reproduced the declared label totals. Two generation runs produced byte-identical corpus files. In the holdout spike fixture, day index 42 contains 600 sessions; the corresponding unmodified Monday contains 300. The campaign fixture contains 455 sessions at index 35 under the documented rounding rule. These checks verify selected constructed values and corpus structure, not statistical detection quality.

Four deliberately damaged copies tested whether the checks could reject meaningful defects. Changing a spike label to clean failed. Reusing a development group identifier in holdout failed. Replacing a missing value with zero failed. Relabelling the planned campaign as an incident also failed. A separate script and a fixed oracle reduce circular checking, but both were written by the same author; this is not independent human validation.

For reuse, preserve the version, generation formula, split manifest, schema, answer key, checksums and evaluation output together. A label correction should create a new version with a reason, not silently alter the old comparison. Keep the frozen holdout separate from routine threshold tuning, and record the detector version and scoring contract when a detector trial is eventually run.

The fictional merchant can now use the completed corpus to test loading, label joins, missing-value preservation and regression behavior. The decision to adopt live alerting remains open. Version 1 omits gradual drift, late-arriving corrections, holidays and interactions between metrics. No proprietary detector, real customer data or production alert channel was exercised. An analytics or research lead still needs to review incident realism and the operational false-alert budget; that review has not been performed.

ScaleGrowth’s relevant contribution is the combination of organic-growth context and anomaly-detection work: defining which changes matter, preserving clean controls and making comparisons repeatable. The next useful proof is a frozen detector run against this corpus, followed by a separately assessed real-world challenge set. Until those exist, the defensible result is a reusable synthetic validation corpus with disclosed limits, not an accuracy claim.

References

Common pitfalls and recommended practices
https://scikit-learn.org/stable/common_pitfalls.html

Cross-validation: evaluating estimator performance
https://scikit-learn.org/stable/modules/cross_validation.html

Metrics and scoring: quantifying the quality of predictions
https://scikit-learn.org/stable/modules/model_evaluation.html

✉ Free Growth Audit
☎ Call Now Get Free Audit →