
Привет, Хабр!
Рекомендательные системы играют ключевую роль в организации и упорядочении всей информации. Они помогают нам находить интересные фильмы, музыку, товары, новости и многое другое, сэкономив наше время и улучшив ваш пользовательский экспириенс.
Давайте представим ситуацию: вы заходите на стриминговую платформу, чтобы посмотреть фильм. Вы видите огромный каталог с тысячами фильмов, и вы далеко не всегда знаете, что выбрать, рекомендательные системы анализируют ваши предпочтения, исследуют вашу историю просмотров, исследуют подобные фильмы и, в конечном итоге, предлагают вам список фильмов, которые, как они считают, вас заинтересуют.
И это только один из бесчисленных примеров использования рекомендательных систем.
Сбор и предварительная обработка данных
Сбор данных — это первый и один из самых важных шагов при создании рекомендательной системы на основе анализа поведения пользователей:
Использование библиотеки 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/
Добавить комментарий