Как стать автором
Обновить
565.35
OTUS
Цифровые навыки от ведущих экспертов

Создание рекомендательных систем на основе анализа поведения пользователей на сайте

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров6.9K

Привет, Хабр!

Рекомендательные системы играют ключевую роль в организации и упорядочении всей информации. Они помогают нам находить интересные фильмы, музыку, товары, новости и многое другое, сэкономив наше время и улучшив ваш пользовательский экспириенс.

Давайте представим ситуацию: вы заходите на стриминговую платформу, чтобы посмотреть фильм. Вы видите огромный каталог с тысячами фильмов, и вы далеко не всегда знаете, что выбрать, рекомендательные системы анализируют ваши предпочтения, исследуют вашу историю просмотров, исследуют подобные фильмы и, в конечном итоге, предлагают вам список фильмов, которые, как они считают, вас заинтересуют.

И это только один из бесчисленных примеров использования рекомендательных систем.

Сбор и предварительная обработка данных

Сбор данных - это первый и один из самых важных шагов при создании рекомендательной системы на основе анализа поведения пользователей:

Использование библиотеки Requests для получения данных с веб-сайта

import requests

# URL веб-сайта, с которого собираем данные
url = 'https://example.com/user-behavior-data'

# Отправляем GET-запрос на сайт и получаем данные
response = requests.get(url)

# Проверяем успешность запроса
if response.status_code == 200:
    user_data = response.json()  # Предполагается, что данные приходят в формате JSON
    # Здесь можно провести первичную обработку данных
else:
    print('Ошибка при получении данных')

Сбор данных из логов сервера

import re

# Путь к лог-файлу сервера
log_file_path = '/var/log/server.log'

# Открываем лог-файл и считываем строки
with open(log_file_path, 'r') as log_file:
    log_data = log_file.readlines()

# Пример анализа строк лога и извлечения нужных данных
user_actions = []
for line in log_data:
    if re.search(r'User (\d+) performed action', line):
        user_id = re.search(r'User (\d+) performed action', line).group(1)
        action = re.search(r'Action: (.+)', line).group(1)
        user_actions.append((user_id, action))

Использование API стороннего сервиса

import requests

# URL API стороннего сервиса для получения данных о поведении пользователей
api_url = 'https://example-api.com/user-behavior'

# Отправляем запрос к API и получаем данные
response = requests.get(api_url)

if response.status_code == 200:
    user_behavior_data = response.json()
    # Здесь можно провести обработку данных и извлечь необходимую информацию
else:
    print('Ошибка при запросе к API')

Будьте внимательны при сборе данных, убедитесь, что вы собираете только необходимую информацию и соблюдаете правила конфиденциальности данных пользователей.

После сбора данных необходимо их обработать и проанализировать, чтобы выделить ключевые паттерны и тенденции:

Агрегация данных по пользователям и действиям

from collections import defaultdict

# Предположим, у нас есть список user_actions с данными о действиях пользователей
user_actions = [('user1', 'click'), ('user2', 'like'), ('user1', 'purchase'), ...]

# Создаем словарь для агрегации данных
user_data_aggregated = defaultdict(list)

# Агрегируем данные по пользователям
for user, action in user_actions:
    user_data_aggregated[user].append(action)

Вычисление статистических показателей

import numpy as np

# Предположим, у нас есть список покупок пользователей
purchases = [10.5, 20.0, 15.75, 30.0, ...]

# Вычисляем среднее значение и стандартное отклонение
mean_purchase = np.mean(purchases)
std_deviation = np.std(purchases)

Визуализация данных

import matplotlib.pyplot as plt

# Предположим, у нас есть данные о количестве посещений сайта в разные дни
days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт']
visits = [1200, 1400, 1100, 1500, 1300]

# Строим график
plt.plot(days, visits, marker='o', linestyle='-', color='b')
plt.xlabel('Дни недели')
plt.ylabel('Количество посещений')
plt.title('Количество посещений сайта по дням недели')
plt.grid(True)
plt.show()

Очистка и преобразование данных

