Широкое распространение в последние годы получили программы, которые пытаются предсказать, какие объекты будут интересны пользователю, имея определенную информацию о его профиле. До 2006 года такие алгоритмы не пользовались популярностью. Но все изменилось осенью 2006 года, когда компания Netflix предложила разработчикам 1 000 000$ за лучший алгоритм предсказания. Конкурс продлился 3 года.
Расскажем сегодня о своем опыте построения рекомендательной системы в обучении персонала.
Сегодня в мире цифровых технологий большинство разработок используют в своей основе рекомендательные системы.
Почему?
Рекомендательные системы – это современный пример успешного IT-инструмента для понимания интересов и предпочтений другого человека. В данном случае не важно знакомы вы или нет, работаете в одной компании или находитесь в разных уголках Земли. Любая рекомендательная система учится понимать человека на основании имеющейся о нем исходной информации у машины. Чем больше такой инфо, тем больше шансов, что проект будет интересен и не потеряет интерес своей аудитории.
Изначально рекомендательные системы использовались преимущественно для привлечения внешнего клиента и роста прибыли компаний. Сегодня их начали активно применять и для внутреннего клиента. Например, рекомендации обучающих курсов для развития персонала внутри компании.
Существует три основных класса рекомендательных систем
1. Content-based filtering (фильтрация контента).
В данной системе берется каждый сотрудник и машина анализирует его историю обучения, а также пул не пройденных им курсов. В число рекомендаций при этом попадут не пройденные курсы, которые похожи по содержанию на изученные ранее.
2. Collaborative filtering (коллаборативная фильтрация).
В данной системе искомому сотруднику предлагаются курсы к изучению, которые заинтересовали похожих на него коллег.
3. Гибридные системы, комбинирующие предыдущие подходы.
Оптимальный вариант – сочетать оба типа фильтрации. Однако в реальности ввиду ограниченности исходных данных быстрее и легче внедрить рекомендательную систему, основанную на коллаборативной фильтрации.
Почему?
• Модель работает в режиме офлайн. Система ориентирована на долгосрочный периметр изменений в предпочтениях Users. Как правило, такие изменения имеют под собой более весомые причины, чем сиюминутные предпочтения Users.
• Отсутствуют оценки учебных курсов. В классическом варианте источником информации об учебном курсе для его включения в периметр рекомендаций служит средняя оценка (для ее формирования каждый сотрудник по окончании обучения выставляет курсу оценку в границах заданной шкалы). Чем выше средняя оценка, тем выше шанс, что курс будет рекомендован. Однако оценки есть не всегда…
• Достаточное количество features (кроме оценок) для поиска похожих Users.
Критериями поиска похожих Users внутри компании могут выступать:
• должность / грейд (значение определено диапазоном);
• вертикаль / направление работы сотрудника;
• схожесть истории обучения;
• квалификация (например, Data Analist, Data Engineer, Data Scientist);
• возраст (вся численность сотрудников разделена на группы с заданным интервалом);
• стаж (вся численность сотрудников разделена на группы с заданным интервалом).
Количество похожих Users и количество рекомендованных курсов также следует ограничить.
В нашей компании был опыт разработки MVP рекомендательной системы обучающих курсов, для включения в План развития сотрудников. Рекомендации формировались на основы матрицы корреляции Пирсона. Критериями поиска похожих Users выступали:
· должность (-1, +2);
· направление работы – поиск был настроен по штатной принадлежности сотрудников к идентичному подразделению в разных филиалах России;
· схожесть истории обучения – похожими были установлены курсы по идентичности наименования;
· квалификация – в рамках нашей компании выделены только сотрудники категории Data Scientist;
· возраст – все сотрудники компании разделены на группы в интервале 5 лет (весь возрастной диапазон находится в промежутке от 20 лет и до 65);
· стаж - все сотрудники компании разделены на группы в интервале 5 лет.
Количество похожих Users – 3 человека.
Количество рекомендованных курсов – 6 курсов (по 2 от каждого похожего User).
Язык построения алгоритма рекомендательной системы – Python.
На первом этапе код отрабатывает исходные данные (DataSet), например, штатная численность компании в разрезе ФИО, история обучения каждого сотрудника и обязательно информация для отработки критериев поиска похожих Users.
На втором этапе код формирует матрицу корреляции и для каждого User машина подбирает 3 наиболее похожих Users по параметрам из списка выше.
# Проходим по строкам DataSet
for row in df:
corrMatr = df.corrwith(df[row]) # Функция корреляции матрицы
corrMatr = pd.DataFrame(corrMatr)
tempMatr = corrMatr # Временная матрица
tempMatr = tempMatr.drop([row], axis=0)
li = list()
li2 = list()
print(row)
k = 0
while k < 6:
if len(tempMatr) == 0: # Если количество строк tempMatr равно 0, выходим из цикла while
break
name = tempMatr.idxmax().item() # Значение по индексу первого появления максимума в строке
dp = df3[df3['Tab'] == name].set_index('Tab') # Получаем те строки из таблицы Обучение,
# в которых значение столбца Tab равно name
if name not in li2 and ((df[name]['pos'] <= df[row]['pos'] + 2 and df[name]['pos'] >= df[row]['pos'])):
# Если сотрудник еще не рассмотрен и подходит по должности
li2.append(name)
col_dp = dp.columns.tolist() # Список столбцов рассматриваемого DataFrame
random.shuffle(col_dp) # Перемешиваем строки
for yy in col_dp: # Проходим по ним
if pd.DataFrame(df3[df3['Tab'] == name][yy]).reset_index()[yy][0] == 1 and \
pd.DataFrame(df3[df3['Tab'] == row][yy]).reset_index()[yy][0] == 0 and \
yy not in li and yy in df777['Курсы'].tolist():
# Если курс еще не был включен в список предложенных
recList.append([row, name, yy,
pd.DataFrame(df4[df4['Tab'] == row]['TB']).reset_index()['TB'][0], \
pd.DataFrame(df4[df4['Tab'] == name]['TB']).reset_index()['TB'][0], \
pd.DataFrame(df4[df4['Tab'] == row]['FIO']).reset_index()['FIO'][0], \
pd.DataFrame(df4[df4['Tab'] == name]['FIO']).reset_index()['FIO'][0]])
k += 1
li.append(yy)
# Удаляем рассмотренного сотрудника из tempMatr
tempMatr = tempMatr.drop([tempMatr.idxmax().item()], axis=0)
break # Выходим из цикла for
else: # Удаляем рассмотренного сотрудника из tempMatr
tempMatr = tempMatr.drop([tempMatr.idxmax().item()], axis=0)
# Заполняем результирующий DataFrame и выгружаем его в Excel
recomendations = recomendations.append(recList, ignore_index=True)
recomendations.to_excel('итог.xlsx')
Схематично работу алгоритма при поиске учебного курса для включения в перечень рекомендаций можно увидеть на рисунке ниже.
На третьем этапе важно организовать доведение рекомендаций в удобном для сотрудника формате. К возможным и доступным формам корпоративного информирования можно отнести:
· персональные рекомендации в личном кабинете сотрудника (например, на корпоративном портале или образовательной корпоративной платформе);
· персональная рассылка писем по корпоративной почте.
Наша команда разработчиков остановились на использовании корпоративной почты.
Данный алгоритм рекомендаций был внедрен в пилотном режиме (на протяжении одного квартала). Созданный MVP достиг поставленного руководством целевого значения конверсии в 25%, что позволяет признать его успешным и готовым к внедрению в пром.