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/datasetsWhat 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));154Console Output
$ npx tsx 46-dataset-transforms-samplers/index.ts
Console walkthrough of deterministic splitting, filtering, mapping, and sampler-driven batching