jsonlkit.com
JSONL (JSON Lines) utilities, in the browser
Say hi →

Split JSONL into Train, Validation, Test

updated 16 May 2026 · for fine-tune / ML datasets

Train, validation and test splitter. Split a JSONL (JSON Lines) dataset into train, val and test sets. Random with seed, optional stratify by key, configurable ratios. Three downloads in one click. Browser-only.

100% client-side. No upload.

Split

Drop a .jsonl file here, or

Train / Val / Test Splitter

The reproducible split every ML pipeline needs. Drop in a JSONL file, set the ratios (80/10/10 by default), choose a seed so your results are repeatable, and optionally stratify by a label key to keep the class distribution identical across all three splits. Three named files come out: train.jsonl, val.jsonl, test.jsonl. 100% in-browser.

Random split

Shuffles the input with a seeded PRNG (so the same input + same seed always gives the same three files), then takes the first train% for train, the next val% for validation, and the rest for test. The seed defaults to 42 — change it if you want to try a different shuffle.

Stratified split

Set a key (typically the label or class field — label, category, intent) and the splitter keeps each class's proportion the same in all three files. Critical when classes are imbalanced: a pure random split can put 0 examples of a rare class into val/test and silently destroy your evaluation.

When a class is too small to reach every split — three examples cannot be divided 80/10/10 — the summary says so by name rather than leaving you to notice that val has no examples of it. The per-class counts for all three files are printed underneath the download links.

Stratifying builds each split one class at a time, which would leave the output ordered by label; each file is shuffled again at the end so a trainer that does not shuffle for you is not fed all of one class and then all of another.

Leakage: the thing that makes a split worth doing

A split exists so the number you get at the end means something. It stops meaning anything the moment an example in the eval set also appears in training — the model has seen the answer, the score goes up, and nothing tells you. It is the commonest way a fine-tune looks better than it is.

Two shapes of it, and both are handled here rather than left to you:

Because whole units are assigned rather than individual rows, the split percentages are targets rather than guarantees — units are placed largest-first into whichever split is furthest below its share, and the achieved percentages are reported next to the ones you asked for. If they are far apart, one group is a large fraction of your data, which is worth knowing on its own.

Why a separate test set?

Standard ML hygiene: use train for fitting, val for hyperparameter tuning and early-stopping, test for the final unbiased evaluation. If you tune on test, your reported metrics will be optimistic and your model will underperform in production.

Ratios that aren't 80/10/10

Tips & common pitfalls

Before you start

You need a single JSONL file representing your full dataset. The splitter shuffles it (using your seed) and produces three files: train, val and test.

How to use it

  1. Drop your JSONL or paste it.
  2. Set the ratios — default 80/10/10 (train/val/test). Any three numbers that sum to 100 work.
  3. Pin a Seed for reproducible splits.
  4. Optional: enable Stratify by key to preserve a label distribution across splits.
  5. Click Split, then download each file.

Stratified split

For classification or labelled data, stratify by the label key (e.g. label, category). The split keeps the proportion of each label roughly equal in all three sets — important when a class is rare.

Tips & common pitfalls

Frequently asked questions

Can I do a 90/5/5 or 70/15/15?

Yes — any three positive numbers summing to 100.

Can I skip the test set?

Set test ratio to 0. The tool will produce just train and val.

k-fold cross-validation?

Not yet — on the roadmap.

Related tools