Системы рекомендаций играют ключевую роль в повышении вовлеченности пользователей и увеличении продаж на сайтах, особенно в интернет-магазинах. В этой статье мы разберем, как интегрировать систему рекомендаций в Django-проект, используя библиотеку машинного обучения Scikit-learn. Мы рассмотрим процесс создания коллаборативной фильтрации на основе пользовательских предпочтений, подготовим данные, обучим модель и интегрируем её в веб-приложение.
Что такое система рекомендаций?
Система рекомендаций — это алгоритм, который предлагает пользователям товары, услуги или контент на основе их предпочтений, истории взаимодействий или поведения других пользователей. В интернет-магазинах такие системы часто используются для рекомендаций товаров, например, «Вам также может понравиться» или «Похожие товары».
Существует несколько типов систем рекомендаций:
- Контентная фильтрация: основывается на характеристиках товаров (например, категории, бренда).
- Коллаборативная фильтрация: использует данные о взаимодействиях пользователей с товарами.
- Гибридные системы: комбинируют оба подхода.
В этой статье мы сосредоточимся на коллаборативной фильтрации, так как она эффективна для персонализированных рекомендаций и хорошо реализуется с помощью Scikit-learn.
Необходимые инструменты
Для реализации системы рекомендаций нам понадобятся:
- Python 3.8+: основной язык программирования.
- Django 4.x: фреймворк для веб-разработки.
- Scikit-learn: библиотека для машинного обучения.
- Pandas: для работы с данными.
- NumPy: для числовых операций.
- Django REST Framework (опционально): для создания API.
- PostgreSQL/MySQL: база данных для хранения информации о пользователях и товарах.
Установите зависимости с помощью команды:
pip install django scikit-learn pandas numpy djangorestframework
Шаг 1: Подготовка данных
Для коллаборативной фильтрации нам нужны данные о взаимодействиях пользователей с товарами. Обычно это матрица, где строки — пользователи, столбцы — товары, а значения — оценки (например, рейтинг от 1 до 5) или бинарные взаимодействия (1 — купил/просмотрел, 0 — нет).
Пример данных (CSV-файл user_item_ratings.csv
):
user_id, item_id, rating
1, 101, 5
1, 102, 3
2, 101, 4
2, 103, 2
...
Эти данные можно собрать из базы данных интернет-магазина, фиксируя действия пользователей (покупки, просмотры, добавления в корзину).
Модели Django
Создадим модели для хранения информации о пользователях, товарах и взаимодействиях. В файле models.py
приложения Django добавим:
from django.db import models
from django.contrib.auth.models import User
class Item(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class UserInteraction(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
rating = models.IntegerField(default=0) # Оценка от 1 до 5
timestamp = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'item')
Эти модели позволяют хранить информацию о товарах и взаимодействиях пользователей с ними.
Шаг 2: Реализация алгоритма рекомендаций
Для коллаборативной фильтрации мы будем использовать метод ближайших соседей (k-NN) из Scikit-learn. Этот алгоритм находит похожих пользователей или товары на основе их взаимодействий.
Подготовка данных
Сначала загрузим данные из базы данных в Pandas DataFrame и создадим матрицу пользователь-товар:
import pandas as pd
from django.contrib.auth.models import User
from .models import UserInteraction, Item
def prepare_data():
# Получаем данные взаимодействий
interactions = UserInteraction.objects.all().values('user_id', 'item_id', 'rating')
df = pd.DataFrame(list(interactions))
# Создаем матрицу пользователь-товар
user_item_matrix = df.pivot(index='user_id', columns='item_id', values='rating').fillna(0)
return user_item_matrix
Обучение модели
Используем алгоритм k-NN для поиска похожих товаров. Создадим файл recommender.py
:
from sklearn.neighbors import NearestNeighbors
import numpy as np
class Recommender:
def __init__(self, n_neighbors=5):
self.model = NearestNeighbors(metric='cosine', algorithm='brute', n_neighbors=n_neighbors)
self.user_item_matrix = None
def fit(self, user_item_matrix):
self.user_item_matrix = user_item_matrix
self.model.fit(user_item_matrix.T) # Транспонируем, чтобы искать похожие товары
def recommend(self, item_id, n_recommendations=5):
if item_id not in self.user_item_matrix.columns:
return []
# Находим ближайшие товары
distances, indices = self.model.kneighbors(
self.user_item_matrix[item_id].values.reshape(1, -1),
n_neighbors=n_recommendations + 1
)
# Возвращаем ID рекомендованных товаров
recommended_items = [self.user_item_matrix.columns[idx] for idx in indices.flatten()]
return [item_id for item_id in recommended_items if item_id != item_id][:n_recommendations]
Этот код обучает модель на основе матрицы пользователь-товар и возвращает список рекомендованных товаров для заданного товара.
Шаг 3: Интеграция с Django
Теперь интегрируем систему рекомендаций в Django-проект. Создадим представление для отображения рекомендаций на странице товара.
Представление
В файле views.py
:
from django.shortcuts import render, get_object_or_404
from .models import Item
from .recommender import Recommender
from .utils import prepare_data
def item_detail(request, item_id):
item = get_object_or_404(Item, id=item_id)
# Подготовка данных и обучение модели
user_item_matrix = prepare_data()
recommender = Recommender(n_neighbors=5)
recommender.fit(user_item_matrix)
# Получение рекомендаций
recommended_item_ids = recommender.recommend(item_id, n_recommendations=5)
recommended_items = Item.objects.filter(id__in=recommended_item_ids)
return render(request, 'shop/item_detail.html', {
'item': item,
'recommended_items': recommended_items
})
Шаблон
Создадим шаблон templates/shop/item_detail.html
:
<div class="item-detail">
<h1>{{ item.name }}</h1>
<p>{{ item.description }}</p>
<p>Цена: {{ item.price }} руб.</p>
<h2>Рекомендуемые товары</h2>
<ul>
{% for recommended_item in recommended_items %}
<li>
<a href="{% url 'item_detail' recommended_item.id %}">{{ recommended_item.name }}</a>
({{ recommended_item.price }} руб.)
</li>
{% empty %}
<li>Нет рекомендаций</li>
{% endfor %}
</ul>
</div>
Шаг 4: Оптимизация и кэширование
Обучение модели и подготовка данных могут быть ресурсоемкими, особенно при большом количестве пользователей и товаров. Для оптимизации:
- Кэширование: Используйте Django cache framework для хранения матрицы пользователь-товар и результатов рекомендаций.
- Асинхронные задачи: Для обучения модели используйте Celery, чтобы не блокировать основной поток.
- Периодическое обновление: Переобучайте модель раз в день/неделю, а не при каждом запросе.
Пример кэширования с использованием Django:
from django.core.cache import cache
def get_recommendations(item_id):
cache_key = f'recommendations_{item_id}'
recommendations = cache.get(cache_key)
if not recommendations:
user_item_matrix = prepare_data()
recommender = Recommender(n_neighbors=5)
recommender.fit(user_item_matrix)
recommendations = recommender.recommend(item_id, n_recommendations=5)
cache.set(cache_key, recommendations, timeout=3600) # Кэш на 1 час
return recommendations
Шаг 5: Тестирование
Перед запуском протестируйте систему:
- Убедитесь, что данные корректно загружаются из базы данных.
- Проверьте, возвращает ли модель ожидаемые рекомендации (например, товары, которые часто покупаются вместе).
- Протестируйте производительность страницы товара с рекомендациями.
Для тестирования можно использовать Django TestCase или инструменты, такие как pytest.
Заключение
Мы создали систему рекомендаций для интернет-магазина, используя Python, Scikit-learn и Django. Эта система основана на коллаборативной фильтрации и может быть легко интегрирована в любой Django-проект. Для улучшения системы можно:
- Добавить контентную фильтрацию, используя характеристики товаров.
- Использовать более сложные алгоритмы, такие как матричные факторизации (SVD) из библиотеки Surprise.
- Интегрировать персонализированные рекомендации для каждого пользователя.
Система рекомендаций — мощный инструмент для повышения пользовательского опыта и увеличения продаж. Попробуйте адаптировать этот код под свои нужды и экспериментируйте с данными, чтобы добиться максимальной эффективности!
Написать комментарий