varunbilluri/Recommended_System
1
1import pandas as pd2import torch3import torch.optim as optim4from torch.utils.data import TensorDataset, DataLoader5from model import MatrixFactorizationWithGenres # Import your model6 7# Load the datasets8movies = pd.read_csv('movie.csv')9ratings = pd.read_csv('rating.csv')10 11# Preprocess genres12movies['genres'] = movies['genres'].apply(lambda x: x.split('|'))13all_genres = set([genre for sublist in movies['genres'].tolist() for genre in sublist])14 15# Create binary columns for genres16for genre in all_genres:17 movies[genre] = movies['genres'].apply(lambda x: 1 if genre in x else 0)18 19# Merge ratings and movies on 'movieId'20ratings = ratings.merge(movies[['movieId'] + list(all_genres)], on='movieId')21 22# Reindex user and movie IDs23user_ids = ratings['userId'].astype('category').cat.codes24movie_ids = ratings['movieId'].astype('category').cat.codes25 26# Convert data to tensors27user_tensor = torch.tensor(user_ids.values, dtype=torch.long)28movie_tensor = torch.tensor(movie_ids.values, dtype=torch.long)29genre_tensor = torch.tensor(ratings[list(all_genres)].values, dtype=torch.float)30rating_tensor = torch.tensor(ratings['rating'].values, dtype=torch.float)31 32# Create dataset and dataloader33dataset = TensorDataset(user_tensor, movie_tensor, genre_tensor, rating_tensor)34dataloader = DataLoader(dataset, batch_size=64, shuffle=True)35 36# Define model, optimizer, and loss function37num_users = ratings['userId'].nunique()38num_movies = ratings['movieId'].nunique()39num_genres = len(all_genres)40embedding_dim = 5041 42model = MatrixFactorizationWithGenres(num_users, num_movies, num_genres, embedding_dim)43optimizer = optim.Adam(model.parameters(), lr=0.01)44criterion = torch.nn.MSELoss()45 46# Training loop47epochs = 548for epoch in range(epochs):49 model.train()50 running_loss = 0.051 for user_batch, movie_batch, genre_batch, rating_batch in dataloader:52 optimizer.zero_grad()53 output = model(user_batch, movie_batch, genre_batch)54 loss = criterion(output, rating_batch)55 loss.backward()56 optimizer.step()57 running_loss += loss.item()58 print(f"Epoch {epoch+1}/{epochs}, Loss: {running_loss / len(dataloader)}")59 60# Save model61model_path = "matrix_factorization_with_genres.pth"62torch.save(model.state_dict(), model_path)63 64print("Training complete and model saved.")65 