Principle:Iterative Dvc Data Comparison
| Knowledge Sources | |
|---|---|
| Domains | Data_Comparison, Utilities |
| Last Updated | 2026-02-10 00:00 GMT |
Overview
Data comparison is the computation of structured diffs between nested data values -- such as metrics, parameters, and configuration dictionaries -- across different versions or experiments, producing quantified change summaries that support decision-making in iterative development workflows.
Description
Iterative workflows in data science and machine learning produce successive versions of metrics (accuracy, loss, F1 score), parameters (learning rate, batch size, regularization), and configurations that must be compared to assess progress. A practitioner running ten experiments needs to know not just the final metric values, but how each experiment's metrics differ from a baseline or from each other. Data comparison computes these structured diffs automatically, handling the complexities of nested data, heterogeneous types, and missing values.
The comparison operates on pairs of nested dictionaries (representing "old" and "new" states) and produces a diff structure where each leaf value is annotated with its old value, new value, and the computed difference. For numeric values, the difference is an arithmetic delta (new - old); for string values, the diff indicates whether the value changed; for missing values (present in one version but not the other), the diff marks the entry as added or removed. The result is a mirror of the original nested structure, but with each leaf replaced by a change record.
A key feature of data comparison is significance-aware formatting. Raw numeric diffs may have excessive decimal places or scientifically insignificant variations. The comparison system applies configurable rounding and formatting rules to present diffs in a way that highlights meaningful changes while suppressing noise. For example, if two accuracy values differ by 0.0000001, this may be formatted as "0" or suppressed entirely, while a difference of 0.05 would be prominently displayed. This formatting intelligence transforms raw diffs into actionable summaries.
Usage
Data comparison is used whenever:
- A user runs
metrics difforparams diffto compare values across Git revisions. - An experiment comparison table includes delta columns showing how metrics changed between experiments.
- An automated quality gate checks whether metric changes exceed acceptable thresholds.
- A reporting system generates change summaries for experiment reviews or model release notes.
- A CI/CD pipeline evaluates whether a proposed change improves or degrades model performance.
Theoretical Basis
Recursive diff computation. The diff algorithm recursively descends through the nested structures, computing leaf-level comparisons and preserving the original hierarchy in the output:
function compute_diff(old_data, new_data):
result = {}
all_keys = union(keys(old_data), keys(new_data))
for key in all_keys:
old_val = old_data.get(key, MISSING)
new_val = new_data.get(key, MISSING)
if is_dict(old_val) and is_dict(new_val):
sub_diff = compute_diff(old_val, new_val)
if sub_diff: // Only include if there are actual changes
result[key] = sub_diff
else:
diff_entry = {"old": old_val, "new": new_val}
if is_numeric(old_val) and is_numeric(new_val):
diff_entry["diff"] = new_val - old_val
elif old_val != new_val:
diff_entry["diff"] = "modified"
else:
continue // Skip unchanged values
result[key] = diff_entry
return result
Significance-aware formatting. Numeric diffs are formatted with controlled precision to convey meaningful information. The formatting algorithm determines the appropriate number of significant digits based on the magnitude of the values and the magnitude of the difference:
function format_diff(value, diff):
if diff == 0:
return "0"
// Determine significant digits from the diff magnitude
magnitude = floor(log10(abs(diff)))
// Show enough digits to capture the change
if magnitude >= 0:
precision = max(5 - magnitude, 1)
else:
precision = abs(magnitude) + 2
formatted = round(diff, precision)
return format_with_sign(formatted) // "+0.05" or "-0.003"
Example:
old_accuracy = 0.91234
new_accuracy = 0.95678
diff = 0.04444
formatted_diff = "+0.04444"
Flattening for tabular presentation. Nested diff structures are often flattened into a list of (path, old, new, diff) tuples for presentation in tables or reports. The flattening operation converts hierarchical paths into dot-separated or slash-separated strings:
function flatten_diff(diff, prefix=""):
rows = []
for key, value in diff.items():
path = join(prefix, key)
if "old" in value and "new" in value:
rows.append((path, value["old"], value["new"], value.get("diff")))
else:
rows.extend(flatten_diff(value, prefix=path))
return rows
Example output:
Path Old New Diff
metrics.json:accuracy 0.912 0.957 +0.045
metrics.json:loss 0.341 0.298 -0.043
params.yaml:lr 0.01 0.001 -0.009
This flattened representation is the standard input format for table rendering utilities and comparison report generators.