Очистка данных - это важный этап, чтобы убедиться в качестве данных и избавиться от шума:

Удаление дубликатов

import pandas as pd

# Предположим, у нас есть DataFrame с данными
df = pd.DataFrame({'user_id': [1, 2, 2, 3, 4], 'action': ['click', 'like', 'like', 'purchase', 'click']})

# Удаляем дубликаты по столбцам 'user_id' и 'action'
df_cleaned = df.drop_duplicates(subset=['user_id', 'action'])

Заполнение пропущенных значений

import pandas as pd

# Предположим, у нас есть DataFrame с пропущенными значениями
df = pd.DataFrame({'user_id': [1, 2, 3, 4], 'age': [25, None, 30, 35]})

# Заполняем пропущенные значения средним значением
mean_age = df['age'].

mean()
df['age'].fillna(mean_age, inplace=True)

Преобразование категориальных данных в числовые

import pandas as pd

# Предположим, у нас есть DataFrame с категориальными данными
df = pd.DataFrame({'user_id': [1, 2, 3, 4], 'gender': ['male', 'female', 'male', 'female']})

# Преобразуем столбец 'gender' в числовой формат с помощью кодирования
df_encoded = pd.get_dummies(df, columns=['gender'], drop_first=True)

Очистка и преобразование данных помогут вам подготовить данные для дальнейшего анализа и построения рекомендательной системы.

Не забывайте, что точные методы сбора, обработки и очистки данных будут зависеть от конкретных требований вашего проекта и характера данных, с которыми вы работаете.

Методы анализа поведения пользователей

Матрица взаимодействий

Матрица взаимодействий - это основной инструмент при работе с рекомендательными системами. Она представляет собой двумерную матрицу, в которой строки соответствуют пользователям, а столбцы - элементам (например, фильмам, товарам, статьям и т. д.). Значения в ячейках матрицы представляют степень взаимодействия пользователя с элементами. Эти значения могут быть бинарными (пользователь взаимодействовал с элементом или нет) или числовыми (например, рейтинг, количество просмотров).

Пример Python-кода для создания матрицы взаимодействий:

import numpy as np

# Предположим, у нас есть данные о рейтингах фильмов от пользователей
ratings = np.array([
    [5, 4, 0, 0, 0],
    [0, 0, 3, 4, 0],
    [2, 0, 0, 0, 5],
    [0, 0, 0, 4, 4]
])

# Создаем матрицу взаимодействий (бинарную: 1 - взаимодействие, 0 - отсутствие взаимодействия)
interaction_matrix = (ratings > 0).astype(int)

Коллаборативная фильтрация

Коллаборативная фильтрация - это метод, который опирается на схожесть между пользователями или элементами. Схожесть может быть вычислена на основе истории взаимодействий пользователей с элементами. Есть два основных подхода к коллаборативной фильтрации: пользователь-пользователь (User-User Collaborative Filtering) и элемент-элемент (Item-Item Collaborative Filtering).

Пример Python-кода для коллаборативной фильтрации с использованием библиотеки scikit-learn:

from sklearn.metrics.pairwise import cosine_similarity

# Предположим, у нас есть матрица взаимодействий interaction_matrix
# Вычисляем схожесть между пользователями (User-User Collaborative Filtering)
user_similarity = cosine_similarity(interaction_matrix)

# Вычисляем схожесть между элементами (Item-Item Collaborative Filtering)
item_similarity = cosine_similarity(interaction_matrix.T)  # Транспонируем матрицу для элементов

Методы контентной фильтрации

Методы контентной фильтрации основаны на анализе характеристик элементов и профилей пользователей. Они позволяют строить рекомендации, учитывая сходство между характеристиками элементов и интересами пользователей.

Пример Python-кода для методов контентной фильтрации:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

# Предположим, у нас есть DataFrame с информацией о фильмах
movies_df = pd.DataFrame({
    'movie_id': [1, 2, 3],
    'title': ['Movie A', 'Movie B', 'Movie C'],
    'genre': ['Action', 'Drama', 'Comedy'],
    'description': ['Action-packed thriller', 'Drama about life', 'Comedy for laughs']
})

