""" Quick standalone test: verify all 4 binary disaster-type classifiers load correctly and produce predictions from synthetic feature data. """ import os, sys, joblib, numpy as np, pandas as pd from pathlib import Path MODEL_BASE = r"D:\INTERNSHIP FINAL YEAR PROJECT\models for research paper\HORIZON1" MODELS = { "Storm": os.path.join(MODEL_BASE, "output_of_NOstorm_vs_storm_forecast", "binary_NOstorm_storm_pipeline.joblib"), "Flood": os.path.join(MODEL_BASE, "output_of_NOflood_vs_flood_forecast", "binary_NOflood_flood_pipeline.joblib"), "Drought": os.path.join(MODEL_BASE, "output_of_NOdrought_vs_drought_forecast", "binary_NOdrought_drought_pipeline.joblib"), "Landslide": os.path.join(MODEL_BASE, "output_of_NOmassmovement_vs_massmovement_forecast", "binary_NOmassmovement_massmovement_pipeline.joblib"), } # 36 array features × 8 stats = 288 + 9 scalar = 297 total ARRAY_FEATURES = [ 'temperature_C','humidity_%','wind_speed_mps','precipitation_mm', 'surface_pressure_hPa','solar_radiation_wm2','temperature_max_C','temperature_min_C', 'specific_humidity_g_kg','dew_point_C','wind_speed_10m_mps','cloud_amount_%', 'sea_level_pressure_hPa','surface_soil_wetness_%','wind_direction_10m_degrees', 'evapotranspiration_wm2','root_zone_soil_moisture_%', 'temp_normalized','temp_range','discomfort_index','heat_index', 'wind_precip_interaction','solar_temp_ratio','pressure_anomaly', 'high_precip_flag','adjusted_humidity','wind_chill', 'solar_radiation_anomaly','weather_severity_score', 'moisture_stress_index','evaporation_deficit','soil_saturation_index', 'atmospheric_instability','drought_indicator','flood_risk_score','storm_intensity_index' ] STATS = ['mean','min','max','std','median','q25','q75','skew'] SCALAR_FEATURES = [ 'soil_type','elevation_m','pop_density_persqkm','land_cover_class', 'ndvi','annual_precip_mm','annual_mean_temp_c','mean_wind_speed_ms', 'impervious_surface_pct' ] def build_feature_columns(): cols = [] for feat in ARRAY_FEATURES: for stat in STATS: cols.append(f"{feat}_{stat}") cols.extend(SCALAR_FEATURES) return cols def make_synthetic_row(seed=42): """Generate one row of 297 features with realistic-ish random values.""" rng = np.random.RandomState(seed) cols = build_feature_columns() vals = rng.uniform(-1, 3, size=len(cols)) # broad range so selector/scaler get something return pd.DataFrame([vals], columns=cols) def main(): print("=" * 70) print(" DISASTER-TYPE CLASSIFIER VERIFICATION") print("=" * 70) features = make_synthetic_row() print(f"\nSynthetic feature vector: {features.shape[1]} columns (expect 297)\n") all_ok = True for name, path in MODELS.items(): tag = f"[{name:>10}]" # --- file exists? --- if not os.path.exists(path): print(f"{tag} FAIL pipeline file not found: {path}") all_ok = False continue # --- load --- try: pipe = joblib.load(path) except Exception as e: print(f"{tag} FAIL could not load pipeline: {e}") all_ok = False continue # --- inspect contents --- keys = list(pipe.keys()) if isinstance(pipe, dict) else [] required = {'model', 'scaler', 'selector'} if not required.issubset(set(keys)): print(f"{tag} FAIL missing keys in pipeline (got {keys})") all_ok = False continue selector = pipe['selector'] scaler = pipe['scaler'] model = pipe['model'] sel_feats = pipe.get('selected_features', []) target = pipe.get('target_disaster', '?') neg_lab = pipe.get('negative_label', '?') # --- run pipeline --- try: X_sel = selector.transform(features) X_sc = scaler.transform(X_sel) pred = model.predict(X_sc)[0] proba = model.predict_proba(X_sc)[0] prob_pos = proba[1] if len(proba) > 1 else proba[0] except Exception as e: print(f"{tag} FAIL prediction error: {e}") all_ok = False continue label = target if pred == 1 else neg_lab print(f"{tag} OK") print(f" pipeline keys : {keys}") print(f" selected feats : {len(sel_feats)}") print(f" target/neg : {target} / {neg_lab}") print(f" prediction : {pred} ({label})") print(f" P(disaster) : {prob_pos:.4f}") print(f" full proba : {[round(float(p),4) for p in proba]}") print() print("=" * 70) if all_ok: print(" RESULT: ALL 4 CLASSIFIERS LOADED & PREDICTED SUCCESSFULLY") else: print(" RESULT: SOME CLASSIFIERS FAILED — see above") print("=" * 70) if __name__ == "__main__": main()