L o a d i n g
Создание системы рекомендаций на сайте с использованием Python и Scikit-learn Сайты

Системы рекомендаций играют ключевую роль в повышении вовлеченности пользователей и увеличении продаж на сайтах, особенно в интернет-магазинах. В этой статье мы разберем, как интегрировать систему рекомендаций в 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: Тестирование

Перед запуском протестируйте систему:

  1. Убедитесь, что данные корректно загружаются из базы данных.
  2. Проверьте, возвращает ли модель ожидаемые рекомендации (например, товары, которые часто покупаются вместе).
  3. Протестируйте производительность страницы товара с рекомендациями.

Для тестирования можно использовать Django TestCase или инструменты, такие как pytest.

Заключение

Мы создали систему рекомендаций для интернет-магазина, используя Python, Scikit-learn и Django. Эта система основана на коллаборативной фильтрации и может быть легко интегрирована в любой Django-проект. Для улучшения системы можно:

  • Добавить контентную фильтрацию, используя характеристики товаров.
  • Использовать более сложные алгоритмы, такие как матричные факторизации (SVD) из библиотеки Surprise.
  • Интегрировать персонализированные рекомендации для каждого пользователя.

Система рекомендаций — мощный инструмент для повышения пользовательского опыта и увеличения продаж. Попробуйте адаптировать этот код под свои нужды и экспериментируйте с данными, чтобы добиться максимальной эффективности!

Написать комментарий

Вы можете оставить комментарий автору статьи Обязательные поля помечены *