# Преобразуем текстовые данные (описание) в числовой формат с помощью TF-IDF
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(movies_df['description'])

# Вычисляем схожесть между фильмами на основе TF-IDF
content_similarity = cosine_similarity(tfidf_matrix)

Машинное обучение в рекомендательных системах

Машинное обучение в рекомендательных системах позволяет создавать модели, которые могут предсказывать интересы пользователей и рекомендовать элементы на основе этих предсказаний. Это включает в себя использование различных алгоритмов машинного обучения, таких как регрессия или классификация.

Пример Python-кода для создания модели рекомендательной системы с использованием библиотеки scikit-learn:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# Предположим, у нас есть данные о взаимодействии пользователей с элементами
X = features  # Матрица признаков
y = labels  # Целевая переменная

# Разделяем данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создаем модель (например, логистическую регрессию) и обучаем её
model = LogisticRegression()
model.fit(X_train, y_train)

# Делаем предсказания
y_pred = model.predict(X_test)

Машинное обучение дает возможность создавать более сложные и точные модели, но требует большего объема данных и вычислительных ресурсов. Комбинирование различных методов часто приводит к созданию наиболее эффективных рекомендательных систем.

Создание рекомендательной системы с использованием Python

Python предоставляет множество библиотек, удобных для работы с данными и машинным обучением, таких как Pandas, NumPy, Scikit-learn, TensorFlow, PyTorch и др.

Импорт нескольких распространенных библиотек:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.neighbors import NearestNeighbors
import tensorflow as tf
from tensorflow import keras

Загрузка данных и подготовка датасета

Загрузка и подготовка данных - важный этап. Вам потребуется обработать и очистить данные, а также подготовить их в формате, пригодном для обучения модели рекомендательной системы. Этот этап может включать в себя объединение данных, заполнение пропущенных значений и масштабирование.

Пример кода для загрузки данных с использованием Pandas:

# Загрузка данных из CSV файла
data = pd.read_csv('user_interaction_data.csv')

# Подготовка данных (пример: объединение информации о пользователях и элементах)
user_data = pd.read_csv('user_data.csv')
item_data = pd.read_csv('item_data.csv')
merged_data = pd.merge(data, user_data, on='user_id').merge(item_data, on='item_id')

Разработка модели рекомендательной системы

Разработка модели - один из наиболее интересных этапов. Выбор модели будет зависеть от типа данных и задачи. Модели могут быть основаны на коллаборативной фильтрации, контентной фильтрации, нейронных сетях и других методах.

Пример Python-кода для создания модели с использованием библиотеки TensorFlow/Keras:

# Создание модели нейронной сети
model = keras.Sequential([
    keras.layers.Embedding(num_users, embedding_dim, input_length=user_item_matrix.shape[1]),
    keras.layers.Flatten(),
    keras.layers.Dense(16, activation='relu'),
    keras.layers.Dense(1, activation='linear')
])

# Компиляция модели
model.compile(optimizer='adam', loss='mean_squared_error')

Обучение и оценка модели

Обучение модели включает в себя передачу данных модели для выявления паттернов и зависимостей. Оценка модели позволяет измерить ее производительность на тестовых данных. Для рекомендательных систем, часто используется среднеквадратичная ошибка (MSE) или другие метрики, в зависимости от задачи.

Пример кода для обучения и оценки модели:

# Разделение данных на обучающий и тестовый наборы
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)

# Обучение модели
history = model.fit([train_data['user_id'], train_data['item_id']], train_data['rating'], 
                    epochs=10, batch_size=64, validation_data=([test_data['user_id'], test_data['item_id']], test_data['rating']))

# Оценка модели
predictions = model.predict([test_data['user_id'], test_data['item_id']])
mse = mean_squared_error(test_data['rating'], predictions)
print(f'Mean Squared Error: {mse}')

Тюнинг и оптимизация модели

