File size: 1,719 Bytes
6eff894
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import joblib, os

df = pd.read_csv("results/summary.csv")

# --- Create new features ---
df["tomorrow"] = df["temp_max_c"].shift(-1)
df["temp_range"] = df["temp_max_c"] - df["temp_min_c"]
df["lag1"] = df["temp_max_c"].shift(1)    # yesterday
df["lag2"] = df["temp_max_c"].shift(2)    # two days ago
df["ma3"] = df["temp_max_c"].rolling(3).mean()  # 3-day moving average

df = df.dropna()

# Define feature matrix X and label y
features = [
    "temp_max_c",
    "temp_min_c",
    "temp_range",
    "lag1",
    "lag2",
    "ma3",
]
X = df[features].values
y = df["tomorrow"].values

# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, shuffle=False
)

# Train model
model = LinearRegression()
model.fit(X_train, y_train)

# Predict and evaluate
y_pred = model.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
rmse = mse**0.5
r2 = r2_score(y_test, y_pred)

# Baseline: naive "tomorrow = today"
baseline_pred = df["temp_max_c"].shift(1).dropna().values[-len(y_test):]
baseline_mse = mean_squared_error(y_test, baseline_pred)
baseline_rmse = baseline_mse**0.5

print(" MODEL PERFORMANCE (Multi-feature)")
print(f"RMSE: {rmse:.3f}")
print(f"R²:   {r2:.3f}")
print("\n🧠 BASELINE (naive)")
print(f"RMSE: {baseline_rmse:.3f}")
print("\n Better than baseline?", "YES ✅" if rmse < baseline_rmse else "NO ❌")

os.makedirs("models", exist_ok=True)
joblib.dump(model, "models/temp_regressor_multi.joblib")
print("\n💾 Saved model: models/temp_regressor_multi.joblib")