"""
PyOccam Landslide Susceptibility Demo
Reconstructability Analysis for GIS Applications
Works on Google Colab, Linux, macOS, and Windows
"""
# ==== INSTALL ==== comment the next line out after
# installing, until you need to install again
import pyoccam
# ==== LOAD LANDSLIDE DATA ====
print("="*70)
print("PyOccam - Landslide Susceptibility Analysis")
print("Reconstructability Analysis for GIS")
print("="*70)
data = pyoccam.load_landslides()
print(f"\nDataset: {data.n_samples} samples, {data.n_features} features")
print(f"Target variable: {data.target_name} (Landslide presence)")
print(f"\nFeatures (GIS layers):")
for i, name in enumerate(data.feature_names):
print(f" {name}")
# ==== CONFIGURE ====
manager = data.manager
manager.set_report_separator(pyoccam.SPACESEP)
# ==== SEARCH (full-up includes loops) ====
print("\n" + "="*70)
print("Running FULL-UP search (models with feedback loops)...")
print("="*70)
search_report = manager.generate_search_report("full-up", levels=7, width=3)
print(search_report[:3000]) # First part of report
# ==== GET BEST MODEL ====
# Different model selection criteria - uncomment your preference:
# Option 1: Best by BIC (Bayesian Information Criterion) - penalizes complexity most
best = manager.get_best_model_by_bic()
# Option 2: Best by AIC (Akaike Information Criterion) - less penalty for complexity
# best = manager.get_best_model_by_aic()
# Option 3: Best by information captured (highest %dH explained)
# best = manager.get_best_model_by_information()
# Option 4: Best statistically significant model (alpha < 0.05)
# best = manager.get_best_model_by_info_alpha()
print(f"\n{'='*70}")
print(f"*** Best model by BIC: {best} ***")
print(f"{'='*70}")
# Show all selection criteria for comparison:
print("\nModel Selection Comparison:")
print(f" Best by BIC: {manager.get_best_model_by_bic()}")
print(f" Best by AIC: {manager.get_best_model_by_aic()}")
print(f" Best by Information: {manager.get_best_model_by_information()}")
print(f" Best by Info+Alpha: {manager.get_best_model_by_info_alpha()}")
# ==== FIT REPORT ====
print(f"\nFit Report for {best}")
print("-"*70)
fit_report = manager.generate_fit_report(best, target_state="0")
print(fit_report)
# ==== CONFUSION MATRIX ANALYSIS ====
print("\n" + "="*70)
print("Landslide Classification Performance")
print("="*70)
cm = manager.get_confusion_matrix(best, target_state="0")
if cm.get('has_values', False):
print(f"\nConfusion Matrix (Landslide Prediction):")
print(f" Predicted")
print(f" No LS Landslide")
print(f"Actual No LS TN={cm['train_tn']:6.0f} FP={cm['train_fp']:6.0f}")
print(f"Actual Landslide FN={cm['train_fn']:6.0f} TP={cm['train_tp']:6.0f}")
print(f"\nPerformance Metrics:")
print(f" Accuracy: {cm['train_accuracy']:.1%} (overall correct)")
print(f" Sensitivity: {cm['train_sensitivity']:.1%} (landslides correctly identified)")
print(f" Specificity: {cm['train_specificity']:.1%} (non-landslides correctly identified)")
print(f" Precision: {cm['train_precision']:.1%} (predicted landslides that are real)")
print(f" F1 Score: {cm['train_f1_score']:.3f}")
else:
print("Confusion matrix not available for this model")
print("\n" + "="*70)
print("✓ Landslide susceptibility analysis complete!")
print("="*70)