CloudSRE-Environment / scripts /generate_final_plots.py
Harikishanth R
Final structural cleanup, Colab refactor, and massive Blog Post overhaul
46b088f
Raw
History Blame Contribute Delete
2.84 kB
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# Load data
mean_df = pd.read_csv(r'd:\Meta\rewardglobal_mean.csv')
best_df = pd.read_csv(r'd:\Meta\rewardglobal_best.csv')
# Extract columns
step = mean_df['Step']
mean_reward = mean_df.iloc[:, 1]
best_reward = best_df.iloc[:, 1]
# Set a beautiful, professional style
sns.set_theme(style="whitegrid", context="talk")
plt.rcParams['font.family'] = 'sans-serif'
# Create figure with high DPI for crispness
fig, ax = plt.subplots(figsize=(14, 7), dpi=300)
# Plot the raw data
ax.plot(step, mean_reward, label='Global Mean Reward (4-run group)', color='#1f77b4', linewidth=2, alpha=0.7)
ax.plot(step, best_reward, label='Global Best Reward', color='#2ca02c', linewidth=2, linestyle='--', alpha=0.8)
# Plot a smoothed trendline for the mean to show the learning curve clearly
smoothed_mean = mean_reward.rolling(window=5, min_periods=1).mean()
ax.plot(step, smoothed_mean, label='Smoothed Mean Trend (window=5)', color='#ff7f0e', linewidth=4)
# Get dynamic Y limits to place text correctly
y_min, y_max = ax.get_ylim()
y_text_pos = y_max - (y_max - y_min) * 0.05
# Background shading for curriculum tiers
ax.axvspan(0, 25.5, color='#e6f2ff', alpha=0.5, zorder=0)
ax.text(12.5, y_text_pos, 'Phase 1: Warmup Tier\n(Single isolated faults)',
ha='center', va='top', fontsize=13, fontweight='bold', color='#1f77b4')
ax.axvspan(25.5, 50, color='#f2e6ff', alpha=0.5, zorder=0)
ax.text(37.5, y_text_pos, 'Phase 2: Single Fault Tier\n(Faults + Misleading Red Herrings)',
ha='center', va='top', fontsize=13, fontweight='bold', color='#9467bd')
# Annotation for the breakthrough
# The biggest jump in mean reward happens at step 26 (-0.87 to +0.59)
ax.annotate('Policy Update Breakthrough:\nAgent learns to ignore red herrings',
xy=(26, 0.5975), xytext=(18, -0.2),
arrowprops=dict(facecolor='#d62728', shrink=0.05, width=2, headwidth=10),
fontsize=12, ha='right', va='center',
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", alpha=0.9))
# Labels, Title, and Formatting
ax.set_title('GRPO Reinforcement Learning Reward Curve (Qwen2.5-1.5B)',
fontsize=18, fontweight='bold', pad=20)
ax.set_xlabel('Training Step (Episode)', fontsize=15, fontweight='bold', labelpad=15)
ax.set_ylabel('Policy Reward', fontsize=15, fontweight='bold', labelpad=15)
# Beautiful legend
ax.legend(loc='lower right', fontsize=12, frameon=True, shadow=True, borderpad=1)
# Subtle grid
ax.grid(True, linestyle=':', alpha=0.6, color='gray')
sns.despine()
# Save the plot directly over the old one
plt.tight_layout()
save_path = r'd:\Meta\cloud_sre_v2\reward_curve.png'
plt.savefig(save_path, bbox_inches='tight')
print(f"Successfully generated breathtaking plot at: {save_path}")