{
  "id": 703405,
  "title": "WiDS Global Datathon 2026: Winning Solution (btt_mapping)",
  "content": "<h2>Overview</h2>\n<p>Our solution predicts the probability that a wildfire will threaten an evacuation zone at four time horizons — 12, 24, 48, and 72 hours — using only the first five hours of data after each fire's initial perimeter observation. We placed 2nd on the private leaderboard with a hybrid score of 0.97272.</p>\n<h2>Approach</h2>\n<p>Early on, we noticed the dataset split cleanly along a single dimension: distance to the nearest weather station. Fires within roughly 5 kilometers behaved very differently from those farther out. This meant the real challenge wasn't predicting <em>whether</em> a fire would threaten an evacuation zone, but <em>when</em>, and that required a different model for each population.</p>\n<p>We built a two-stage survival pipeline to handle this:</p>\n<p><strong>Stage 1: Backbone ensemble.</strong> Three survival models (Random Survival Forest, Gradient Boosting Survival, and a regularized Cox regression) trained on all 221 fires via 10-fold cross-validation. Blend weights were optimized directly against the competition's hybrid metric using Nelder-Mead. The Cox regression ended up dominating (~78% of the blend) because its built-in regularization made it the most stable generalizer on a small dataset.</p>\n<p><strong>Stage 2: Close-fire timing model.</strong> A separate, more strongly regularized Cox regression trained only on the 69 fires within the 5km threshold, where the precise timing of escalation matters most. Because 69 examples is a very small sample, we ran cross-validation five times with different random seeds and averaged the results to get a stable performance signal.</p>\n<p><strong>Stage 3: Calibration.</strong> Platt scaling at the 12h and 24h horizons, isotonic regression at 48h and 72h, with a final monotonicity check ensuring no fire's predicted probability decreased over time.</p>\n<h2>Code &amp; Reproducibility</h2>\n<p>The full pipeline runs end-to-end in this notebook in ~5 minutes or less on Kaggle. To reproduce our submission:</p>\n<ol>\n<li>Fork this notebook.</li>\n<li>Add the WiDS Global Datathon 2026 competition dataset (right sidebar → <strong>+ Add Input</strong>).</li>\n<li>Enable internet (right sidebar → Settings → Internet) so scikit-survival can install.</li>\n<li><strong>Save Version → Save &amp; Run All</strong>.</li>\n</ol>\n<p><strong>Where to find each result:</strong></p>\n<ul>\n<li><strong>Cell 15</strong> prints the final OOF hybrid score: <code>OOF hybrid: 0.9734  C: 0.9449  WBS: 0.0144</code>.</li>\n<li><strong>Cell 19</strong> generates the submission CSV. This is the exact file we submitted to Kaggle for scoring. It is validated for monotonicity (P(12h) ≤ P(24h) ≤ P(48h) ≤ P(72h) for every fire) before being written to <code>/kaggle/working/submission.csv</code>.</li>\n<li><strong>Cell 20</strong> serializes all trained models, calibration parameters, blend weights, and OOF metrics to <code>/kaggle/working/model_artifacts.pkl</code> for downstream inference without retraining.</li>\n<li><strong>Cell 21</strong> prints the final summary block.</li>\n</ul>\n<p>The OOF hybrid score (0.9734) is computed internally from cross-validation on the training set. The leaderboard scores (Public LB 0.97458, Private LB 0.97272) come from Kaggle's evaluation of the submission CSV against the hidden test set and are recorded in the artifact bundle as reference values.</p>\n<h2>What we learned</h2>\n<p>The Pareto principle held in practice: roughly 80% of our leaderboard gains came in the first week, and we badly underestimated how long we'd spend chasing the rest. At small sample sizes, most \"clever\" improvements (loosening regularization, adding features, using more flexible models) produced better training scores and worse leaderboard scores. Knowing when to stop tuning was as valuable as knowing how to start.</p>\n<h2>Team</h2>\n<p><strong>btt_mapping</strong>: Anjali Dev, Marcello Borromeo, Swetha Upadrasta. We met through Cornell University's Break Through Tech AI program.</p>",
  "comments": [],
  "comment_count": 0,
  "messages": [
    {
      "id": 3464669,
      "postDate": "2026-05-30T20:08:50.630Z",
      "content": "<h2>Overview</h2>\n<p>Our solution predicts the probability that a wildfire will threaten an evacuation zone at four time horizons — 12, 24, 48, and 72 hours — using only the first five hours of data after each fire's initial perimeter observation. We placed 2nd on the private leaderboard with a hybrid score of 0.97272.</p>\n<h2>Approach</h2>\n<p>Early on, we noticed the dataset split cleanly along a single dimension: distance to the nearest weather station. Fires within roughly 5 kilometers behaved very differently from those farther out. This meant the real challenge wasn't predicting <em>whether</em> a fire would threaten an evacuation zone, but <em>when</em>, and that required a different model for each population.</p>\n<p>We built a two-stage survival pipeline to handle this:</p>\n<p><strong>Stage 1: Backbone ensemble.</strong> Three survival models (Random Survival Forest, Gradient Boosting Survival, and a regularized Cox regression) trained on all 221 fires via 10-fold cross-validation. Blend weights were optimized directly against the competition's hybrid metric using Nelder-Mead. The Cox regression ended up dominating (~78% of the blend) because its built-in regularization made it the most stable generalizer on a small dataset.</p>\n<p><strong>Stage 2: Close-fire timing model.</strong> A separate, more strongly regularized Cox regression trained only on the 69 fires within the 5km threshold, where the precise timing of escalation matters most. Because 69 examples is a very small sample, we ran cross-validation five times with different random seeds and averaged the results to get a stable performance signal.</p>\n<p><strong>Stage 3: Calibration.</strong> Platt scaling at the 12h and 24h horizons, isotonic regression at 48h and 72h, with a final monotonicity check ensuring no fire's predicted probability decreased over time.</p>\n<h2>Code &amp; Reproducibility</h2>\n<p>The full pipeline runs end-to-end in this notebook in ~5 minutes or less on Kaggle. To reproduce our submission:</p>\n<ol>\n<li>Fork this notebook.</li>\n<li>Add the WiDS Global Datathon 2026 competition dataset (right sidebar → <strong>+ Add Input</strong>).</li>\n<li>Enable internet (right sidebar → Settings → Internet) so scikit-survival can install.</li>\n<li><strong>Save Version → Save &amp; Run All</strong>.</li>\n</ol>\n<p><strong>Where to find each result:</strong></p>\n<ul>\n<li><strong>Cell 15</strong> prints the final OOF hybrid score: <code>OOF hybrid: 0.9734  C: 0.9449  WBS: 0.0144</code>.</li>\n<li><strong>Cell 19</strong> generates the submission CSV. This is the exact file we submitted to Kaggle for scoring. It is validated for monotonicity (P(12h) ≤ P(24h) ≤ P(48h) ≤ P(72h) for every fire) before being written to <code>/kaggle/working/submission.csv</code>.</li>\n<li><strong>Cell 20</strong> serializes all trained models, calibration parameters, blend weights, and OOF metrics to <code>/kaggle/working/model_artifacts.pkl</code> for downstream inference without retraining.</li>\n<li><strong>Cell 21</strong> prints the final summary block.</li>\n</ul>\n<p>The OOF hybrid score (0.9734) is computed internally from cross-validation on the training set. The leaderboard scores (Public LB 0.97458, Private LB 0.97272) come from Kaggle's evaluation of the submission CSV against the hidden test set and are recorded in the artifact bundle as reference values.</p>\n<h2>What we learned</h2>\n<p>The Pareto principle held in practice: roughly 80% of our leaderboard gains came in the first week, and we badly underestimated how long we'd spend chasing the rest. At small sample sizes, most \"clever\" improvements (loosening regularization, adding features, using more flexible models) produced better training scores and worse leaderboard scores. Knowing when to stop tuning was as valuable as knowing how to start.</p>\n<h2>Team</h2>\n<p><strong>btt_mapping</strong>: Anjali Dev, Marcello Borromeo, Swetha Upadrasta. We met through Cornell University's Break Through Tech AI program.</p>",
      "rawMarkdown": "## Overview\n\nOur solution predicts the probability that a wildfire will threaten an evacuation zone at four time horizons — 12, 24, 48, and 72 hours — using only the first five hours of data after each fire's initial perimeter observation. We placed 2nd on the private leaderboard with a hybrid score of 0.97272.\n\n## Approach\n\nEarly on, we noticed the dataset split cleanly along a single dimension: distance to the nearest weather station. Fires within roughly 5 kilometers behaved very differently from those farther out. This meant the real challenge wasn't predicting *whether* a fire would threaten an evacuation zone, but *when*, and that required a different model for each population.\n\nWe built a two-stage survival pipeline to handle this:\n\n**Stage 1: Backbone ensemble.** Three survival models (Random Survival Forest, Gradient Boosting Survival, and a regularized Cox regression) trained on all 221 fires via 10-fold cross-validation. Blend weights were optimized directly against the competition's hybrid metric using Nelder-Mead. The Cox regression ended up dominating (~78% of the blend) because its built-in regularization made it the most stable generalizer on a small dataset.\n\n**Stage 2: Close-fire timing model.** A separate, more strongly regularized Cox regression trained only on the 69 fires within the 5km threshold, where the precise timing of escalation matters most. Because 69 examples is a very small sample, we ran cross-validation five times with different random seeds and averaged the results to get a stable performance signal.\n\n**Stage 3: Calibration.** Platt scaling at the 12h and 24h horizons, isotonic regression at 48h and 72h, with a final monotonicity check ensuring no fire's predicted probability decreased over time.\n\n## Code & Reproducibility\n\nThe full pipeline runs end-to-end in this notebook in ~5 minutes or less on Kaggle. To reproduce our submission:\n\n1. Fork this notebook.\n2. Add the WiDS Global Datathon 2026 competition dataset (right sidebar → **+ Add Input**).\n3. Enable internet (right sidebar → Settings → Internet) so scikit-survival can install.\n4. **Save Version → Save & Run All**.\n\n**Where to find each result:**\n\n- **Cell 15** prints the final OOF hybrid score: `OOF hybrid: 0.9734  C: 0.9449  WBS: 0.0144`.\n- **Cell 19** generates the submission CSV. This is the exact file we submitted to Kaggle for scoring. It is validated for monotonicity (P(12h) ≤ P(24h) ≤ P(48h) ≤ P(72h) for every fire) before being written to `/kaggle/working/submission.csv`.\n- **Cell 20** serializes all trained models, calibration parameters, blend weights, and OOF metrics to `/kaggle/working/model_artifacts.pkl` for downstream inference without retraining.\n- **Cell 21** prints the final summary block.\n\nThe OOF hybrid score (0.9734) is computed internally from cross-validation on the training set. The leaderboard scores (Public LB 0.97458, Private LB 0.97272) come from Kaggle's evaluation of the submission CSV against the hidden test set and are recorded in the artifact bundle as reference values.\n\n## What we learned\n\nThe Pareto principle held in practice: roughly 80% of our leaderboard gains came in the first week, and we badly underestimated how long we'd spend chasing the rest. At small sample sizes, most \"clever\" improvements (loosening regularization, adding features, using more flexible models) produced better training scores and worse leaderboard scores. Knowing when to stop tuning was as valuable as knowing how to start.\n\n## Team\n\n**btt_mapping**: Anjali Dev, Marcello Borromeo, Swetha Upadrasta. We met through Cornell University's Break Through Tech AI program."
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T08:48:50Z",
  "competition_id": 125681,
  "competition_slug": "WiDSWorldWide_GlobalDathon26",
  "team_id": 15189303,
  "solution_url": "/competitions/WiDSWorldWide_GlobalDathon26/writeups/wids-global-datathon-2026-winning-solution-btt-m"
}