ShrishtiAI-backend / server /test_4_classifiers.py
MEWTROS
My 6 can be your 9
5ccd893
"""
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()