У цьому навчальному посібнику ми покажемо вам, як побудувати рекомендательну систему на основі штучного інтелекту, використовуючи бібліотеки Python, такі як Pandas, NumPy, Matplotlib та Seaborn. Ми використовуватимемо набір даних з рейтингами фільмів і створимо рекомендательну систему на основі колаборативного фільтрування, здатну пропонувати подібні фільми на основі вподобань користувачів. Ось що покриває цей посібник:
- Завантаження та об’єднання наборів даних.
- Дослідження та візуалізація рейтингів фільмів.
- Створення матриці користувач-об'єкт.
- Використання кореляцій для пошуку подібних фільмів.
Крок 1: Завантаження та об'єднання даних
Спочатку завантажте набір даних - u.data та MovieIdTitles з проекту рекомендательной системи на GitHub репозиторії ProjectPro та завантажте їх у своє середовище Google Colab.
1.1 Завантаження рейтингів користувачів
Файл з назвою u.data містить дані про користувачів, які оцінювали фільми. Він містить чотири стовпці: userid, itemid (ID фільму), rating (як сильно користувач оцінив його) та timestamp (коли він поставив оцінку). Завантажимо його і зробимо його зручним для читання.
import numpy as np
import pandas as pd
# Визначимо назви стовпців
column_names = ['user_id', 'item_id', 'rating', 'timestamp']
# Завантажимо набір даних
df = pd.read_csv('u.data', sep='\t', names=column_names)
# Виведемо перші 10 рядків
df.head(10)
Вивід:
Що відбувається?
- sep=’\t’ вказує Python, що файл розділений табуляцією.
- names=column_names додає зручні, описові заголовки. Без цього ми б дивилися на сирі, незрозумілі дані.
1.2 Додавання назв фільмів
ID фільмів самі по собі не дуже корисні (хто знає, що означає "itemid 123"?). На щастя, у нас є ще один файл, MovieId_Titles.txt, який співвідносить ці ID з реальними назвами фільмів.
movie_titles = pd.read_csv("Movie_Id_Titles.txt")
movie_titles.head()
Вивід:
Тепер давайте об'єднаємо ці два набори даних, щоб з'єднати рейтинги з назвами фільмів.
df = pd.merge(df,movie_titles,on='item_id')
df.head(10)
Ми додали назви фільмів до даних з рейтингами, що значно полегшує розуміння, який фільм отримав рейтинг і скільки.
Крок 2: Досліджуємо дані
Перед тим як приступити до рекомендацій, давайте краще ознайомимося з нашими даними. Це схоже на розуміння правил гри перед тим, як почати.
2.1 Який середній рейтинг фільмів?
Чи замислювалися ви, які фільми є улюбленими серед глядачів? Давайте обчислимо середній рейтинг для кожного фільму.
df.groupby(‘title’)[‘rating’].mean().sort_values(ascending=False).head()
Вивід:
Тут ми групуємо рейтинги по назвам фільмів, обчислюємо їх середнє значення та сортуємо результати від найкращого до найгіршого.
2.2 Скільки рейтингів має кожен фільм?
Деякі фільми можуть мати високі оцінки, але лише кілька голосів.
Давайте підрахуємо, скільки разів кожен фільм отримав оцінку.
df.groupby(‘title’)[‘rating’].count().sort_values(ascending=False).head()
Вивід:
Крок 3: Створимо підсумки рейтингів
Поєднаємо те, що ми вивчили — середні оцінки та кількість рейтингів — у дві окремі зручні таблиці.
ratings = pd.DataFrame(df.groupby('title')['rating'].mean())
ratings.head()
ratings['num of ratings'] = pd.DataFrame(df.groupby('title')['rating'].count())
ratings.head()
Це допомагає нам дізнатися не тільки, наскільки хороший кожен фільм, але й наскільки популярний він.
Крок 4: Візуалізація даних
Час для графіків! Давайте подивимося, як виглядають дані.
4.1 Скільки оцінок отримують фільми?
Чи є фільми, які мають безліч оцінок, а інші ледь отримали оцінку? Побудуємо графік.
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('white')
%matplotlib inline
plt.figure(figsize=(10,4))
ratings['num of ratings'].hist(bins=70)
Вивід:
4.2 Як оцінюються фільми?
Давайте подивимося на розподіл середніх оцінок.
plt.figure(figsize=(10,4))
ratings['rating'].hist(bins=70)
4.3 Чи отримують популярні фільми кращі оцінки?
Давайте перевіримо, чи є зв'язок між кількістю оцінок і середнім рейтингом.
sns.jointplot(x='rating',y='num of ratings',data=ratings,alpha=0.5)
Крок 5: Створення матриці користувач-об'єкт
Цей крок є основою нашої системи. Ми створимо величезну таблицю, де:
- Рядки = Користувачі
- Стовпці = Фільми
- Значення = Рейтинги
moviemat = df.pivot_table(index='user_id',columns='title',values='rating')
moviemat.head()
Тепер у нас є матриця користувачів і фільмів, які вони оцінили. Якщо клітинка пуста, це означає, що користувач не оцінив цей фільм.
ratings.sort_values('num of ratings',ascending=False).head(10)
ratings.head()
Крок 6: Пошук подібних фільмів
Ось і цікава частина — рекомендації!
6.1 Вибираємо фільм
Давайте почнемо з фільму "Зоряні війни" (1977). Ми візьмемо оцінки для цього фільму.
starwars_user_ratings = moviemat['Star Wars (1977)']
starwars_user_ratings.head()
6.2 Кореляція з іншими фільмами
Використовуючи кореляцію, ми обчислимо, наскільки кожен фільм схожий на "Зоряні війни" (1977).
similar_to_starwars = moviemat.corrwith(starwars_user_ratings)
similar_to_starwars
6.3 Очищення і фільтрація
Давайте очистимо це, видаливши значення NaN і використаємо DataFrame замість серії:
corr_starwars = pd.DataFrame(similar_to_starwars,columns=['Correlation'])
corr_starwars.dropna(inplace=True)
corr_starwars.head()
Тепер, якщо ми відсортуємо DataFrame за кореляцією, ми повинні отримати найбільш схожі фільми, хоча варто зазначити, що ми отримуємо деякі результати, які не зовсім мають сенс.
Це відбувається тому, що є багато фільмів, які користувачі дивляться лише один раз, і вони також подивились "Зоряні війни" (це був найпопулярніший фільм).
corr_starwars.sort_values('Correlation',ascending=False).head(10)
Давайте виправимо це, відфільтрувавши фільми, які мають менше 100 відгуків (це значення було вибрано на основі гістограми, яку ми розглядали раніше).
corr_starwars = corr_starwars.join(ratings['num of ratings'])
corr_starwars.head()
Тепер відсортуємо значення і помітимо, як заголовки мають значно більше сенсу:
Відфільтруйте фільми з понад 100 рейтингами та відсортуйте за схожістю
corr_starwars[corr_starwars['num of ratings'] > 100].sort_values('Correlation', ascending=False).head()
Тепер у вас є список фільмів, найбільш схожих на "Зоряні війни" (1977).
Ця система рекомендацій на основі штучного інтелекту в Python (надихнута цим репозиторієм GitHub) — це лише початок. Ви можете розвинути її, додавши розширене фільтрування або розгорнувши її як веб-додаток. Також можна навчитися будувати систему рекомендацій за допомогою алгоритмів машинного навчання, таких як KNN, байєсівські моделі тощо. Окрім традиційних методів, Великі мовні моделі (LLMs) відкривають захоплюючі можливості для створення передових систем рекомендацій. Завдяки своїй здатності розуміти контекст, аналізувати неструктуровані дані та генерувати значущі інсайти, LLM можуть створювати персоналізовані та динамічні рекомендації. Давайте дізнаємося, як побудувати систему рекомендацій за допомогою LLM. Дивіться як побудувати систему рекомендацій на Python в дії за допомогою цього детального відео-огляду!
Цей підручник надає покроковий посібник по створенню системи рекомендацій в Python, надаючи вам знання для створення рекомендацій на основі даних. Якщо ви новачок у системах рекомендацій або хочете досліджувати більше проектів, платформи, як Kaggle, ProjectPro, та GitHub пропонують посібники для початківців та набори даних, які допоможуть вам покращити ваші навички.
Перекладено з: How to Build a Recommendation System in Python?