{
  "model_id": "phase_b_rf_v1_56",
  "algorithm": "sklearn.ensemble.RandomForestClassifier",
  "algorithm_note": "UNCHANGED \u2014 v1.56 swap_curv_pos (mandate gate: AP>= and F1>= with real lift)",
  "parent_model": "phase_b_rf_v1_52",
  "trained_at": "2026-07-28T15:09:05.609720Z",
  "status": "research_screening",
  "frozen": true,
  "frozen_at": "2026-07-29",
  "freeze_doc": "docs/100-phase-b-rf-v156-FREEZE.md",
  "freeze_page": "web/pages/phase-b-rf-status.html",
  "operational_use": false,
  "cap_auto_issue": false,
  "confidence": "exploratory",
  "n_positives": 12,
  "n_negatives": 60,
  "features": [
    "rain_24h_mm",
    "rain_72h_mm",
    "amphoe_mean_rain_mm",
    "flood_risk_index",
    "clay_g_per_kg_idw",
    "month_cos",
    "dist_mrt_construction_km",
    "dist_transit_km",
    "dist_waterway_km",
    "dist_major_road_km",
    "bma_drain_pipe_count",
    "bma_drain_pipe_length_km",
    "bma_drain_pipe_mean_dim_m",
    "bma_drain_coverage",
    "elev_m",
    "slope_deg",
    "relief_m",
    "twi_proxy",
    "psi_vel_mm_yr_idw",
    "psi_subsidence_mm_yr_idw",
    "dist_nearest_psi_km",
    "psi_coverage",
    "gw_prov_coverage",
    "gw_well_count_2km",
    "gw_well_count_5km",
    "dist_nearest_gw_well_km",
    "gw_mean_static_m_5km",
    "copdem_curvature",
    "dist_osm_tunnel_km",
    "pos_copdem_curv",
    "relief_x_inv_urban",
    "curv_x_log_urban",
    "relief_x_log_urban",
    "log_road_dense_2km",
    "dist_urban_core_km",
    "dist_rail_station_km",
    "psi_k3_std",
    "hii_max_rain",
    "wp_x_psi_std",
    "log_gob_1km",
    "log_gob_2km",
    "slope_x_gob_far",
    "relief_x_gob"
  ],
  "hyperparameters": {
    "n_estimators": 500,
    "max_depth": 4,
    "min_samples_leaf": 2,
    "max_features": "sqrt",
    "class_weight": "balanced_subsample"
  },
  "validation": {
    "protocol": "leave_one_positive_out_vs_all_negatives",
    "folds": [
      {
        "hold_id": "bkk-faichai-2024-08-25",
        "hold_prob": 0.6013296605038977
      },
      {
        "hold_id": "bkk-kasakomol-2024-10-06",
        "hold_prob": 0.42235787406029135
      },
      {
        "hold_id": "nbi-chaiphruek-2024-11-05",
        "hold_prob": 0.36204944106426384
      },
      {
        "hold_id": "nbi-sainoi-2025-07-19",
        "hold_prob": 0.08207493061747238
      },
      {
        "hold_id": "nbi-chaengwattana-2025-07-22",
        "hold_prob": 0.7296347286563386
      },
      {
        "hold_id": "nbi-chaengwattana-2025-08-14",
        "hold_prob": 0.707634218046183
      },
      {
        "hold_id": "bkk-samsen-vajira-2025-09-24",
        "hold_prob": 0.4048708149473773
      },
      {
        "hold_id": "ssk-rama2-2026-01-17",
        "hold_prob": 0.3065133743506007
      },
      {
        "hold_id": "bkk-charan-faichai-2026-05-09",
        "hold_prob": 0.49544013118177505
      },
      {
        "hold_id": "bkk-latphrao-2026-06-16",
        "hold_prob": 0.3244002739543893
      },
      {
        "hold_id": "bkk-wongwianyai-2026-07-08",
        "hold_prob": 0.6129119670205039
      },
      {
        "hold_id": "pte-latlumkaeo-2026-07-22",
        "hold_prob": 0.3009280129868197
      }
    ],
    "lopo_auc_mean": 0.9680555555555557,
    "oof_ap": 0.9452380952380952,
    "best_f1": 0.9565217391304348,
    "best_threshold": 0.3
  },
  "enhancement_doc": "docs/066-phase-b156-curv-pos.md",
  "model_path": "models/phase_b/rf_v1_56.joblib",
  "note": "FROZEN 2026-07-29 — open-feature plateau after v1.57–v1.88. Do not promote new web default without MEA/MWA/LiCSBAS or denser labels. See docs/100-phase-b-rf-v156-FREEZE.md"
}