Weather_Simulation / model.py
theabeerrai's picture
Upload 8 files
513c1a9 verified
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
import joblib
import os
class TrafficRiskModel:
def __init__(self, model_path="traffic_model.pkl", encoder_path="encoder.pkl"):
self.model_path = model_path
self.encoder_path = encoder_path
self.model = None
self.encoder = LabelEncoder()
self.conditions = ["Clear", "Cloudy", "Rainy", "Storm", "Other"]
# Fit encoder with all possible categories
self.encoder.fit(self.conditions)
def generate_synthetic_data(self, n_samples=1000):
"""Generates synthetic data for training the model."""
np.random.seed(42)
temps = np.random.uniform(5, 45, n_samples)
rains = np.random.uniform(0, 50, n_samples)
conditions = np.random.choice(self.conditions, n_samples)
data = pd.DataFrame({
'temp': temps,
'rain': rains,
'condition': conditions
})
# Calculate a pseudo risk score to create non-trivial labels
# 0: Low, 1: Medium, 2: High
def calculate_label(row):
score = 0
if row['temp'] > 35 or row['temp'] < 10: score += 1
if row['rain'] > 10: score += 1
if row['rain'] > 25: score += 1
if row['condition'] in ['Rainy', 'Storm']: score += 1
if row['condition'] == 'Storm': score += 1
if score <= 1: return "Low"
if score <= 3: return "Medium"
return "High"
data['risk_level'] = data.apply(calculate_label, axis=1)
return data
def train(self):
"""Trains the model on synthetic data."""
data = self.generate_synthetic_data()
X = data[['temp', 'rain', 'condition']].copy()
X['condition'] = self.encoder.transform(X['condition'])
y = data['risk_level']
self.model = RandomForestClassifier(n_estimators=100, random_state=42)
self.model.fit(X, y)
# Save model and encoder
joblib.dump(self.model, self.model_path)
joblib.dump(self.encoder, self.encoder_path)
print(f"Model trained and saved to {self.model_path}")
def load(self):
"""Loads the model and encoder if they exist."""
if os.path.exists(self.model_path) and os.path.exists(self.encoder_path):
self.model = joblib.load(self.model_path)
self.encoder = joblib.load(self.encoder_path)
return True
return False
def predict(self, temp, rain, condition):
"""Predicts traffic risk level based on weather inputs."""
if self.model is None:
if not self.load():
self.train()
# Ensure condition is known to encoder
if condition not in self.encoder.classes_:
condition = "Other"
encoded_condition = self.encoder.transform([condition])[0]
input_data = pd.DataFrame([[temp, rain, encoded_condition]],
columns=['temp', 'rain', 'condition'])
prediction = self.model.predict(input_data)[0]
probabilities = self.model.predict_proba(input_data)[0]
confidence = max(probabilities)
return prediction, confidence
if __name__ == "__main__":
model = TrafficRiskModel()
model.train()
print("Test Prediction:", model.predict(28, 12, "Rainy"))