CurryModel / utils /testing.py
jawwaadsabree's picture
Update curry_model.ipynb to reset execution counts, enhance model loading and prediction logic, and adjust input tensor shape for compatibility. Modify utils/testing.py to correct feature dimensions in reshaping and improve prediction output handling.
92b21c6
Raw History Blame Contribute Delete
3.6 kB
import numpy as np
import torch
import wandb
import plotly.graph_objects as go
from .model import get_model, get_loaders, fix_date, load_data, Config
from .prediction import fix_points
from wandb.sdk.wandb_config import Config as WandbConfig
def predict(model, loader, scaler, device, no_log=False):
model.eval() # Set model to evaluation mode
predictions = []
actuals = []
originalInputs = []
with torch.no_grad():
for inputs, labels in loader:
inputs = inputs.to(device)
outputs = model(inputs)
_originalInputs = scaler.inverse_transform(inputs.squeeze().cpu().numpy())
originalInputs.append(_originalInputs)
predictions.append(outputs.cpu().numpy())
actuals.append(labels.cpu().numpy())
predictions = np.concatenate(predictions)
actuals = np.concatenate(actuals)
pred_ys = []
actual_ys = []
zs = []
pred_ys = [fix_points(x, scaler) for x in predictions.flatten()]
actual_ys = [fix_points(y, scaler) for y in actuals.flatten()]
for date in originalInputs:
date = date[:, 0]
for i, row in enumerate(date.flatten()):
zs.append(row)
# Assuming 'zs' is a tensor, first convert it to a NumPy array or list
zs = zs.cpu().numpy() if isinstance(zs, torch.Tensor) else zs
# Now you can apply set and sort operations
zs = sorted(list(set(zs)))
zs = [fix_date(date) for date in zs][-30:] if len(zs) > 30 else [fix_date(date) for date in zs][15:]
# Create a figure
fig = go.Figure()
# pred_ys = [np.nan] * 15 + pred_ys
# actual_ys = [np.nan] * 15 + actual_ys
# Add Predictions plot
fig.add_trace(go.Scatter(x=zs, y=pred_ys, mode='lines+markers', name='Predictions'))
# Add Actual plot
fig.add_trace(go.Scatter(x=zs, y=actual_ys, mode='lines+markers', name='Actual'))
# Customize the layout (title, labels, etc.)
fig.update_layout(
title='Stephen Curry Points Prediction',
xaxis_title='Date',
yaxis_title='Points',
xaxis=dict(tickmode='array', tickvals=zs, ticktext=zs),
template='ggplot2', # Optional: Change plot theme
width=1500, # Width of the plot
height=400 # Height of the plot
)
if not no_log:
wandb.log({"predictions vs actuals": fig})
# Show the plot
fig.show()
def predict_only(config: Config | WandbConfig, scaler, device):
model, _, _ = get_model(config)
with wandb.init(project="curry-scraper", config=config.to_dict()):
_, _, validation_loader = get_loaders(config, scaler)
predict(model, validation_loader, scaler, device)
def predict_next_game(model, scaler, device):
last_15_df = load_data().tail(15)
last_15_games_features = last_15_df.copy()
last_15_games_features = scaler.fit_transform(last_15_games_features)
last_15_games_features = last_15_games_features.reshape(1, 15, 59) # Reshape for the model
last_15_df['Date'] = last_15_df['Date'].apply(fix_date)
model.to(device) # Ensure model is on the correct device
model.eval() # Set model to evaluation mode
# Assuming last_15_games_features is a NumPy array with the features of the last 15 games
inputs = torch.tensor(last_15_games_features).float().to(device) # Ensure the correct type and device
# Get the prediction from the model
with torch.no_grad():
prediction = model(inputs) # Output should be for the next game
# Return the predicted value (e.g., predicted points)
return fix_points(prediction.cpu().numpy(), scaler)