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

от автора

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

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

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

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

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

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

Использование библиотеки 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. Заходите в каталог и выбирайте интересующее вас направление. На странице каждого курса вы также можете зарегистрироваться на бесплатные уроки, которые проводятся практически каждую неделю.


ссылка на оригинал статьи https://habr.com/ru/articles/764680/