Note · 2026-09-21
What counts as a good data quality score for a training dataset?
A dataset scoring 85 or above on a 0-100 rubric (duplicates, missingness, mixed types, class imbalance, PII exposure) is generally safe to train or fine-tune on without manual cleanup; below 60 usually means fix-it-first. The exact rubric and penalty weights, published so you can re-derive any score yourself.
Short answer: on a 100-point scale that starts at 100 and subtracts penalties for five concrete defects, 85+ is clean enough to use as-is, 60-84 is usable but should be spot-checked, and below 60 has at least one defect severe enough to bias a model or break a pipeline downstream. Vague "data quality" scores are common; what makes a score useful is that every point lost is traceable to a specific, fixable row or column.
The five things that lose points
Our Dataset Quality Audit API computes a 0-100 score from exactly five checks, each independently capped so no single defect can zero out an otherwise-fine dataset:
| Defect | Penalty formula | Cap | |---|---|---| | Duplicate rows | 0.5 pts per 1% of rows that are exact duplicates | 25 pts | | Missing values | 0.5 pts per 1% average missingness across columns | 25 pts | | Mixed-type columns | 5 pts per column with inconsistent types (e.g. numbers stored as text) | 20 pts | | Severe class imbalance | 5 pts per categorical column where one value is ≥90% of rows | 15 pts | | PII-pattern hits | 5 pts per column matching an email/phone/SSN-like pattern | 15 pts |
A dataset with 4% duplicate rows and nothing else wrong loses 2 points (score 98). A dataset with three mixed-type columns and 20% average missingness loses 15 + 10 = 25 points (score 75) — still usable, but the mixed-type columns should be fixed before training, since silent type coercion is a common source of downstream bugs. A dataset that trips all five caps bottoms out at 0.
Why cap each penalty independently
A single defect, however severe, should not be able to sink an entire dataset's score — a dataset that's 100% duplicate rows and nothing else is a different (and differently fixable) problem than one with clean rows but heavy PII exposure. Capping each category means the score stays interpretable: you can look at why a dataset scored 70 and go straight to the two or three columns responsible, instead of re-auditing the whole file by hand.
Where this matters most
- Before fine-tuning an LLM or training a classifier — silent duplicates inflate apparent accuracy on a held-out split drawn from the same distribution; severe class imbalance biases both training and the eyeballed accuracy metric.
- Before shipping a dataset to a client or publishing it — a PII-pattern hit is a compliance flag, not just a quality one.
- Before a pipeline step that assumes a fixed schema — mixed-type columns are the single most common cause of a downstream parser crashing on row 40,000 after passing on the first 39,999.
Try it
POST /v1/dataset-audit on the Docs API takes a CSV or JSON file (up to 50,000 rows, 200 columns) and returns the full breakdown — per-column missingness, which columns are mixed-type, IQR-based outlier counts, and the PII-pattern matches — not just the headline score. A free /v1/dataset-audit/preview route runs the same scoring on a truncated sample so you can see the shape of the output before paying per call.