Projects I have worked on

Over the last few years, I’ve worked on a mix of industry and university projects spanning optimization, security, computer vision, NLP, graph ML, and data visualization. This page collects the ones I’m most proud of, both as a portfolio and as a reference for anyone curious about what these courses and internships actually look like in practice.

Table of Contents

  • Role Mining @ ING (Security Data Science Internship)
  • NeRF2D @ Computer Vision (TU Delft)
  • Cyber Data Analytics (TU Delft)
  • GraphCast Lite @ Machine Learning for Graph Data (TU Delft)
  • Numerical & Temporal Fact Checking @ NLP (TU Delft)
  • Rotating Workforce Scheduling @ Algorithms for Intelligent Decision-Making (TU Delft)
  • Learning to Rank for Video Moment Retrieval @ Information Retrieval (TU Delft)
  • Prototypical Networks Reproduction @ Deep Learning (TU Delft)
  • Advent of Code Dashboard @ Data Visualization (TU Delft)

Role Mining @ ING

During my Security Data Scientist internship at ING’s Global CISO Analytics team, I worked on the Role Mining Problem. The work I performed was part of my master’s thesis titled “Breaking the trade-off: Adaptive optimization for scalable, minimal Role-Based Access Control”. In this project, I tackled the NP-hard Role Mining Problem: automatically inferring a minimal set of roles that covers all employee–permission relationships, so every employee has exactly what they need while the access control system remains as simple and therefore as secure as possible.

My main contribution was an adaptive framework that combines three optimization methods, each with its own trade-off between scalability and optimality, with a set of deterministic reduction rules. The framework first selects a suitable method based on the instance size, then gradually switches to more optimal approaches as the effective problem shrinks, ensuring that any sub-optimal decisions are made only when necessary and never by design. Across 32 real-world datasets, this approach achieved an average 53% reduction in the number of roles, demonstrating that it can scale to large enterprise RBAC systems while significantly simplifying administration and improving security posture.

Working on this framework in an industrial setting gave me plenty of things, from turning technical language into high-level explanations that non-technical people could follow to working with hundreds of thousands of data points and diverse teams. Overall, this experience reinforced my belief that I can enter a new environment, understand the challenges they face, research and educate myself on what an appropriate solution might look like, and finally design and implement an efficient and effective solution that brings real-world impact.


NeRF2D @ Computer Vision

For the Computer Vision course at TU Delft, my team and I built NeRF2D: a 2D analogue of Neural Radiance Fields designed as a fast sandbox for NeRF research ideas. Full 3D NeRFs are powerful for novel view synthesis, but training them can easily take days on a GPU; we wanted something that would run in under a minute on a laptop while still showing the same learning behaviour.

We reduced the original 3D problem to 2D: instead of learning a 3D scene from 2D images, NeRF2D learns a 2D object from 1D “views”. This simplification slashes the computational cost while keeping the core idea of learning a continuous radiance field and rendering it differentiably.

On top of the base model, we reproduced two NeRF variants (Depth‑NeRF and pixelNeRF) in this 2D setting and observed patterns consistent with their original 3D counterparts, especially under sparse-view regimes. NeRF2D turned out to be a lightweight “playground” for quickly testing NeRF extensions, and for me it cemented a deeper intuition for neural scene representations and differentiable rendering pipelines. You can read more about this in our blog.


Cyber Data Analytics

The Cyber Data Analytics course at TU Delft was structured around several hands-on assignments, each targeting a different challenge in modern cybersecurity: fraud detection, anomaly detection, and large-scale network monitoring. Together, these projects formed a mini-lab for building end-to-end data-driven security systems.

In the fraud detection assignment, we dealt with an extremely imbalanced credit card dataset, where fraudulent transactions are vanishingly rare. I experimented with techniques such as SMOTE oversampling and rank swapping (for privacy) and compared classic classifiers like Logistic Regression, Decision Trees, Random Forests, and gradient-boosted trees. The most effective setups combined synthetic balancing, aggregate transaction features, and ensemble methods to boost recall on frauds without overwhelming analysts with false positives.

For anomaly detection, I applied several unsupervised techniques to multivariate and sequential sensor data from cyber-physical systems. Density-based methods like LOF were good at spotting isolated outliers, while N-gram-based sequence models and PCA-residual analysis captured drifts and pattern breaks. This assignment was less about a single “best” model and more about learning how different methods see different types of anomalies.

The state machine and streams assignment moved from static datasets to streaming netflow data for botnet detection. Here, I used streaming sketches (Count-Min) and locality-sensitive hashing to track frequent patterns and similarities at scale, and then used deterministic finite automata to characterize the behavioral signatures of infected hosts. This was my first serious exposure to streaming algorithms and approximate similarity methods in a security context, and it showed how much structure you can extract even when you can’t store all the data.


GraphCast Lite @ Machine Learning for Graph Data

In the Machine Learning for Graph Data course, I worked on GraphCast Lite, a project inspired by recent graph-based approaches to medium-range weather forecasting. Numerical Weather Prediction (NWP) systems are incredibly accurate but also incredibly expensive; graph neural networks offer a data-driven alternative that can be cheaper to run once trained.

We represented the Earth as a graph where nodes correspond to spatial locations and edges capture relationships between neighboring grid cells. Using ERA5 reanalysis data, we built an encode–process–decode pipeline with GCN and GAT layers to predict future weather variables. We experimented with attention mechanisms, multi-level graph constructions, and a variant called SparseGAT that prunes edges to improve scalability.

SparseGAT managed to cut the number of edges by a large margin and reduced training time significantly, while keeping prediction error close to the dense models. Attention provided modest but consistent accuracy and stability gains, and its learned weights offered some interpretability about which spatial connections matter most. This project pulled together spatio-temporal modeling, GNN design, and practical concerns like training speed and memory footprint.


