{
  "id": 698757,
  "title": "27th | Avoid Boosting the Flames🔥",
  "content": "<p>🙏 <strong>Thanks to the WiDS organizers</strong> for an excellent and thought‑provoking competition - small data, real constraints, and a genuinely unique and interesting survival setup.</p>\n<h1>📌 TL;DR</h1>\n<p>This competition looked simple on paper — survival prediction at multiple horizons — but the real challenge was the data size. With only 221 training rows, most boosted models overfit before they learn anything. Instead of boosting harder, this solution focused on reducing variance by combining <strong>150 survival models</strong>, validated with <strong>event-time-aware</strong> repeated stratified cross‑validation (≤24h / ≤48h / later / censored).</p>\n<p>Check out the full notebook <strong><a href=\"https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2\" target=\"_blank\">HERE</a>.</strong></p>\n<hr>\n<h1>🔥 The core idea - don't boost the flames</h1>\n<p>Boosting is powerful on large datasets, but on tiny data it often amplifies noise and fails to generalize.</p>\n<hr>\n<h1>🏗️ Thoughtful feature engineering</h1>\n<p><strong>Early finding</strong>: As I also pointed in the <a href=\"https://www.kaggle.com/competitions/WiDSWorldWide_GlobalDathon26/discussion/679133\" target=\"_blank\">discussions</a>, the curse of dimensionality is <em>very real</em> here. With such small data, feature engineering isn't optional - it <em>is</em> the model. </p>\n<p><strong>Guiding principle</strong>: encode the physics, nonlinearities and some of the interactions; keep those with strong signal, that also remain stable across models.</p>\n<p>Check the models section for a thorough explanation on the features engineered for each model.</p>\n<hr>\n<h1>⚔️ The models - chosen to disagree</h1>\n<h2><strong>1. Gradient Boosting Survival</strong> (GBSA)</h2>\n<ul>\n<li>handles nonlinear effects and feature interactions</li>\n<li>however, individual fits are noisy</li>\n<li>Proposed solution: 8 diverse configs × 10 seeds = <strong>80 models averaged</strong> (as inspired by multiple public notebooks throughout the competition).</li>\n</ul>\n<p>The configs deliberately spread to create <em>model diversity first</em>, then reduce variance by averaging.</p>\n<ul>\n<li>learning rates from very gentle (0.005) to moderate (0.05),</li>\n<li>small trees (max_depth = 2–3),</li>\n<li>wide range of boosting lengths (200 → 2500 estimators),</li>\n<li>subsampling and min‑leaf sizes to decorrelate trees.</li>\n</ul>\n<p><strong>Guiding principle</strong>: Each model is imperfect; the ensemble is (very) stable.</p>\n<h3>Features:</h3>\n<ul>\n<li><code>log_distance</code>, <code>proximity_risk</code> (inverse distance transformation) → fire impact diminishes nonlinearly with distance</li>\n<li><code>hazard_potential</code> (size x distance) → big things nearby are dangerous</li>\n<li><code>alignment_abs</code> (directionality) → is the fire moving towards the asset? could matter more than raw speed</li>\n<li><code>dist_slope_ci_0_5h</code> (trend) → captures the change in the first 5 hours (meters/per hour)</li>\n<li><code>event_start_month</code> (seasonality) → incorporates any potential seasonal patters </li>\n<li><code>log1p_area_first</code> (relative fire size) → grows quickly at first as area increases</li>\n</ul>\n<p>A small set of features for trees on data this small led to fewer splitting paths, hence less overfitting.</p>\n<h2><strong>2. Cox Proportional Hazards</strong></h2>\n<ul>\n<li>linear, regularized, and intentionally biased in a different direction → added for genuine ensemble diversity.</li>\n<li>coefficients were shrunk by changing alpha values from very weak (.001) to strong regularization (5.0)</li>\n</ul>\n<p><strong>Guiding principle</strong>: Cox is often wrong, but wrong <em>differently</em>, which is exactly what the ensemble needs.</p>\n<h3>Features:</h3>\n<ul>\n<li><code>alignment_abs</code>, <code>log1p_area_first</code>, <code>num_perimeters_0_5h</code></li>\n<li><code>log_distance</code>, <code>area_to_dist_ratio</code>, <code>fire_radius_km</code> (√(area / π)) → guide nonlinear effects with explicit physics-informed transforms</li>\n<li><code>log_eta</code> (basically <code>log(distance / closing speed)</code>), <code>eta_effective</code> (calculated as <code>distance / (closing speed + radial growth)</code>) → time to arrival dynamics; fire risk is <em>time-based</em> and CoxPH naturally models hazard over time</li>\n<li><code>near_speed_rank</code>, <code>far_threat_rank</code> (rank features) → ranks are robust to outliers </li>\n<li><code>is_summer</code>, <code>is_afternoon</code> (12-17), <code>zone_near</code> (within 5km), <code>zone_far</code> (over 5km), <code>has_movement</code> (reached more than 1 perimeter) → binary context flags to guide the model to interpretable findings</li>\n<li><code>threat_score</code> (alignment × speed / log-distance)  → composite risk that encodes direction, speed and distance (thus an interaction)</li>\n</ul>\n<p><strong>Why more features?</strong> Regularization shrinks weak signals toward zero. </p>\n<h3>Final blend:</h3>\n<p><strong>90% GBSA + 10% CoxPH</strong> won consistently in cross-validation tests.</p>\n<hr>\n<h1>🔁 Cross-validation</h1>\n<p>Random folds can land badly - too few short-time events in one fold, too many censored cases in another. </p>\n<p>Cross-validation was done by defining an event-time strata (censored / hit by 24h / hit by 48h / hit later) and use <code>RepeatedStratifiedKFold</code> with <strong>3 repeats × 5 folds</strong>. </p>\n<pre><code>Models: GBSA (8 configs × 10 seeds) + CoxPH (7 alphas × 10 seeds)\nBlend: 90% GBSA + 10% CoxPH, 72h=1.0\nCV: RepeatedStratifiedKFold(5, 3), event+time strata\n  c_index             :  0.94714 ± 0.01604  (range: 0.92016 - 0.97872)\n  brier_12            :  0.05391 ± 0.01179  (range: 0.03554 - 0.07416)\n  brier_24            :  0.02572 ± 0.00882  (range: 0.01377 - 0.03897)\n  brier_48            :  0.01310 ± 0.00639  (range: 0.00251 - 0.02359)\n  brier_72            :  0.00000 ± 0.00000  (range: 0.00000 - 0.00000)\n  weighted_brier      :  0.01296 ± 0.00243  (range: 0.00893 - 0.01725)\n  hybrid              :  0.97507 ± 0.00519  (range: 0.96823 - 0.98610)\n</code></pre>\n<hr>\n<h1>👉 What actually mattered</h1>\n<ul>\n<li><strong>Aggressive feature trimming</strong>: only 7 stable features for trees to reduce any potential overfitting</li>\n<li><strong>Different feature space</strong> for CoxPH (16), to ensure it consistently improves CV </li>\n<li><strong>Event-time stratified CV</strong> to avoid fold luck</li>\n<li>Predicting <code>prob_72h = 1.0</code>, which quietly wins the weighted Brier</li>\n</ul>\n<hr>\n<h1>💡The lessons</h1>\n<ul>\n<li>Trees need few, strong, interaction-ready features </li>\n<li>Linear models need pre-shaped nonlinear signals </li>\n<li>Small data needs discipline, not abundance</li>\n<li>More features ≠ better model. On small data, a small stable set is gold. 🥇 </li>\n</ul>\n<p>Full implementation, details and approach are in the notebook <strong><a href=\"https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2\" target=\"_blank\">HERE</a></strong>. </p>",
  "comments": [],
  "comment_count": 0,
  "messages": [
    {
      "id": 3456258,
      "postDate": "2026-05-11T15:01:52.447Z",
      "content": "<p>🙏 <strong>Thanks to the WiDS organizers</strong> for an excellent and thought‑provoking competition - small data, real constraints, and a genuinely unique and interesting survival setup.</p>\n<h1>📌 TL;DR</h1>\n<p>This competition looked simple on paper — survival prediction at multiple horizons — but the real challenge was the data size. With only 221 training rows, most boosted models overfit before they learn anything. Instead of boosting harder, this solution focused on reducing variance by combining <strong>150 survival models</strong>, validated with <strong>event-time-aware</strong> repeated stratified cross‑validation (≤24h / ≤48h / later / censored).</p>\n<p>Check out the full notebook <strong><a href=\"https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2\" target=\"_blank\">HERE</a>.</strong></p>\n<hr>\n<h1>🔥 The core idea - don't boost the flames</h1>\n<p>Boosting is powerful on large datasets, but on tiny data it often amplifies noise and fails to generalize.</p>\n<hr>\n<h1>🏗️ Thoughtful feature engineering</h1>\n<p><strong>Early finding</strong>: As I also pointed in the <a href=\"https://www.kaggle.com/competitions/WiDSWorldWide_GlobalDathon26/discussion/679133\" target=\"_blank\">discussions</a>, the curse of dimensionality is <em>very real</em> here. With such small data, feature engineering isn't optional - it <em>is</em> the model. </p>\n<p><strong>Guiding principle</strong>: encode the physics, nonlinearities and some of the interactions; keep those with strong signal, that also remain stable across models.</p>\n<p>Check the models section for a thorough explanation on the features engineered for each model.</p>\n<hr>\n<h1>⚔️ The models - chosen to disagree</h1>\n<h2><strong>1. Gradient Boosting Survival</strong> (GBSA)</h2>\n<ul>\n<li>handles nonlinear effects and feature interactions</li>\n<li>however, individual fits are noisy</li>\n<li>Proposed solution: 8 diverse configs × 10 seeds = <strong>80 models averaged</strong> (as inspired by multiple public notebooks throughout the competition).</li>\n</ul>\n<p>The configs deliberately spread to create <em>model diversity first</em>, then reduce variance by averaging.</p>\n<ul>\n<li>learning rates from very gentle (0.005) to moderate (0.05),</li>\n<li>small trees (max_depth = 2–3),</li>\n<li>wide range of boosting lengths (200 → 2500 estimators),</li>\n<li>subsampling and min‑leaf sizes to decorrelate trees.</li>\n</ul>\n<p><strong>Guiding principle</strong>: Each model is imperfect; the ensemble is (very) stable.</p>\n<h3>Features:</h3>\n<ul>\n<li><code>log_distance</code>, <code>proximity_risk</code> (inverse distance transformation) → fire impact diminishes nonlinearly with distance</li>\n<li><code>hazard_potential</code> (size x distance) → big things nearby are dangerous</li>\n<li><code>alignment_abs</code> (directionality) → is the fire moving towards the asset? could matter more than raw speed</li>\n<li><code>dist_slope_ci_0_5h</code> (trend) → captures the change in the first 5 hours (meters/per hour)</li>\n<li><code>event_start_month</code> (seasonality) → incorporates any potential seasonal patters </li>\n<li><code>log1p_area_first</code> (relative fire size) → grows quickly at first as area increases</li>\n</ul>\n<p>A small set of features for trees on data this small led to fewer splitting paths, hence less overfitting.</p>\n<h2><strong>2. Cox Proportional Hazards</strong></h2>\n<ul>\n<li>linear, regularized, and intentionally biased in a different direction → added for genuine ensemble diversity.</li>\n<li>coefficients were shrunk by changing alpha values from very weak (.001) to strong regularization (5.0)</li>\n</ul>\n<p><strong>Guiding principle</strong>: Cox is often wrong, but wrong <em>differently</em>, which is exactly what the ensemble needs.</p>\n<h3>Features:</h3>\n<ul>\n<li><code>alignment_abs</code>, <code>log1p_area_first</code>, <code>num_perimeters_0_5h</code></li>\n<li><code>log_distance</code>, <code>area_to_dist_ratio</code>, <code>fire_radius_km</code> (√(area / π)) → guide nonlinear effects with explicit physics-informed transforms</li>\n<li><code>log_eta</code> (basically <code>log(distance / closing speed)</code>), <code>eta_effective</code> (calculated as <code>distance / (closing speed + radial growth)</code>) → time to arrival dynamics; fire risk is <em>time-based</em> and CoxPH naturally models hazard over time</li>\n<li><code>near_speed_rank</code>, <code>far_threat_rank</code> (rank features) → ranks are robust to outliers </li>\n<li><code>is_summer</code>, <code>is_afternoon</code> (12-17), <code>zone_near</code> (within 5km), <code>zone_far</code> (over 5km), <code>has_movement</code> (reached more than 1 perimeter) → binary context flags to guide the model to interpretable findings</li>\n<li><code>threat_score</code> (alignment × speed / log-distance)  → composite risk that encodes direction, speed and distance (thus an interaction)</li>\n</ul>\n<p><strong>Why more features?</strong> Regularization shrinks weak signals toward zero. </p>\n<h3>Final blend:</h3>\n<p><strong>90% GBSA + 10% CoxPH</strong> won consistently in cross-validation tests.</p>\n<hr>\n<h1>🔁 Cross-validation</h1>\n<p>Random folds can land badly - too few short-time events in one fold, too many censored cases in another. </p>\n<p>Cross-validation was done by defining an event-time strata (censored / hit by 24h / hit by 48h / hit later) and use <code>RepeatedStratifiedKFold</code> with <strong>3 repeats × 5 folds</strong>. </p>\n<pre><code>Models: GBSA (8 configs × 10 seeds) + CoxPH (7 alphas × 10 seeds)\nBlend: 90% GBSA + 10% CoxPH, 72h=1.0\nCV: RepeatedStratifiedKFold(5, 3), event+time strata\n  c_index             :  0.94714 ± 0.01604  (range: 0.92016 - 0.97872)\n  brier_12            :  0.05391 ± 0.01179  (range: 0.03554 - 0.07416)\n  brier_24            :  0.02572 ± 0.00882  (range: 0.01377 - 0.03897)\n  brier_48            :  0.01310 ± 0.00639  (range: 0.00251 - 0.02359)\n  brier_72            :  0.00000 ± 0.00000  (range: 0.00000 - 0.00000)\n  weighted_brier      :  0.01296 ± 0.00243  (range: 0.00893 - 0.01725)\n  hybrid              :  0.97507 ± 0.00519  (range: 0.96823 - 0.98610)\n</code></pre>\n<hr>\n<h1>👉 What actually mattered</h1>\n<ul>\n<li><strong>Aggressive feature trimming</strong>: only 7 stable features for trees to reduce any potential overfitting</li>\n<li><strong>Different feature space</strong> for CoxPH (16), to ensure it consistently improves CV </li>\n<li><strong>Event-time stratified CV</strong> to avoid fold luck</li>\n<li>Predicting <code>prob_72h = 1.0</code>, which quietly wins the weighted Brier</li>\n</ul>\n<hr>\n<h1>💡The lessons</h1>\n<ul>\n<li>Trees need few, strong, interaction-ready features </li>\n<li>Linear models need pre-shaped nonlinear signals </li>\n<li>Small data needs discipline, not abundance</li>\n<li>More features ≠ better model. On small data, a small stable set is gold. 🥇 </li>\n</ul>\n<p>Full implementation, details and approach are in the notebook <strong><a href=\"https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2\" target=\"_blank\">HERE</a></strong>. </p>",
      "rawMarkdown": "🙏 **Thanks to the WiDS organizers** for an excellent and thought‑provoking competition - small data, real constraints, and a genuinely unique and interesting survival setup.\n\n# 📌 TL;DR\nThis competition looked simple on paper — survival prediction at multiple horizons — but the real challenge was the data size. With only 221 training rows, most boosted models overfit before they learn anything. Instead of boosting harder, this solution focused on reducing variance by combining **150 survival models**, validated with **event-time-aware** repeated stratified cross‑validation (≤24h / ≤48h / later / censored).\n\nCheck out the full notebook **[HERE](https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2).**\n\n---\n#🔥 The core idea - don't boost the flames\nBoosting is powerful on large datasets, but on tiny data it often amplifies noise and fails to generalize.\n\n---\n# 🏗️ Thoughtful feature engineering \n**Early finding**: As I also pointed in the [discussions](https://www.kaggle.com/competitions/WiDSWorldWide_GlobalDathon26/discussion/679133), the curse of dimensionality is *very real* here. With such small data, feature engineering isn't optional - it *is* the model. \n\n**Guiding principle**: encode the physics, nonlinearities and some of the interactions; keep those with strong signal, that also remain stable across models.\n\nCheck the models section for a thorough explanation on the features engineered for each model.\n\n---\n# ⚔️ The models - chosen to disagree\n\n## **1. Gradient Boosting Survival** (GBSA) \n- handles nonlinear effects and feature interactions\n- however, individual fits are noisy\n- Proposed solution: 8 diverse configs × 10 seeds = **80 models averaged** (as inspired by multiple public notebooks throughout the competition).\n\nThe configs deliberately spread to create *model diversity first*, then reduce variance by averaging.\n\n- learning rates from very gentle (0.005) to moderate (0.05),\n- small trees (max_depth = 2–3),\n- wide range of boosting lengths (200 → 2500 estimators),\n- subsampling and min‑leaf sizes to decorrelate trees.\n\n**Guiding principle**: Each model is imperfect; the ensemble is (very) stable.\n\n### Features:\n\n- `log_distance`, `proximity_risk` (inverse distance transformation) → fire impact diminishes nonlinearly with distance\n- `hazard_potential` (size x distance) → big things nearby are dangerous\n- `alignment_abs` (directionality) → is the fire moving towards the asset? could matter more than raw speed\n- `dist_slope_ci_0_5h` (trend) → captures the change in the first 5 hours (meters/per hour)\n- `event_start_month` (seasonality) → incorporates any potential seasonal patters \n- `log1p_area_first` (relative fire size) → grows quickly at first as area increases\n\nA small set of features for trees on data this small led to fewer splitting paths, hence less overfitting.\n\n## **2. Cox Proportional Hazards**\n- linear, regularized, and intentionally biased in a different direction → added for genuine ensemble diversity.\n- coefficients were shrunk by changing alpha values from very weak (.001) to strong regularization (5.0)\n\n**Guiding principle**: Cox is often wrong, but wrong *differently*, which is exactly what the ensemble needs.\n\n### Features:\n\n- `alignment_abs`, `log1p_area_first`, `num_perimeters_0_5h`\n- `log_distance`, `area_to_dist_ratio`, `fire_radius_km` (√(area / π)) → guide nonlinear effects with explicit physics-informed transforms\n- `log_eta` (basically `log(distance / closing speed)`), `eta_effective` (calculated as `distance / (closing speed + radial growth)`) → time to arrival dynamics; fire risk is *time-based* and CoxPH naturally models hazard over time\n- `near_speed_rank`, `far_threat_rank` (rank features) → ranks are robust to outliers \n- `is_summer`, `is_afternoon` (12-17), `zone_near` (within 5km), `zone_far` (over 5km), `has_movement` (reached more than 1 perimeter) → binary context flags to guide the model to interpretable findings\n- `threat_score` (alignment × speed / log-distance)  → composite risk that encodes direction, speed and distance (thus an interaction)\n\n**Why more features?** Regularization shrinks weak signals toward zero. \n\n### Final blend:\n**90% GBSA + 10% CoxPH** won consistently in cross-validation tests.\n\n---\n# 🔁 Cross-validation \n\nRandom folds can land badly - too few short-time events in one fold, too many censored cases in another. \n\nCross-validation was done by defining an event-time strata (censored / hit by 24h / hit by 48h / hit later) and use `RepeatedStratifiedKFold` with **3 repeats × 5 folds**. \n\n```\nModels: GBSA (8 configs × 10 seeds) + CoxPH (7 alphas × 10 seeds)\nBlend: 90% GBSA + 10% CoxPH, 72h=1.0\nCV: RepeatedStratifiedKFold(5, 3), event+time strata\n  c_index             :  0.94714 ± 0.01604  (range: 0.92016 - 0.97872)\n  brier_12            :  0.05391 ± 0.01179  (range: 0.03554 - 0.07416)\n  brier_24            :  0.02572 ± 0.00882  (range: 0.01377 - 0.03897)\n  brier_48            :  0.01310 ± 0.00639  (range: 0.00251 - 0.02359)\n  brier_72            :  0.00000 ± 0.00000  (range: 0.00000 - 0.00000)\n  weighted_brier      :  0.01296 ± 0.00243  (range: 0.00893 - 0.01725)\n  hybrid              :  0.97507 ± 0.00519  (range: 0.96823 - 0.98610)\n```\n---\n# 👉 What actually mattered \n- **Aggressive feature trimming**: only 7 stable features for trees to reduce any potential overfitting\n- **Different feature space** for CoxPH (16), to ensure it consistently improves CV \n- **Event-time stratified CV** to avoid fold luck\n- Predicting `prob_72h = 1.0`, which quietly wins the weighted Brier\n\n---\n# 💡The lessons\n\n- Trees need few, strong, interaction-ready features \n- Linear models need pre-shaped nonlinear signals \n- Small data needs discipline, not abundance\n- More features ≠ better model. On small data, a small stable set is gold. 🥇 \n\nFull implementation, details and approach are in the notebook **[HERE](https://www.kaggle.com/code/simonagradinaru/wids-26-avoid-boosting-the-flames-top-2)**. ",
      "votes": 1
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T08:48:13Z",
  "competition_id": 125681,
  "competition_slug": "WiDSWorldWide_GlobalDathon26",
  "team_id": 15162381,
  "solution_url": "/competitions/WiDSWorldWide_GlobalDathon26/writeups/avoid-boosting-the-flames"
}