Оптимизация модели включает в себя подбор гиперпараметров, оптимизацию функции потерь и улучшение производительности. Этот этап может потребовать многократного экспериментирования с разными параметрами модели и методами регуляризации.

Пример Python-кода для оптимизации модели с использованием библиотеки Scikit-learn:

from sklearn.model_selection import GridSearchCV

# Определение сетки параметров для подбора
param_grid = {'n_neighbors': [3, 5, 7], 'metric': ['cosine', 'euclidean']}

# Создание модели k-Nearest Neighbors и запуск GridSearchCV
knn = NearestNeighbors()
grid_search = GridSearchCV(knn, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# Вывод наилучших параметров
print(f'Best Parameters: {grid_search.best_params_}')

Реализация рекомендательной системы на веб-сайте

Интеграция модели в веб-приложение может быть выполнена различными способами, в зависимости от ваших предпочтений и инфраструктуры. Два примера интеграции модели в веб-приложение с использованием Flask и Django:

Интеграция с использованием Flask

from flask import Flask, request, jsonify
import model  # Ваш модуль с моделью

app = Flask(__name__)

@app.route('/recommend', methods=['POST'])
def recommend():
    user_id = request.json['user_id']
    # Получите рекомендации от вашей модели
    recommendations = model.get_recommendations(user_id)
    return jsonify(recommendations)

if __name__ == '__main__':
    app.run()

Интеграция с использованием Django

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from . import model  # Ваш модуль с моделью

@csrf_exempt
def recommend(request):
    if request.method == 'POST':
        user_id = request.POST.get('user_id')
        # Получите рекомендации от вашей модели
        recommendations = model.get_recommendations(user_id)
        return JsonResponse({'recommendations': recommendations})

Обработка запросов от пользователей

Обработка запросов от пользователей включает в себя прием данных от клиента (в данном случае, пользователя), передачу этих данных модели для получения рекомендаций и отправку рекомендаций обратно пользователю:

Обработка запросов с использованием Flask

import requests

user_id = 123  # Пример ID пользователя
data = {'user_id': user_id}
response = requests.post('http://localhost:5000/recommend', json=data)

if response.status_code == 200:
    recommendations = response.json()
    print(f'Recommendations for user {user_id}: {recommendations}')
else:
    print('Error in making recommendations')

Обработка запросов с использованием JavaScript и AJAX (для веб-страницы)

<!DOCTYPE html>
<html>
<head>
    <title>Recommendations</title>
</head>
<body>
    <button onclick="getRecommendations()">Get Recommendations</button>
    <div id="recommendations"></div>

    <script>
        function getRecommendations() {
            var user_id = 123;  // Пример ID пользователя
            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/recommend', true);
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    var response = JSON.parse(xhr.responseText);
                    var recommendations = response.recommendations;
                    document.getElementById('recommendations').innerHTML = 'Recommendations: ' + recommendations.join(', ');
                }
            };
            var data = JSON.stringify({user_id: user_id});
            xhr.send(data);
        }
    </script>
</body>
</html>

Отображение рекомендаций на сайте

Отображение рекомендаций на сайте зависит от дизайна и интерфейса вашего веб-приложения. Вам может потребоваться использовать HTML, CSS и JavaScript для интеграции рекомендаций в интерфейс сайта.

Отображение рекомендаций с использованием Flask и Jinja2 (шаблонизатор Flask)

from flask import Flask, render_template
import model  # Ваш модуль с моделью

app = Flask(__name__)

@app.route('/recommendations/<user_id>')
def show_recommendations(user_id):
    recommendations = model.get_recommendations(user_id)
    return render_template('recommendations.html', recommendations=recommendations)

Отображение рекомендаций с использованием JavaScript и DOM-манипуляций (для веб-страницы)

<!DOCTYPE html>
<html>
<head>
    <title>Recommendations</title>
</head>
<body>
    <div id="recommendations"></div>

    <script>
        // Получите рекомендации (например, с помощью AJAX) и отобразите их на странице
        var recommendations = ["Item 1", "Item 2", "Item 3"];  // Пример рекомендаций
        var recommendationsDiv = document.getElementById('recommendations');
        recommendationsDiv.innerHTML = 'Recommendations: ' + recommendations.join(', ');
    </script>
