SlideShare a Scribd company logo


Построение рекомендательной
системы на Python
Python Data Science meetup @ Avito
Лексин Василий
13 августа 2016 г.
0


План презентации
Выгрузка данных
Типы данных
Выгрузка данных из хранилища
Предобработка данных
Фильтрация данных
Предобработка поисковых запросов
Обучение модели
Параметры модели и обучение
Оценка качества модели
1


Типы данных
Данные по пользователям
Профиль интересов по категориям и регион
Согласен ли получать рекомендации
Данные по объявлениям
Микрокатегория
Местоположение
Действия пользователей
Items search, item view
Item view phone, item send message
Favorites item add
2


Выгрузка данных из
хранилища (SQL)
Один месяц click stream
Фильтруем офисные IP
Фильтруем ботов (ноу хау)
Только посление сессии от каждого пользователя
От каждой сессии берем максимум случайных событий
каждого типа
Привязываем действия от неавторизованных
пользователей к user_id
Отдельно выгружаем поисковые запросы
Ns
Ne
2 - 1


Статистика по выгруженным
данным
853M событий
13M пользователей
32M объявлений
77M поисковых запросов
4M уникальных текстов запросов
2 - 2


Постановка задачи
рекомендаций
Для максимально большого сегмента
активных пользователей отобрать по top N
объявлений, которые пользователя наиболее
вероятно заинтересуют.
3


Пример поисковых запросов
In [73]:
Out[73]: ext_user_id microcat_id location_id searchquery_id
110046 -6474078695648370021 2744 3960 NaN
528990 3115636 2679 1344 9955361
770905 90352811 1776 3953 8285511
1081196 79333327 3718 2142 2608148
473135 29970120 5779 1344 NaN
3099378 -5360608040238233550 5250 3856 NaN
665866 24882994 259 1261 NaN
1368309 3202041 3718 2885 NaN
1659277 89384896 1989 3953 12435410
1841537 13939317 66 1261 NaN
import pandas as pd
df_queries.sample(10)
4


Пример текстов запросов
In [81]:
Out[81]: searchquery_id query
128240 59238250342 кожаный кошклек
139772 234299750143 batyka
18635 4411625 медсестра
202708 1040250002 кукла новая испания
149424 234267250442 детские вещи емле
214063 233309500285 зимний комбинезон мальчикучика 86-92
51753 5599527 tally weijl
6267 6729157 туфли 39
69994 133827 плащ пиджак
39963 1008632 doctor e
df_searchquery.sample(10)
4 - 1


Пример лога событий
In [87]:
Out[87]: ext_user_id ext_item_id
0 269878 778223165
1 269878 820358781
2 269878 804777863
3 93940783 602550035
4 93940783 793828222
5 93940783 811076220
6 93940783 651115689
7 93940783 211688068
8 93940783 807188069
9 93940783 762847248
df_data.sample(10)
4 - 2


Нормализация текста
In [ ]:
In [ ]:
from nltk.corpus import stopwords as sw
import pymorphy2
import re
stopwords= set(sw.words("russian"))
morph = pymorphy2.MorphAnalyzer()
token_pattern = re.compile(r'b[w./]+b')
tokenize = lambda doc: token_pattern.findall(doc)
badlist = set(['отличный', 'идеальный', 'состояние', 'продажа',
'продавать', 'обменять', 'москва', 'продать',
'хороший', 'продаваться', 'супер'])
def get_tokens(line):
cur_line = tokenize(line)
normalized_tokens = [morph.parse(x)[0].normal_form for x
in cur_line]
filtered_tokens = [token for token in normalized_tokens
if not token in badlist
and not token in stopwords]
return filtered_tokens
5


Параллельная обработка
In [1]:
In [24]:
...
from multiprocessing import Pool
pool = Pool()
df_searchquery['norm_query'] = pool.map(get_tokens,
df_searchquery['query'].values)
pool.terminate()
5 - 1


Биграммы, фильтрация
In [2]:
In [25]:
In [78]:
...
...
...
from gensim.models.phrases import Phrases
from gensim.corpora import Dictionary
bigram_transformer = Phrases(df_searchquery['norm_query'].values)
df_searchquery['norm_query'] = [bigram_transformer[q]
for q in df_searchquery['norm_query']]
id2word = Dictionary(df_searchquery['norm_query'].values)
id2word.filter_extremes(no_below=5)
df_searchquery['norm_query'] = [[w for w in q if w in id2word.token2id]
for q in df_searchquery['norm_query']]
6


