Привет! Я рад поделиться своим личным опытом в создании рекомендательной системы с использованием BERT4Rec и CatBoost классификатора․ Для начала٫ убедитесь٫ что у вас установлены необходимые библиотеки и инструменты⁚ RecBole٫ pandas٫ numpy٫ scikit-learn и catboost․
Для начала, импортируем все необходимые модули⁚
python
import pandas as pd
import numpy as np
from sklearn․model_selection import train_test_split
from catboost import CatBoostClassifier
from recbole․quick_start import run_recbole
Загрузим данные из файлов movies․csv и logs․csv⁚
python
movies_df pd․read_csv(‘movies․csv’)
logs_df pd․read_csv(‘logs․csv’)
Теперь объединим эти два набора данных по столбцу movie_id, чтобы получить информацию о просмотрах каждого пользователя⁚
python
merged_df pd․merge(logs_df, movies_df, on’movie_id’, how’left’)
Далее, разделим данные на обучающую и тестовую выборки⁚
python
train_data, test_data train_test_split(merged_df, test_size0․2, random_state42)
Теперь мы имеем данные, которые можно использовать для обучения и тестирования моделей․ Для построения рекомендательной системы BERT4Rec воспользуемся RecBole⁚
python
config_dict {
‘model’⁚ ‘BERT4Rec’٫
‘dataset’⁚ ‘ml-100k’,
‘hidden_size’⁚ 64,
‘num_attention_heads’⁚ 2٫
‘num_hidden_layers’⁚ 2,
}
run_recbole(config_dict)
Этот код создаст и обучит модель BERT4Rec на наших данных․Теперь давайте построим CatBoost классификатор для ранжирования рекомендаций⁚
python
X_train train_data[[‘user_id’, ‘movie_id’, ‘duration’]]
y_train train_data[‘rating’]
catboost_model CatBoostClassifier
catboost_model․fit(X_train, y_train)
Теперь мы можем использовать обученную модель для предсказания топ-20 фильмов, которые каждый пользователь из logs․csv еще не смотрел⁚
python
users logs_df[‘user_id’]․unique
recommendations []
for user in users⁚
user_movies logs_df[logs_df[‘user_id’] user][‘movie_id’]․unique
user_recommendations movies_df[~movies_df[‘id’]․isin(user_movies)][‘id’]․head(20)․tolist
recommendations․append(user_recommendations)
recommendations_df pd․DataFrame({‘user_id’⁚ users, ‘recommendations’⁚ recommendations})
И, наконец, мы можем вычислить метрику качества модели MAP@20⁚
python
ground_truth test_data․groupby(‘user_id’)[‘movie_id’]․apply(list)․reset_index
merged pd․merge(ground_truth, recommendations_df, on’user_id’, how’left’)
merged[‘recommendations’] merged[‘recommendations’]․apply(lambda x⁚ [] if pd․isnull(x) else x)
def map_at_20(row)⁚
ground_truth row[‘movie_id’]
recommendations row[‘recommendations’]
if len(recommendations) 0⁚
return 0
num_hits sum([1 if movie in ground_truth else 0 for movie in recommendations])
recall num_hits / len(ground_truth)
if num_hits > 0⁚
precision num_hits / len(recommendations)
return precision * recall / (precision recall)
return 0
merged[‘map_at_20’] merged․apply(map_at_20, axis1)
average_map_at_20 merged[‘map_at_20’]․mean
Таким образом, мы получаем метрику качества модели MAP@20 для нашей рекомендательной системы․
Надеюсь, эта информация полезна! Удачи в создании своей рекомендательной системы!