Technical ideas from real projects, not tutorials, not theory. Each post reflects a decision made under real constraints.
In this forecasting work, a raw weekly time series mixes several dynamics at once. Instead of fitting one model directly, I generated multiple decompositions, selected the one with lowest combined residual error, and forecast each component with the model family best suited to its behavior.
The adjusted component is modeled with ARIMA + calendar/holiday regressors. The seasonal component is modeled separately with ETS. The final output is stabilized with rolling median smoothing across iterations.
Result: Decomposition became a modeling decision layer — the best decomposition is the one that creates the most predictable sub-signals.
In a delivery-time prediction project, the formula was obvious — estimated duration from distance and rider speed. I gave the formula's output to the model as a structured prior, then let the model learn the deviation.
The model's job is no longer "predict delivery time." It becomes "predict how wrong this estimate will be, and in which direction." That's a much easier learning problem.
Result: The formula encodes what we know. The model encodes what we cannot derive analytically. This applies anywhere you have a reasonable first-principles estimate.
In a Nairobi ambulance deployment competition, the model predicted crash probability per road segment. But the real decision was: where should 6 ambulances be positioned right now?
The important part was the translation layer between prediction and action: predict risk → select highest-risk segments → cluster into geographic groups → place ambulances at centroids.
Result: In real-world ML, prediction quality and decision quality are related, but they are not the same thing.
Some categorical variables are informative but too coarse in raw form. Job_type mixes several underlying dimensions: how income is generated, how often it arrives, and how savings are managed.
I decomposed it into multiple behavioral features: income source, savings pattern, income frequency. Each derived feature captures a different financial mechanism.
Result: The variable is no longer a flat category — it becomes a behavioral representation layer separating latent mechanisms.
In a multi-entity time series problem, I spent more time on routing than on model tuning. The series were too heterogeneous: some decelerating, some accelerating, some near-zero, some ambiguous.
Before fitting anything, I built a classification layer: compute elasticity score, classify each entity into a trajectory regime, route to a different forecasting strategy per regime.
Result: When you have many entities to forecast, don't just build a better model. Build a better routing system.
I encoded six categorical variables differently based on what they represented: Helmert Sequential for day_of_week, Polynomial Ordered for hardware generations, WoE for binary splits, Target encoding for high cardinality.
Every encoding imposes an assumption. Better tabular modeling often starts with representing variables in ways that reflect their actual structure.
Result: Encoding is not preprocessing — it is part of how the model is allowed to interpret the variable.
Started from precomputed communication communities (SAS CLA results). A communication community is not necessarily a household — it can contain extended family, multiple households, and close friends.
Combined two signals: ranked communication intensity (top contacts weighted by position) and shared dominant evening cell-tower usage. Same community + top-ranked contact + shared evening tower = household tie.
Result: In applied graph analytics, the first cluster is often not the real unit you care about.
Most data science asks "what increases Y?" — leading to correlation, regression, SHAP. But some questions are different: what must already be true for high Y to even be possible?
Used Necessary Condition Analysis (NCA) to identify variables that act as minimum requirements, not average drivers. Below a threshold, the outcome simply does not appear.
Result: Some variables are not drivers — they are constraints. "Invest in X to boost" ≠ "guarantee X above threshold before anything else matters."
In a startup survival project (~50K funding rounds), the label "did not raise again" breaks if the company hasn't been observable for the full 36-month horizon. A startup founded in 2019, observed at 2021, looks like failure but simply hasn't had enough time.
Made two design decisions: eligibility window (only train on 36+ months observable history) and asymmetric holdout (mirror deployment prevalence, not balanced 50/50).
Result: Label design is often more important than algorithm choice. Once temporal contamination enters training, the model learns recency instead of risk.
In a telecom family-detection project, I needed to distinguish household-level ties from broader social communities. Added shared dominant cell-tower usage — "which cell tower shows up most in your evening CDR?" People spend ~8 hours a night in the same place.
Infrastructure data became behavioral evidence. The richest signals often hide in operational data, not in declared information.
Result: Cell tower dominance acts as a strong proxy for home location — operational traces as features.
Built an XGBoost model to predict hourly telecom data usage. Standard confidence intervals treated all predictions the same way — but peak hours had much larger errors. The business was making decisions based on false confidence.
Wrapped the model with conformal prediction: a distribution-free uncertainty quantification method. The interval width adapts to the data — wider in peak hours, narrower in off-peak.
Result: Point predictions without uncertainty are incomplete. The interval is the signal that tells you when to trust the forecast.