Research · Visual analytics
Machine Unlearning Comparator
A visual analytics system for comparing how unlearning methods forget data while preserving accuracy, efficiency, and privacy.- Role
- Research Intern · Frontend
- Time frame
- Jun 2024 — Aug 2025
- Team
- Intelligent Data Computing Lab @ SKKU
- React
- TypeScript
- D3.js
- Zustand

Why this project
Unlearning is a tradeoff problem, not a single score.
Machine unlearning tries to remove the influence of specific training data without retraining from scratch. In practice a method can forget the target, damage retain-set utility, leak membership under attack, or simply cost too much to run.
Researchers still had to stitch those signals together from separate scripts and plots. I joined the lab to build the interactive comparison surfaces that make those tradeoffs visible in one workflow.
Goals & constraints
Compare methods the way researchers actually decide.
- Compare methods across accuracy, efficiency, and privacy, not a single ranking.
- Let analysts jump from method-level outcomes to instance-level evidence without losing context.
- Keep dense embedding views fast enough to explore, not just to screenshot.
- Iterate the workflow with domain experts before treating the UI as finished.
Approach
A staged workflow with linked views.
The system is organized around how researchers evaluate unlearning, not around a dashboard of unrelated charts.
Build, Screen, Contrast, then Attack
Users configure experiments, scan high-level outcomes, inspect model behavior in detail, and finally audit residual privacy risk. The sequence keeps expensive or noisy views from appearing before they have a question.
Linked views instead of isolated plots
Class-level metrics, prediction matrices, embedding spaces, and layer-wise similarity stay connected. Selecting a method or sample should update the rest of the workspace so comparison stays in context.
D3 for the hot path, Zustand for shared state
React is a poor fit for dragging 2,000 embedding points. I kept D3 in charge of imperative scatterplot updates and moved shared state from Context to selector-based Zustand subscriptions, so linked views rerender only when their slice changes.
Implementation
The moments that made the comparison usable.
Interaction that keeps up with inspection
Imperative D3 updates and careful memoization brought scatterplot interaction latency to p95 ≤ 11 ms at 2,000 points, which is fast enough to brush, zoom, and compare embeddings without breaking the analysis loop.
Fewer rerenders across linked views
The Context-to-Zustand migration cut React rerenders by about 30%. That mattered because one selection can fan out to several coordinated plots.
Privacy as a first-class view
Interactive Membership Inference Attack views sit in the Attack stage so forgotten data can be checked for leftover signal, not only for a drop in forget-set accuracy.
Three rounds of expert iteration
I iterated interaction workflows through three Figma user-study rounds with the lab, then helped ship the open-source platform.
Outcome
An open platform published in IEEE TVCG.
The system ships with common baselines — Fine-Tuning, Gradient Ascent, Random Labeling, SCRUB, and SalUn — and a Python hook for custom methods. We published it in IEEE TVCG 2026. The open-source repository has about 100 GitHub stars.
Reflection
Treat interaction latency as part of the method.
The research question only becomes usable if the interface stays fast. The most transferable lesson was treating interaction latency as part of the analysis method, not as polish after the plots exist.
Selector-based state was the other unlock. Linked views are easy to describe and easy to make accidentally expensive.