Numerical & Temporal Fact Checking @ NLP

For an NLP group project on misinformation, we focused on numerical and temporal fact checking: automatically verifying claims that involve numbers, statistics, and dates. These claims are particularly tricky because the model needs to reason over quantities and time, not just text matching.

The project used the QuanTemp dataset, which contains thousands of real-world numerical claims paired with evidence. We evaluated a range of Natural Language Inference (NLI) models, from general-purpose backbones like BART- and RoBERTa-MNLI to numerical-specialised models such as MathRoBERTa and NumT5. On top of this, we built an evidence retrieval pipeline that combined BM25 with transformer-based reranking, and experimented with decomposing complex claims into simpler sub-queries.

The main takeaway was that numerical-specialised models and claim decomposition both clearly help. Models trained with stronger numerical inductive biases performed better on comparison and statistical claims, and breaking down a complicated claim into smaller pieces improved evidence retrieval and downstream veracity predictions. Working on this project deepened my understanding of retrieval-augmented NLP, quantitative reasoning, and where current systems still struggle with numbers in the wild.


Rotating Workforce Scheduling @ Algorithms for Intelligent Decision-Making

In the Algorithms for Intelligent Decision-Making course, my project tackled the Rotating Workforce Scheduling (RWS) problem using constraint programming in MiniZinc. The task is to assign staff to shifts over a planning horizon, respecting demand, rotation rules, and fairness constraints while keeping the schedule feasible and reasonably “nice” for humans.

I implemented two constraint models: an integer-variable formulation and a more fine-grained boolean-variable formulation. Both incorporated symmetry-breaking constraints (e.g., fixing certain offsets or patterns) and implied constraints that help the solver prune impossible regions of the search space early. I then ran systematic experiments using different solver backends (with a focus on Chuffed and Gecode) and search strategies.

The integer-based model combined with Chuffed consistently delivered the best performance, solving more instances within tight time limits and yielding solutions with cleaner structure. An important learning was that “more constraints” is not always better: some theoretically appealing improvements actually slowed the solver down. This project sharpened my skills in modeling combinatorial problems and in thinking about the interaction between model structure and solver behaviour.


Learning to Rank for Video Moment Retrieval @ Information Retrieval

For the Information Retrieval course at TU Delft, my group worked on applying Learning-to-Rank (LTR) to text-based moment retrieval in video collections, focusing on the TVRetrieval and QVHighlights datasets. The goal was to find specific, relevant moments in long videos using only subtitles and natural-language queries, and to understand how far a subtitle-only system can go in terms of both effectiveness and speed.​

We built a two-stage pipeline: a first-stage retrieval (FSR) step using several PyTerrier rankers (e.g. BM25, TF-IDF variants, language models, divergence-from-randomness models), followed by LTR re-ranking using pointwise (LinearSVR, Random Forests), pairwise (XGBoost), and listwise (Coordinate Ascent) methods, with features constructed from multiple FSR scores. My contribution focused on integrating and experimenting with combinations of FSR methods, feature sets, and ranking models, generating result figures and analysing where and why LTR helped. The key finding was that FSR is the main bottleneck: relevant moments often fall outside the top-k candidates, which fundamentally limits how much LTR can improve metrics like Recall@k and MRR, even though our best listwise setups achieved consistent gains and sub‑second mean response times.​

This project gave me hands-on experience with large-scale IR experimentation in PyTerrier, designing feature spaces for LTR, and interpreting the interactions between retrieval quality, ranking models, and evaluation metrics. It also highlighted clear directions for future work, such as improving first-stage retrieval (e.g. query expansion) and integrating visual features to overcome the limitations of subtitle-only signals.


Prototypical Networks Reproduction @ Deep Learning

In the Deep Learning course, we reproduced the Prototypical Networks paper, a foundational approach to few-shot learning. The central idea is to learn an embedding where each class is represented by the mean of its support examples, the prototype, and queries are classified by their distance to these prototypes.

We implemented the method on the mini-ImageNet benchmark, constructing training episodes with small numbers of classes and very few examples per class. The model trained an embedding network to minimise classification error across these episodes, effectively learning to “adapt” to new classes with only a handful of labelled images. Experiments covered various N-way, K-shot configurations and monitored convergence of accuracy and loss on both training and validation episodes.

Reproducing this work gave a practical feel for metric learning and meta-learning: how to design episodic training loops, structure embedding networks, and debug the many ways few-shot experiments can silently fail. It also reinforced the importance of rigorous reproduction as a way to internalise research ideas rather than just reading about them.

The code for this one is available at our GitHub repository.


Advent of Code Dashboard @ Data Visualization

Finally, for the Data Visualization course, I worked on an interactive dashboard built around data from the Advent of Code programming competition. The aim was both playful and analytical: turn a festive coding event into a rich, explorable dataset about problem difficulty, participation, and top performers.

The dashboard includes several coordinated views: box plots of solve times for top users across days, a binary heatmap showing when different puzzle categories appear during December, user profile views with performance heatmaps and language usage bars, and sortable tables of ranking and points. Most of the data was scraped from the official site and GitHub, with manual annotations to label puzzle categories.

From a visualization perspective, the project was about moving beyond “just plots” towards a coherent analytical tool. It showed, for example, how difficulty often ramps up over the event and how broad, steady problem-solving tends to beat hyper-specialised spikes in performance. Working on this dashboard developed my skills in data wrangling, visual encoding choices, and designing interfaces that invite exploration rather than just presenting a static story.


Discover more from Chrysanthos Kindynis

Subscribe to get the latest posts sent to your email.

Leave a Reply

Discover more from Chrysanthos Kindynis

Subscribe now to keep reading and get access to the full archive.

Continue reading