Multi-year ENSO (El Niño Southern Oscillation) climate control using Proximal Policy Optimization (PPO). This project demonstrates how a reinforcement learning agent can learn control strategies to modulate climate indices and increase the probability of multi-year El Niño or La Niña events.
- Environment: XRO (Extended Reconstructed Ocean) climate model
- Algorithm: PPO (Proximal Policy Optimization) from Stable Baselines 3
- Goal: Learn climate control actions that promote multi-year ENSO events
- Tracking: Weights & Biases (W&B) integration for experiment monitoring
- Data: ORAS5 SST indices from 1979-2022
enso-rl/
├── config/ # Configuration modules
│ ├── __init__.py
│ ├── env_config.py # Environment parameters
│ ├── train_config.py # Training hyperparameters
│ └── wandb_config.py # W&B settings
│
├── envs/ # Gymnasium environments
│ ├── __init__.py
│ └── xro_env.py # XROMultiYearEnv class
│
├── callbacks/ # Training callbacks
│ ├── __init__.py
│ └── wandb_callback.py # W&B logging callback
│
├── utils/ # Utility functions
│ ├── __init__.py
│ ├── data_processing.py # Data loading & preprocessing
│ ├── physics.py # XRO physics simulation
│ ├── enso_classifier.py # ENSO event classification
│ └── evaluation.py # Evaluation utilities
│
├── scripts/ # Executable scripts
│ ├── __init__.py
│ ├── train.py # Main training script
│ └── evaluate.py # Evaluation & analysis script
│
├── notebooks/ # Jupyter notebooks
│ ├── 01_setup.ipynb # Initial setup
│ ├── 02_train.ipynb # Training walkthrough
│ ├── 03_eval.ipynb # Evaluation analysis
│ └── 04_analysis.ipynb # Detailed analysis
│
├── data/ # Data directory
│ └── XRO_indices_oras5.nc # Observational indices
│
├── models/ # Saved models (empty)
├── wandb/ # W&B run logs (generated)
├── enso-rl.ipynb # Original notebook (preserved)
├── pyproject.toml # Project dependencies
└── README.md # This file
The project uses the following key packages:
stable-baselines3: RL algorithmsgymnasium: Environment interfacexarray: Data handlingwandb: Experiment trackingXRO: Climate modelnumpy,pandas,matplotlib: Data processing & visualization
See pyproject.toml for complete list.
Ensure you have Python 3.12+ installed:
python --version# Using pip
pip install -r requirements.txt
# Or using uv (if installed)
uv syncThe observational data is automatically downloaded during training if not present. To pre-download:
mkdir -p data
wget -c -P data/ https://github.com/senclimate/XRO/raw/main/data/XRO_indices_oras5.ncFor experiment tracking with W&B:
# Configure W&B
wandb login
# Update config/wandb_config.py with your entity name if neededpython scripts/train.py# Debug mode with reduced training
python scripts/train.py --debug --epochs 50 --lr 0.0001
# Full training with custom learning rate
python scripts/train.py --epochs 6000 --lr 0.0003
# Training without W&B logging
python scripts/train.py --no-wandbOptions:
--debug Enable debug mode with verbose output
--epochs EPOCHS Override training epochs (default: 6000)
--lr LR Override learning rate (default: 0.0003)
--no-wandb Disable Weights & Biases logging
--help Show help message
python scripts/evaluate.py --model ppo_enso_model.zip# All evaluations (basic + intervention + trajectory)
python scripts/evaluate.py --model ppo_enso_model.zip --all
# Basic agent vs baseline comparison
python scripts/evaluate.py --model ppo_enso_model.zip --basic
# Interventional analysis (ablation study showing variable importance)
python scripts/evaluate.py --model ppo_enso_model.zip --intervention --steps 1200
# Trajectory analysis with time series export
python scripts/evaluate.py --model ppo_enso_model.zip --trajectory --months 2400
# Custom evaluation steps
python scripts/evaluate.py --model ppo_enso_model.zip --steps 10000- Basic Evaluation: Compares multi-year event frequency (agent vs baseline)
- Interventional Analysis: Shows impact of each controllable variable (ablation study)
- Trajectory Analysis: Generates
trajectory_analysis.csvwith detailed time series data - Results Summary: Printed to console for immediate analysis
All configurations are defined in the config/ directory as Python dataclasses. Modify these files before training to customize behavior.
threshold = 0.5 # ENSO event threshold magnitude (ONI standard)
action_scale = [0.15, ...] # Scaling factors for each control variable
max_steps = None # None = continuous (no episode resets)train_epochs = 6000 # Total training timesteps
n_steps = 600 # Policy update frequency
learning_rate = 0.0003 # PPO learning rate
debug_mode = True # Verbose training outputproject = "enso-rl"
entity = "your-username" # Change to your W&B username
mode = "online" # "online", "offline", or "disabled"The training script automatically logs:
- Real-time metrics: Episode rewards, policy loss, value loss, KL divergence
- Hyperparameters: All settings and configurations
- Model artifacts: Trained model checkpoints
- Evaluation results: Performance comparison data
View results: https://wandb.ai/your-username/enso-rl
================================
ENSO RL AGENT TRAINING PIPELINE
================================
SETTING UP ENVIRONMENT
======================
1. Loading observational data...
Loaded 10 variables
2. Preparing XRO model...
XRO model fitted
3. Initializing Weights & Biases...
View experiment at: https://wandb.ai/...
4. Creating Gymnasium environment...
Environment created
STARTING PPO TRAINING
====================
Total timesteps: 6000
Learning rate: 0.0003
...
✓ Training completed successfully!
✓ Model saved to ppo_enso_model.zip
# Train for short period to test setup
python scripts/train.py --debug --epochs 100 --lr 0.0001
# Evaluate the test model
python scripts/evaluate.py --model ppo_enso_model.zip --basic# 1. Train the agent
python scripts/train.py --epochs 6000 --lr 0.0003
# 2. Run comprehensive evaluation
python scripts/evaluate.py --model ppo_enso_model.zip --all
# 3. View results
# - Check console output for statistics summary
# - Check trajectory_analysis.csv for detailed time series data
# - View W&B dashboard at https://wandb.ai/your-username/enso-rl# Test different learning rates
for lr in 0.0001 0.0003 0.001; do
echo "Training with learning rate = $lr"
python scripts/train.py --epochs 3000 --lr $lr --no-wandb
python scripts/evaluate.py --model ppo_enso_model.zip --basic
done# Train without W&B (useful for offline work or testing)
python scripts/train.py --no-wandb --epochs 100 --debugInteractive notebooks for detailed exploration:
- 01_setup.ipynb: Data loading, exploration, and XRO model setup
- 02_train.ipynb: Step-by-step training walkthrough
- 03_eval.ipynb: Evaluation and performance analysis
- 04_analysis.ipynb: Deep dive into ENSO event patterns
Run notebooks:
# Using Jupyter Lab
jupyter lab
# Using Jupyter Notebook
jupyter notebook
# Or use VSCode integrated notebook support
# Open any .ipynb file in VS Code and select "Run"- Multi-year Event Probability: Percentage of time steps containing multi-year ENSO events
- Delta R (ΔR): Change in average reward when disabling each action (more negative = more important)
- Classified Event: Type of ENSO event for a trajectory (Multi-year El Niño, La Niña, etc.)
- Improvement: How much better the agent performs vs baseline
With RL Agent Control: 42.5% # Agent achieves 42.5% multi-year events
Without Control (Baseline): 15.0% # Baseline achieves 15.0%
Improvement: +27.5pp # 27.5 percentage point gain
Improvement ratio: 2.83x # Agent is 2.83x better than baseline
Lower ΔR values indicate more critical variables:
Feature Importance (most important first):
1. IOB - ΔR: -0.77 (CRITICAL - largest impact)
2. NPMM - ΔR: -0.64 (CRITICAL - important for multi-year events)
3. WWV - ΔR: -0.11 (MODERATE - some impact)
4. Others - ΔR: ~0.00 (MINIMAL - little impact)
Problem: "Model not found" error
# Solution: Ensure training completed successfully
ls -la ppo_enso_model.zipProblem: Data file not found
# Solution: Download manually
mkdir -p data
wget -P data/ https://github.com/senclimate/XRO/raw/main/data/XRO_indices_oras5.ncProblem: XRO import errors
# Solution: Reinstall XRO package
pip install --upgrade XROProblem: W&B login fails
# Solution: Re-login or disable W&B
wandb login --relogin
# Or
python scripts/train.py --no-wandbProblem: Permission denied on wandb files
# Solution: Clean wandb cache
rm -rf ~/.wandb
wandb loginProblem: Training is slow or out of memory
# Solution: Reduce batch size or training steps
python scripts/train.py --epochs 1000 --lr 0.0001 --debugFor questions, issues, or suggestions:
- Open a GitHub Issue
- Check existing issues and discussions
- Review the reference materials above
Original Notebook: enso-rl.ipynb (preserved for reference)
Refactored Code Structure: Organized into modular components following ML best practices