</body>
</html>

Интеграция рекомендательной системы в веб-приложение позволяет предоставлять персонализированный контент пользователям, что может значительно улучшить их опыт на вашем сайте. Помните об удобстве пользовательского интерфейса и дизайне, чтобы обеспечить позитивное взаимодействие с вашими рекомендациями.

Оценка и улучшение рекомендательной системы

Существует несколько метрик, которые помогают измерить производительность вашей рекомендательной системы:

1. Среднеквадратичная ошибка (Mean Squared Error, MSE)

MSE измеряет разницу между рейтингами, предсказанными моделью, и фактическими рейтингами пользователей. Ниже приведен пример Python-кода для вычисления MSE:

from sklearn.metrics import mean_squared_error

# Предположим, у нас есть фактические рейтинги (actual) и предсказанные рейтинги (predicted)
actual = [4, 5, 3, 2, 4]
predicted = [3.5, 4.8, 2.5, 1.8, 4.2]

# Вычисляем MSE
mse = mean_squared_error(actual, predicted)
print(f'Mean Squared Error: {mse}')
Mean Squared Error: 0.12400000000000003

2. Средняя абсолютная ошибка (Mean Absolute Error, MAE)

MAE также измеряет разницу между фактическими и предсказанными рейтингами, но она не учитывает квадраты ошибок. Пример Python-кода для вычисления MAE:

from sklearn.metrics import mean_absolute_error

# Предположим, у нас есть фактические рейтинги (actual) и предсказанные рейтинги (predicted)
actual = [4, 5, 3, 2, 4]
predicted = [3.5, 4.8, 2.5, 1.8, 4.2]

# Вычисляем MAE
mae = mean_absolute_error(actual, predicted)
print(f'Mean Absolute Error: {mae}')
Mean Absolute Error: 0.32000000000000006

Тестирование и сравнение с другими методами

1. Тестирование с использованием кросс-валидации

Вы можете использовать кросс-валидацию для оценки производительности вашей модели на разных наборах данных:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

# Предположим, у нас есть модель рекомендательной системы
model = LinearRegression()

# Вычисляем средний MSE с использованием кросс-валидации
mse_scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
mse_mean = -mse_scores.mean()
print(f'Average MSE: {mse_mean}')

2. Сравнение с другими методами

Чтобы сравнить производительность вашей системы с другими методами, вы можете реализовать их и сравнить метрики качества. Например, вы можете сравнить производительность различных алгоритмов коллаборативной фильтрации или контентной фильтрации:

# Предположим, у нас есть две модели: model1 и model2
mse1 = mean_squared_error(actual, model1_predicted)
mse2 = mean_squared_error(actual, model2_predicted)

if mse1 < mse2:
    print('Model 1 performs better.')
else:
    print('Model 2 performs better.')

Итеративное улучшение системы

Рекомендательные системы - это процесс постоянного улучшения. Основываясь на оценках, тестировании и сравнении, вы можете выявить слабые места вашей системы и попытаться их улучшить. Это может включать в себя изменение методов, добавление новых функций или оптимизацию параметров модели:

# Предположим, вы улучшили модель с новыми параметрами или методами
improved_model = ImprovedRecommender()

# Оцените производительность улучшенной модели
mse_improved = mean_squared_error(actual, improved_model.predicted_ratings)

if mse_improved < mse:
    print('Improved model performs better.')
else:
    print('Original model is still better.')

Пример реализации рекомендации товаров на электронном магазине

Шаг 1: Сбор и подготовка данных

Первым шагом является сбор данных о товарах, пользователях и их взаимодействии с товарами. Для простоты предположим, что у нас есть CSV-файлы, содержащие информацию о товарах и действиях пользователей (просмотры, покупки и т. д.).

# Загрузка данных
import pandas as pd

# Загрузка данных о товарах
products_df = pd.read_csv('products.csv')

