Example 46
intermediate
46
Datasets

Dataset Transforms & Samplers

A data-pipeline example for the v1.0.0 dataset helpers around training loops: `Subset`, `randomSplit`, `mapDataset`, `filterDataset`, `WeightedRandomSampler`, and `SubsetRandomSampler`. This example uses deepbox/datasets and focuses on loadIris, Subset, randomSplit, mapDataset, filterDataset, DataLoader, samplers.

Deepbox Modules Used

deepbox/datasets

What You Will Learn

  • Use deepbox/datasets for loadIris, Subset, randomSplit, mapDataset, filterDataset, DataLoader, samplers.
  • A data-pipeline example for the v1.0.0 dataset helpers around training loops: `Subset`, `randomSplit`, `mapDataset`, `filterDataset`, `WeightedRandomSampler`, and `SubsetRandomSampler`.

Source Files

index.ts
1/**2 * Example 46: Dataset Transforms & Samplers3 *4 * Demonstrates v1.0.0 dataset utilities that sit around model training:5 * Subset, randomSplit, mapDataset, filterDataset, and sampler-driven DataLoader6 * iteration for balancing or curating batches.7 */89import {10  DataLoader,11  filterDataset,12  loadIris,13  mapDataset,14  randomSplit,15  Subset,16  SubsetRandomSampler,17  WeightedRandomSampler,18} from "deepbox/datasets";1920console.log("=".repeat(60));21console.log("Example 46: Dataset Transforms & Samplers");22console.log("=".repeat(60));2324const iris = loadIris();2526// ============================================================================27// Part 1: Deterministic dataset splitting28// ============================================================================29console.log("\n✂️  Part 1: randomSplit");30console.log("-".repeat(60));3132const [trainSplit, validationSplit, testSplit] = randomSplit(iris, [105, 30, 15], 42);3334console.log(`Dataset description: ${iris.description}`);35console.log(36  `Split sizes -> train: ${trainSplit.data.shape[0]}, validation: ${validationSplit.data.shape[0]}, test: ${testSplit.data.shape[0]}`37);38console.log(`First five train indices: ${trainSplit.indices.slice(0, 5).join(", ")}`);3940// ============================================================================41// Part 2: Explicit curated subsets42// ============================================================================43console.log("\n🎯 Part 2: Subset");44console.log("-".repeat(60));4546const reviewSubset = new Subset(iris, [0, 10, 20, 50, 60, 120]);47console.log(`Curated review subset rows: ${reviewSubset.data.shape[0]}`);48console.log(`Curated indices: ${reviewSubset.indices.join(", ")}`);4950// ============================================================================51// Part 3: Filtering and mapping52// ============================================================================53console.log("\n🧪 Part 3: filterDataset + mapDataset");54console.log("-".repeat(60));5556const binaryIris = filterDataset(iris, (_row, target) => target !== 2);57console.log(`Binary subset (classes 0 and 1 only): ${binaryIris.data.shape[0]} samples`);5859const centeredBinaryIris = mapDataset(binaryIris, (row, target) => ({60  data: row.map((value, index) => (index < 2 ? value - 5 : value)),61  target,62}));6364console.log("First mapped sample (first two features centered around 5):");65console.log(66  `  Original: [${Array.from({ length: 4 }, (_, i) => Number(binaryIris.data.at(0, i)).toFixed(2)).join(", ")}]`67);68console.log(69  `  Mapped:   [${Array.from({ length: 4 }, (_, i) => Number(centeredBinaryIris.data.at(0, i)).toFixed(2)).join(", ")}]`70);7172// ============================================================================73// Part 4: WeightedRandomSampler for class balancing74// ============================================================================75console.log("\n⚖️  Part 4: WeightedRandomSampler");76console.log("-".repeat(60));7778const weights = Array.from({ length: binaryIris.target.shape[0] ?? 0 }, (_, index) => {79  const label = Number(binaryIris.target.at(index));80  return label === 1 ? 4 : 1;81});8283const balancedSampler = new WeightedRandomSampler(weights, {84  numSamples: 24,85  replacement: true,86  seed: 7,87});8889const balancedLoader = new DataLoader(binaryIris.data, binaryIris.target, {90  batchSize: 6,91  sampler: balancedSampler,92});9394let sampledClass0 = 0;95let sampledClass1 = 0;96let batchNumber = 1;9798for (const [xBatch, yBatch] of balancedLoader) {99  let batchClass0 = 0;100  let batchClass1 = 0;101102  for (let i = 0; i < (yBatch.shape[0] ?? 0); i++) {103    const label = Number(yBatch.at(i));104    if (label === 0) {105      batchClass0++;106      sampledClass0++;107    } else {108      batchClass1++;109      sampledClass1++;110    }111  }112113  console.log(114    `  Batch ${batchNumber}: X${JSON.stringify(xBatch.shape)} | class0=${batchClass0}, class1=${batchClass1}`115  );116  batchNumber++;117}118119console.log(`Weighted sampling totals -> class0=${sampledClass0}, class1=${sampledClass1}`);120121// ============================================================================122// Part 5: Deterministic review queues via SubsetRandomSampler123// ============================================================================124console.log("\n📋 Part 5: SubsetRandomSampler");125console.log("-".repeat(60));126127const shortlistSampler = new SubsetRandomSampler([0, 5, 10, 15, 20, 25], { seed: 19 });128const shortlistLoader = new DataLoader(iris.data, iris.target, {129  batchSize: 3,130  sampler: shortlistSampler,131});132133let shortlistBatch = 1;134for (const [xBatch, yBatch] of shortlistLoader) {135  console.log(136    `  Review batch ${shortlistBatch}: X${JSON.stringify(xBatch.shape)}, labels=${Array.from({ length: yBatch.shape[0] ?? 0 }, (_, i) => Number(yBatch.at(i))).join(", ")}`137  );138  shortlistBatch++;139}140141// ============================================================================142// Summary143// ============================================================================144console.log("\n💡 Key Takeaways");145console.log("-".repeat(60));146console.log("• randomSplit gives deterministic multi-way dataset partitioning");147console.log("• Subset is useful for audits, human review queues, or frozen evaluation slices");148console.log("• filterDataset and mapDataset make lightweight data curation easy");149console.log("• WeightedRandomSampler can rebalance skewed labels without copying data");150console.log("• SubsetRandomSampler lets you batch over a curated slice reproducibly");151152console.log("\n✅ Dataset Transforms & Samplers Example Complete!");153console.log("=".repeat(60));154

Console Output

$ npx tsx 46-dataset-transforms-samplers/index.ts
Console walkthrough of deterministic splitting, filtering, mapping, and sampler-driven batching