Пример нормализованных запросов
In [88]:
Out[88]: searchquery_id query norm_query
11363 40583250271 куртка на осень стильная [куртка, осень, стильный]
30231 8776934 памперсы меррис [памперс]
89102 6296057 stig []
102222 13296939 пакетом 2-3 [пакет, 2_3]
33406 5522081 casadei балетки [casadei, балетки]
194946 234467250136 комбенизон reima ноаые [комбенизон, reima, ноаый]
42300 2691799 пастельное белье детское [пастельный_бельё, детский]
108060 136389 ecco демисезон [ecco, демисезон]
82151 5960365 кукла германия [кукла, германия]
92853 69941250025 на мальчика размер 80 [мальчик, размер, 80]
df_searchquery.sample(10)
6 - 1


Комбинация запроса с
микрокатегорией
In [89]:
Out[89]: ext_user_id microcat_id location_id searchquery_id norm_query
2768669 79821794 2744 1403 NaN [2744:]
2716176 -3322596449809766062 3718 406 NaN [3718:]
2349895 930812 847 2187 NaN [847:]
3180239 -4757589830893039331 6232 4111 NaN [6232:]
2122630 46977773 6670 4499 NaN [6670:]
2023443 48879590 5250 2643 NaN [5250:]
1492290 87985326 7188 2885 NaN [7188:]
2452980 -8482002081938376691 5428 3960 2.339135e+11
[5428:lps,
5428:петшоп,
5428:литло_петь,
5428:...
1795200 1431139 3718 3976 5.659923e+06 [3718:крокс_crocs]
951770 3471714 7382 3953 5.589893e+06 [7382:шуба_мутон]
df_queries.sample(10)
6 - 2


Признаки пользователя
In [90]:
Out[90]: ext_user_id norm_query location_id
723827 56908675 [7382:, 478:, 3718:, 1675:, 149:] [2430]
7962 -9019847421690666119
[2744:сумка, 1860:, 5250:, 2744:женский,
2744:...
[230]
1020309 95760508 [2744:стрип, 2744:] [992]
297934 -1603932776056930038 [5250:] [4181]
494505 11949033 [2868:, 4488:, 6875:, 4243:, 3478:, 5938:] [926]
150433 -5371442050781010156 [4814:] [3610]
552456 19578840 [6797:, 5513:] [3953]
223287 -3517260670980945043 [2744:] [2885]
811247 76406847 [259:bugaboo] [2885]
843402 80272837 [259:] [642, 44]
df_user_query.sample(10)
7


Фильтрация лога событий
In [ ]: import graphlab as gl
# Generate bipartite user-item graph
g = gl.SGraph()
g = g.add_edges(training_data,
src_field='ext_user_id', dst_field='ext_item_id')
k_value = 10
# Compute the N-core decomposition of the graph
kc = gl.kcore.create(g, kmin=k_value-1, kmax=k_value)
# Filtering events
training_filtered = g.get_neighborhood(kc.core_id.filter_by(
k_value, 'core_id')['__id'], radius=0)
training_filtered = gl.SFrame(training_filtered.edges).rename({
'__src_id': 'ext_user_id', '__dst_id': 'ext_item_id'})
8


Factorization Machine - общая идея
9


Factorization Machine - генеративная
модель
- пользователь
- объявление
- global bias term
и - weight terms
и - side feature vectors
и - weight vectors for side features
и - latent factors
p(i, j) = μ + + + + + ,wi
wj
a
T
xi
b
T
yj
u
T
i
vj
i
j
μ
wi
wj
xi
yj
a b
ui
vj
9 - 1


Обучение модели
In [67]:
...
(training_data,
validation_data) = gl.recommender.util.random_split_by_user(
gl.SFrame(df_data))
train_settings = dict(
regularization=1e-07,
linear_regularization=1e-07,
side_data_factorization=True,
num_factors=100,
num_sampled_negative_examples=4,
max_iterations=25)
model_fr = gl.ranking_factorization_recommender.create(
training_filtered,
user_id = 'ext_user_id',
item_id = 'ext_item_id',
user_data=transformed_user_data,
**train_settings
)
9 - 2


Оценка качества модели
In [77]:
cutoff precision recall
1 0.022 0.008
2 0.018 0.010
3 0.016 0.012
5 0.014 0.019
10 0.011 0.029
...
prec_rec_data = model_fr.evaluate_precision_recall(validation_data)
10


Время обучения
Один сервер 56 потоков, 256 Гб
Сбор данных из хранилища ~1 часа
Предобработка данных ~30 минут
Обучение модели ~4 часов
11


Ресурсы
Python: http://www.python.org/ (http://www.python.org/)
IPython: http://ipython.org/ (http://ipython.org/)
Pandas: http://pandas.pydata.org/ (http://pandas.pydata.org/)
Gensim: https://radimrehurek.com/gensim/
(https://radimrehurek.com/gensim/)
GraphLab Create: https://turi.com/products/create/
(https://turi.com/products/create/)
12

More Related Content

Viewers also liked

Driving Business Goals with Recommender Systems @ YAC/m 2015
Driving Business Goals with Recommender Systems @ YAC/m 2015Driving Business Goals with Recommender Systems @ YAC/m 2015
Driving Business Goals with Recommender Systems @ YAC/m 2015
Konstantin Savenkov
 
"DeepLink’и в Avito" Артём Разинов (Avito)
"DeepLink’и в Avito" Артём Разинов (Avito)"DeepLink’и в Avito" Артём Разинов (Avito)
"DeepLink’и в Avito" Артём Разинов (Avito)
AvitoTech
 
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
AvitoTech
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
AvitoTech
 
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
AvitoTech
 
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
AvitoTech
 
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (..."Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
AvitoTech
 
Андрей Юткин. Media Picker — to infinity and beyond
Андрей Юткин. Media Picker — to infinity and beyondАндрей Юткин. Media Picker — to infinity and beyond
Андрей Юткин. Media Picker — to infinity and beyond
AvitoTech
 
Рекомендации в Avito - Василий Лексин (Avito)
Рекомендации в Avito - Василий Лексин (Avito)Рекомендации в Avito - Василий Лексин (Avito)
Рекомендации в Avito - Василий Лексин (Avito)
AvitoTech
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?
AvitoTech
 
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ..."Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
AvitoTech
 
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (..."Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
AvitoTech
 
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
AvitoTech
 
"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)
AvitoTech
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
AvitoTech
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
AvitoTech
 
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
AvitoTech
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
AvitoTech
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
AvitoTech
 

Viewers also liked (20)

Driving Business Goals with Recommender Systems @ YAC/m 2015
Driving Business Goals with Recommender Systems @ YAC/m 2015Driving Business Goals with Recommender Systems @ YAC/m 2015
Driving Business Goals with Recommender Systems @ YAC/m 2015
 
"DeepLink’и в Avito" Артём Разинов (Avito)
"DeepLink’и в Avito" Артём Разинов (Avito)"DeepLink’и в Avito" Артём Разинов (Avito)
"DeepLink’и в Avito" Артём Разинов (Avito)
 
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
“Атличнаи дивчачьи каньки”: исправляем ошибки. Андрей Смирнов (Avito)
 
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
"RT индексы в поиске Avito" Вячеслав Крюков (Avito)
 
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (..."Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
 
Андрей Юткин. Media Picker — to infinity and beyond
Андрей Юткин. Media Picker — to infinity and beyondАндрей Юткин. Media Picker — to infinity and beyond
Андрей Юткин. Media Picker — to infinity and beyond
 
курышев рекомендательные системы
курышев рекомендательные системыкурышев рекомендательные системы
курышев рекомендательные системы
 
Рекомендации в Avito - Василий Лексин (Avito)
Рекомендации в Avito - Василий Лексин (Avito)Рекомендации в Avito - Василий Лексин (Avito)
Рекомендации в Avito - Василий Лексин (Avito)
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?
 
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ..."Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
 
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (..."Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
"Распознавание марки и модели автомашин на изображениях" Евгений Нижибицкий (...
 
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
"Бэк-офис в Avito: миллиард объявлений на 10 серверах" Вячеслав Крюков (Avito)
 
"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
 
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
 

Similar to "Построение рекомендательной системы на Python" Василий Лексин (Avito)

WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
CUSTIS
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
 
Управляем сетью легко: протокол SNMP
Управляем сетью легко: протокол SNMPУправляем сетью легко: протокол SNMP
Управляем сетью легко: протокол SNMP
Alex Marakhovets
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
Поиск? Sphinx!
Поиск? Sphinx!Поиск? Sphinx!
Поиск? Sphinx!
Roman Zaiev
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Ivan Tsyganov
 
2013 Кириченко диплом
2013 Кириченко диплом2013 Кириченко диплом
2013 Кириченко дипломRF-Lab
 
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность DLP...
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность  DLP...Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность  DLP...
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность DLP...
Expolink
 
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
Дмитрий Шахов
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Ontico
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Kaspersky
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Alvo Discover ict
Alvo Discover ictAlvo Discover ict
Alvo Discover ict
Vera Arhangelskaya
 
«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk
0xdec0de
 
Построение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологийПостроение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологий
Dmitry Moskvin
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Oblakoteka mont partnerday_2015
Oblakoteka mont partnerday_2015Oblakoteka mont partnerday_2015
Oblakoteka mont partnerday_2015
oblako123
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
Alexey Nayden
 

Similar to "Построение рекомендательной системы на Python" Василий Лексин (Avito) (20)

WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Управляем сетью легко: протокол SNMP
Управляем сетью легко: протокол SNMPУправляем сетью легко: протокол SNMP
Управляем сетью легко: протокол SNMP
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
Поиск? Sphinx!
Поиск? Sphinx!Поиск? Sphinx!
Поиск? Sphinx!
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
2013 Кириченко диплом
2013 Кириченко диплом2013 Кириченко диплом
2013 Кириченко диплом
 
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность DLP...
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность  DLP...Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность  DLP...
Global Trust Solutions. Александр Астахов. "Как рассчитать эффективность DLP...
 
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
Ожгибесов Александр. Исследование качества сервисов кластеризации по поисково...
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Alvo Discover ict
Alvo Discover ictAlvo Discover ict
Alvo Discover ict
 
«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk«Introduction to malware reverse engineering» by Sergey Kharyuk
«Introduction to malware reverse engineering» by Sergey Kharyuk
 
Построение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологийПостроение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологий
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Oblakoteka mont partnerday_2015
Oblakoteka mont partnerday_2015Oblakoteka mont partnerday_2015
Oblakoteka mont partnerday_2015
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 

More from AvitoTech

Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
AvitoTech
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
AvitoTech
 
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
AvitoTech
 
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoTech
 
Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
AvitoTech
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
AvitoTech
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
AvitoTech
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
AvitoTech
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
AvitoTech
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
AvitoTech
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
AvitoTech
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
AvitoTech
 
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb..."ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
AvitoTech
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
AvitoTech
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
AvitoTech
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
AvitoTech
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
AvitoTech
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
AvitoTech
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
AvitoTech
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
AvitoTech
 

More from AvitoTech (20)

Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
 
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
 
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
 
Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
 
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb..."ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
 

"Построение рекомендательной системы на Python" Василий Лексин (Avito)

  • 1.   Построение рекомендательной системы на Python Python Data Science meetup @ Avito Лексин Василий 13 августа 2016 г. 0
  • 2.   План презентации Выгрузка данных Типы данных Выгрузка данных из хранилища Предобработка данных Фильтрация данных Предобработка поисковых запросов Обучение модели Параметры модели и обучение Оценка качества модели 1
  • 3.   Типы данных Данные по пользователям Профиль интересов по категориям и регион Согласен ли получать рекомендации Данные по объявлениям Микрокатегория Местоположение Действия пользователей Items search, item view Item view phone, item send message Favorites item add 2
  • 4.   Выгрузка данных из хранилища (SQL) Один месяц click stream Фильтруем офисные IP Фильтруем ботов (ноу хау) Только посление сессии от каждого пользователя От каждой сессии берем максимум случайных событий каждого типа Привязываем действия от неавторизованных пользователей к user_id Отдельно выгружаем поисковые запросы Ns Ne 2 - 1
  • 5.   Статистика по выгруженным данным 853M событий 13M пользователей 32M объявлений 77M поисковых запросов 4M уникальных текстов запросов 2 - 2
  • 6.   Постановка задачи рекомендаций Для максимально большого сегмента активных пользователей отобрать по top N объявлений, которые пользователя наиболее вероятно заинтересуют. 3
  • 7.   Пример поисковых запросов In [73]: Out[73]: ext_user_id microcat_id location_id searchquery_id 110046 -6474078695648370021 2744 3960 NaN 528990 3115636 2679 1344 9955361 770905 90352811 1776 3953 8285511 1081196 79333327 3718 2142 2608148 473135 29970120 5779 1344 NaN 3099378 -5360608040238233550 5250 3856 NaN 665866 24882994 259 1261 NaN 1368309 3202041 3718 2885 NaN 1659277 89384896 1989 3953 12435410 1841537 13939317 66 1261 NaN import pandas as pd df_queries.sample(10) 4
  • 8.   Пример текстов запросов In [81]: Out[81]: searchquery_id query 128240 59238250342 кожаный кошклек 139772 234299750143 batyka 18635 4411625 медсестра 202708 1040250002 кукла новая испания 149424 234267250442 детские вещи емле 214063 233309500285 зимний комбинезон мальчикучика 86-92 51753 5599527 tally weijl 6267 6729157 туфли 39 69994 133827 плащ пиджак 39963 1008632 doctor e df_searchquery.sample(10) 4 - 1
  • 9.   Пример лога событий In [87]: Out[87]: ext_user_id ext_item_id 0 269878 778223165 1 269878 820358781 2 269878 804777863 3 93940783 602550035 4 93940783 793828222 5 93940783 811076220 6 93940783 651115689 7 93940783 211688068 8 93940783 807188069 9 93940783 762847248 df_data.sample(10) 4 - 2
  • 10.   Нормализация текста In [ ]: In [ ]: from nltk.corpus import stopwords as sw import pymorphy2 import re stopwords= set(sw.words("russian")) morph = pymorphy2.MorphAnalyzer() token_pattern = re.compile(r'b[w./]+b') tokenize = lambda doc: token_pattern.findall(doc) badlist = set(['отличный', 'идеальный', 'состояние', 'продажа', 'продавать', 'обменять', 'москва', 'продать', 'хороший', 'продаваться', 'супер']) def get_tokens(line): cur_line = tokenize(line) normalized_tokens = [morph.parse(x)[0].normal_form for x in cur_line] filtered_tokens = [token for token in normalized_tokens if not token in badlist and not token in stopwords] return filtered_tokens 5
  • 11.   Параллельная обработка In [1]: In [24]: ... from multiprocessing import Pool pool = Pool() df_searchquery['norm_query'] = pool.map(get_tokens, df_searchquery['query'].values) pool.terminate() 5 - 1
  • 12.   Биграммы, фильтрация In [2]: In [25]: In [78]: ... ... ... from gensim.models.phrases import Phrases from gensim.corpora import Dictionary bigram_transformer = Phrases(df_searchquery['norm_query'].values) df_searchquery['norm_query'] = [bigram_transformer[q] for q in df_searchquery['norm_query']] id2word = Dictionary(df_searchquery['norm_query'].values) id2word.filter_extremes(no_below=5) df_searchquery['norm_query'] = [[w for w in q if w in id2word.token2id] for q in df_searchquery['norm_query']] 6
  • 13.   Пример нормализованных запросов In [88]: Out[88]: searchquery_id query norm_query 11363 40583250271 куртка на осень стильная [куртка, осень, стильный] 30231 8776934 памперсы меррис [памперс] 89102 6296057 stig [] 102222 13296939 пакетом 2-3 [пакет, 2_3] 33406 5522081 casadei балетки [casadei, балетки] 194946 234467250136 комбенизон reima ноаые [комбенизон, reima, ноаый] 42300 2691799 пастельное белье детское [пастельный_бельё, детский] 108060 136389 ecco демисезон [ecco, демисезон] 82151 5960365 кукла германия [кукла, германия] 92853 69941250025 на мальчика размер 80 [мальчик, размер, 80] df_searchquery.sample(10) 6 - 1
  • 14.   Комбинация запроса с микрокатегорией In [89]: Out[89]: ext_user_id microcat_id location_id searchquery_id norm_query 2768669 79821794 2744 1403 NaN [2744:] 2716176 -3322596449809766062 3718 406 NaN [3718:] 2349895 930812 847 2187 NaN [847:] 3180239 -4757589830893039331 6232 4111 NaN [6232:] 2122630 46977773 6670 4499 NaN [6670:] 2023443 48879590 5250 2643 NaN [5250:] 1492290 87985326 7188 2885 NaN [7188:] 2452980 -8482002081938376691 5428 3960 2.339135e+11 [5428:lps, 5428:петшоп, 5428:литло_петь, 5428:... 1795200 1431139 3718 3976 5.659923e+06 [3718:крокс_crocs] 951770 3471714 7382 3953 5.589893e+06 [7382:шуба_мутон] df_queries.sample(10) 6 - 2
  • 15.   Признаки пользователя In [90]: Out[90]: ext_user_id norm_query location_id 723827 56908675 [7382:, 478:, 3718:, 1675:, 149:] [2430] 7962 -9019847421690666119 [2744:сумка, 1860:, 5250:, 2744:женский, 2744:... [230] 1020309 95760508 [2744:стрип, 2744:] [992] 297934 -1603932776056930038 [5250:] [4181] 494505 11949033 [2868:, 4488:, 6875:, 4243:, 3478:, 5938:] [926] 150433 -5371442050781010156 [4814:] [3610] 552456 19578840 [6797:, 5513:] [3953] 223287 -3517260670980945043 [2744:] [2885] 811247 76406847 [259:bugaboo] [2885] 843402 80272837 [259:] [642, 44] df_user_query.sample(10) 7
  • 16.   Фильтрация лога событий In [ ]: import graphlab as gl # Generate bipartite user-item graph g = gl.SGraph() g = g.add_edges(training_data, src_field='ext_user_id', dst_field='ext_item_id') k_value = 10 # Compute the N-core decomposition of the graph kc = gl.kcore.create(g, kmin=k_value-1, kmax=k_value) # Filtering events training_filtered = g.get_neighborhood(kc.core_id.filter_by( k_value, 'core_id')['__id'], radius=0) training_filtered = gl.SFrame(training_filtered.edges).rename({ '__src_id': 'ext_user_id', '__dst_id': 'ext_item_id'}) 8
  • 17.   Factorization Machine - общая идея 9
  • 18.   Factorization Machine - генеративная модель - пользователь - объявление - global bias term и - weight terms и - side feature vectors и - weight vectors for side features и - latent factors p(i, j) = μ + + + + + ,wi wj a T xi b T yj u T i vj i j μ wi wj xi yj a b ui vj 9 - 1
  • 19.   Обучение модели In [67]: ... (training_data, validation_data) = gl.recommender.util.random_split_by_user( gl.SFrame(df_data)) train_settings = dict( regularization=1e-07, linear_regularization=1e-07, side_data_factorization=True, num_factors=100, num_sampled_negative_examples=4, max_iterations=25) model_fr = gl.ranking_factorization_recommender.create( training_filtered, user_id = 'ext_user_id', item_id = 'ext_item_id', user_data=transformed_user_data, **train_settings ) 9 - 2
  • 20.   Оценка качества модели In [77]: cutoff precision recall 1 0.022 0.008 2 0.018 0.010 3 0.016 0.012 5 0.014 0.019 10 0.011 0.029 ... prec_rec_data = model_fr.evaluate_precision_recall(validation_data) 10
  • 21.   Время обучения Один сервер 56 потоков, 256 Гб Сбор данных из хранилища ~1 часа Предобработка данных ~30 минут Обучение модели ~4 часов 11
  • 22.   Ресурсы Python: http://www.python.org/ (http://www.python.org/) IPython: http://ipython.org/ (http://ipython.org/) Pandas: http://pandas.pydata.org/ (http://pandas.pydata.org/) Gensim: https://radimrehurek.com/gensim/ (https://radimrehurek.com/gensim/) GraphLab Create: https://turi.com/products/create/ (https://turi.com/products/create/) 12