weather-forecasting-api / scripts /evaluate_model.py
moosetape's picture
feat: global city search, per-city XGBoost training, SSE progress, bug fixes
1c65d7d
Raw
History Blame Contribute Delete
1.64 kB
import pandas as pd
import joblib
import numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error, mean_squared_error
df = pd.read_csv('weather.csv')
df['datetime'] = pd.to_datetime(df['datetime'])
df = df.sort_values('datetime').reset_index(drop=True)
# Recreate lag features exactly as train_model.py does
for lag in range(1, 8):
df[f'temp_lag{lag}'] = df['temp'].shift(lag)
df = df.dropna().reset_index(drop=True)
# Use the exact same feature set as training
FEATURES = ["humidity", "windspeed", "cloudcover"] + [f"temp_lag{i}" for i in range(1, 8)]
X = df[FEATURES]
y = df['temp']
scaler = joblib.load('models/scaler.pkl')
model = joblib.load('models/xgb_model.pkl')
X_scaled = scaler.transform(X)
pred = model.predict(X_scaled)
mae = mean_absolute_error(y, pred)
rmse = np.sqrt(mean_squared_error(y, pred))
print(f"MAE: {mae:.4f}, RMSE: {rmse:.4f}")
os.makedirs("results", exist_ok=True)
# Save actual vs predicted CSV for generate_graphs.py
out_df = df[['datetime', 'temp']].copy()
out_df['pred'] = pred
out_df.to_csv("results/actual_vs_pred.csv", index=False)
with open("results/metrics.txt", "w") as f:
f.write(f"MAE: {mae:.4f}\nRMSE: {rmse:.4f}\n")
plt.figure(figsize=(10, 5))
plt.plot(df['datetime'], y, label='Actual Temperature', linewidth=2)
plt.plot(df['datetime'], pred, label='Predicted Temperature', linewidth=2, linestyle='--')
plt.legend()
plt.title("Actual vs Predicted Temperature")
plt.xlabel("Date")
plt.ylabel("Temperature (°C)")
plt.tight_layout()
plt.savefig("results/performance_plot.png")
print("Saved plot to results/performance_plot.png")