MACHINE LEARNING

🎯 Project Idea: Book Recommendation Engine (Using Goodreads or Kaggle Dataset)

Below is a complete Python project using the Goodbooks-10k dataset to build a hybrid book recommendation engine using collaborative and content-based filtering.

📁 1. Setup and Data Loading

import pandas as pd

# Load datasets
books = pd.read_csv("books.csv")
ratings = pd.read_csv("ratings.csv")

# Sample the data for speed (optional)
ratings = ratings[ratings['book_id'] <= 500]

🧹 2. Data Preprocessing

# Merge ratings with book info
df = ratings.merge(books, left_on='book_id', right_on='id')

# Keep relevant columns
df = df[['user_id', 'title', 'authors', 'average_rating', 'ratings_count', 'rating']]

🧠 3. Content-Based Filtering Using TF-IDF on Book Titles

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# TF-IDF vectorization
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(books['title'].fillna(''))

# Cosine similarity matrix
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

# Index mapping
indices = pd.Series(books.index, index=books['title'].str.lower()).drop_duplicates()

def recommend_books_by_title(title, top_n=5):
    idx = indices.get(title.lower())
    if idx is None:
        return ["Title not found."]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    book_indices = [i[0] for i in sim_scores[1:top_n+1]]
    return books['title'].iloc[book_indices].tolist()

🤝 4. Collaborative Filtering Using Surprise SVD

from surprise import Dataset, Reader, SVD
from surprise.model_selection import train_test_split

# Format for Surprise
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(ratings[['user_id', 'book_id', 'rating']], reader)
trainset, testset = train_test_split(data, test_size=0.2)

# SVD model
model = SVD()
model.fit(trainset)

# Predict function
def predict_rating(user_id, book_id):
    pred = model.predict(user_id, book_id)
    return pred.est

🔁 5. Hybrid Recommendation Function

def hybrid_recommend(user_id, title, top_n=5):
    # Get content-based recommendations
    similar_books = recommend_books_by_title(title, top_n=15)
    similar_books_ids = books[books['title'].isin(similar_books)]['id'].tolist()

    # Rank by predicted rating
    predictions = [(book_id, predict_rating(user_id, book_id)) for book_id in similar_books_ids]
    sorted_predictions = sorted(predictions, key=lambda x: x[1], reverse=True)

    top_books_ids = [x[0] for x in sorted_predictions[:top_n]]
    return books[books['id'].isin(top_books_ids)][['title', 'authors']]

6. Try It Out

# Example usage
print(hybrid_recommend(user_id=123, title="The Hobbit", top_n=5))

📦 Optional Enhancements:

  • Add a Streamlit UI for interactivity
  • Use genre tags, description, or author as additional features
  • Improve recommendations with LightFM or Deep Learning

Leave a Reply

Your email address will not be published. Required fields are marked *