12
Datasets
ML
Metrics
Preprocessing
Complete ML Pipeline
Bring everything together in a comprehensive machine learning workflow. From data loading to model evaluation and visualization. This example uses deepbox/datasets, deepbox/ml, deepbox/metrics, deepbox/preprocess, deepbox/stats, deepbox/plot and focuses on loadHousingMini; Ridge; r2Score, mse, mae; trainTestSplit, StandardScaler; mean, std; Figure, scatter, plot.
Deepbox Modules Used
deepbox/datasetsdeepbox/mldeepbox/metricsdeepbox/preprocessdeepbox/statsdeepbox/plotWhat You Will Learn
- Use deepbox/datasets for loadHousingMini.
- Use deepbox/ml for Ridge.
- Use deepbox/metrics for r2Score, mse, mae.
- Use deepbox/preprocess for trainTestSplit, StandardScaler.
- Bring everything together in a comprehensive machine learning workflow. From data loading to model evaluation and visualization.
Source Files
index.ts
1/**2 * Example 12: Complete ML Pipeline3 *4 * Bring everything together in a comprehensive machine learning workflow.5 * From data loading to model evaluation and visualization.6 */78import { mkdirSync, writeFileSync } from "node:fs";9import { loadHousingMini } from "deepbox/datasets";10import { mae, mse, r2Score } from "deepbox/metrics";11import { Ridge } from "deepbox/ml";12import { tensor } from "deepbox/ndarray";13import { Figure } from "deepbox/plot";14import { StandardScaler, trainTestSplit } from "deepbox/preprocess";15import { mean, std } from "deepbox/stats";1617console.log("=".repeat(60));18console.log("Example 12: Complete Machine Learning Pipeline");19console.log("=".repeat(60));2021mkdirSync("docs/examples/12-complete-pipeline/output", { recursive: true });2223// Step 1: Load Data24console.log("\n📦 Step 1: Loading Dataset");25console.log("-".repeat(60));2627const dataset = loadHousingMini();28console.log(`✓ Loaded Housing-Mini dataset`);29console.log(` Samples: ${dataset.data.shape[0]}`);30console.log(` Features: ${dataset.data.shape[1]}`);3132// Step 2: Exploratory Data Analysis33console.log("\n📊 Step 2: Exploratory Data Analysis");34console.log("-".repeat(60));3536// Extract first feature for analysis37const feature_data: number[] = [];38const numFeatures = dataset.data.shape[1] || 0;39for (let i = 0; i < dataset.data.shape[0]; i++) {40 feature_data.push(Number(dataset.data.data[dataset.data.offset + i * numFeatures]));41}42const feature = tensor(feature_data);4344const meanVal = Number(mean(feature).data[0]);45const stdVal = Number(std(feature).data[0]);4647console.log(`Feature 1 Statistics:`);48console.log(` Mean: ${meanVal.toFixed(2)}`);49console.log(` Std: ${stdVal.toFixed(2)}`);5051// Step 3: Data Preprocessing52console.log("\n🔄 Step 3: Data Preprocessing");53console.log("-".repeat(60));5455const [X_train, X_test, y_train, y_test] = trainTestSplit(dataset.data, dataset.target, {56 testSize: 0.2,57 randomState: 42,58 shuffle: true,59});6061console.log(`✓ Split data:`);62console.log(` Training: ${X_train.shape[0]} samples`);63console.log(` Testing: ${X_test.shape[0]} samples`);6465const scaler = new StandardScaler();66scaler.fit(X_train);67const X_train_scaled = scaler.transform(X_train);68const X_test_scaled = scaler.transform(X_test);6970console.log(`✓ Scaled features using StandardScaler`);7172// Step 4: Model Training73console.log("\n🤖 Step 4: Model Training");74console.log("-".repeat(60));7576const model = new Ridge({ alpha: 1.0 });77model.fit(X_train_scaled, y_train);7879console.log(`✓ Trained Ridge Regression (α=1.0)`);8081// Step 5: Model Evaluation82console.log("\n📈 Step 5: Model Evaluation");83console.log("-".repeat(60));8485const y_pred = model.predict(X_test_scaled);8687const r2 = r2Score(y_test, y_pred);88const mseVal = mse(y_test, y_pred);89const maeVal = mae(y_test, y_pred);9091console.log(`Performance Metrics:`);92console.log(` R² Score: ${r2.toFixed(4)}`);93console.log(` MSE: ${mseVal.toFixed(4)}`);94console.log(` MAE: ${maeVal.toFixed(4)}`);9596// Step 6: Visualization97console.log("\n🎨 Step 6: Results Visualization");98console.log("-".repeat(60));99100// Extract predictions and actual values101const y_test_array: number[] = [];102const y_pred_array: number[] = [];103104for (let i = 0; i < y_test.size; i++) {105 y_test_array.push(Number(y_test.data[y_test.offset + i]));106 y_pred_array.push(Number(y_pred.data[y_pred.offset + i]));107}108109// Create predictions vs actual plot110const fig = new Figure({ width: 640, height: 480 });111const ax = fig.addAxes();112113ax.scatter(tensor(y_test_array), tensor(y_pred_array), {114 color: "#1f77b4",115 size: 8,116});117ax.plot(tensor([0, 1, 2]), tensor([0, 1, 2]), {118 color: "#ff0000",119 linewidth: 2,120});121ax.setTitle("Predictions vs Actual Values");122ax.setXLabel("Actual");123ax.setYLabel("Predicted");124125const svg = fig.renderSVG();126writeFileSync("docs/examples/12-complete-pipeline/output/predictions.svg", svg.svg);127console.log("✓ Saved: output/predictions.svg");128129// Step 7: Summary130console.log("\n📋 Step 7: Pipeline Summary");131console.log("-".repeat(60));132133console.log(`Complete ML Pipeline Executed:`);134console.log(` 1. ✓ Data Loading (Housing-Mini dataset)`);135console.log(` 2. ✓ Exploratory Analysis`);136console.log(` 3. ✓ Train/Test Split (80/20)`);137console.log(` 4. ✓ Feature Scaling (StandardScaler)`);138console.log(` 5. ✓ Model Training (Ridge Regression)`);139console.log(` 6. ✓ Model Evaluation (R²=${r2.toFixed(3)})`);140console.log(` 7. ✓ Results Visualization`);141142console.log("\n💡 Key Takeaways:");143console.log("• Always split data before scaling to prevent data leakage");144console.log("• Feature scaling improves model performance");145console.log("• Use multiple metrics to evaluate models");146console.log("• Visualize results to understand model behavior");147console.log("• Ridge regression adds L2 regularization to prevent overfitting");148149console.log(`\n${"=".repeat(60)}`);150console.log("✅ Complete ML Pipeline Finished Successfully!");151console.log("=".repeat(60));152Console Output
$ npx tsx 12-complete-pipeline/index.ts
1 SVG visualization in `output/`:
`predictions.svg` — Predictions vs actual values scatter plot