# Загрузка данных о действиях пользователей
user_actions_df = pd.read_csv('user_actions.csv')

Шаг 2: Предобработка данных

После загрузки данных необходимо провести предобработку, включающую в себя обработку пропущенных значений, преобразование категориальных данных и т. д.

# Обработка пропущенных значений
products_df.fillna(0, inplace=True)

# Преобразование категориальных данных (например, категорий товаров) в числовой формат
from sklearn.preprocessing import LabelEncoder

label_encoder = LabelEncoder()
products_df['category_encoded'] = label_encoder.fit_transform(products_df['category'])

Шаг 3: Создание матрицы взаимодействий

Для построения рекомендательной системы нам нужно создать матрицу взаимодействий между пользователями и товарами. Мы будем использовать матрицу, в которой строки представляют пользователей, а столбцы - товары, и значения в ячейках отражают взаимодействие (например, оценки или количество покупок).

# Создание матрицы взаимодействий
interaction_matrix = user_actions_df.pivot_table(index='user_id', columns='product_id', values='interaction', fill_value=0)

# Преобразование матрицы в NumPy массив
interaction_matrix = interaction_matrix.values

Шаг 4: Разработка модели рекомендательной системы

Для этого примера мы будем использовать метод коллаборативной фильтрации на основе сходства пользователей. Мы можем использовать библиотеку scikit-learn для создания модели.

from sklearn.metrics.pairwise import cosine_similarity

# Вычисление сходства пользователей
user_similarity = cosine_similarity(interaction_matrix)

# Создание функции для получения рекомендаций для конкретного пользователя
def get_recommendations(user_id, num_recommendations=5):
    # Находим наиболее похожих пользователей
    similar_users = user_similarity[user_id]
    similar_users_idx = similar_users.argsort()[::-1][1:]  # Исключаем самого пользователя
    
    # Получаем товары, с которыми взаимодействовали похожие пользователи
    recommendations = set()
    for similar_user_idx in similar_users_idx:
        similar_user_actions = interaction_matrix[similar_user_idx]
        new_recommendations = set(products_df.loc[similar_user_actions > 0, 'product_id'])
        recommendations.update(new_recommendations)
        if len(recommendations) >= num_recommendations:
            break
    
    # Исключаем товары, с которыми пользователь уже взаимодействовал
    user_actions = interaction_matrix[user_id]
    recommendations.difference_update(set(products_df.loc[user_actions > 0, 'product_id']))
    
    return list(recommendations)[:num_recommendations]

Шаг 5: Тестирование и оценка модели

Теперь мы можем протестировать нашу модель и оценить её производительность с помощью метрик, таких как среднеквадратичная ошибка (MSE) или средняя абсолютная ошибка (MAE), а также сравнить её с другими методами.

# Выбор случайного пользователя для тестирования
import random

test_user_id = random.randint(0, interaction_matrix.shape[0] - 1)

# Получение рекомендаций для тестового пользователя
recommendations = get_recommendations(test_user_id)
print(f'Recommendations for user {test_user_id}: {recommendations}')

# Оценка производительности модели (например, по MSE)
actual_actions = interaction_matrix[test_user_id]
predicted_actions = [1 if product_id in recommendations else 0 for product_id in products_df['product_id']]
mse = mean_squared_error(actual_actions, predicted_actions)
print(f'Mean Squared Error: {mse}')

Заключение

Рекомендательные системы помогают пользователям находить интересный и полезный контент, а бизнесу - увеличивать уровень вовлеченности пользователей и повышать прибыль. Рекомендательные системы - это область с бесконечными возможностями, и они ожидают ваших идей и инноваций.

А если вы интересуетесь анализом данных, хочу порекомендовать линейку курсов по анализу от OTUS. Заходите в каталог и выбирайте интересующее вас направление. На странице каждого курса вы также можете зарегистрироваться на бесплатные уроки, которые проводятся практически каждую неделю.

Теги:
Хабы:
Всего голосов 9: ↑8 и ↓1+9
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS