Время прочтения: 5 мин.

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

Почему?

Рекомендательные системы – это современный пример успешного IT-инструмента для понимания интересов и предпочтений другого человека. В данном случае не важно знакомы вы или нет, работаете в одной компании или находитесь в разных уголках Земли. Любая рекомендательная система учится понимать человека на основании имеющейся о нем исходной информации у машины. Чем больше такой инфо, тем больше шансов, что проект будет интересен и не потеряет интерес своей аудитории.

Изначально рекомендательные системы использовались преимущественно для привлечения внешнего клиента и роста прибыли компаний. Сегодня их начали активно применять и для внутреннего клиента. Например, рекомендации обучающих курсов для развития персонала внутри компании.

Существует три основных класса рекомендательных систем:

Content-based filtering (фильтрация контента).
В данной системе берется каждый сотрудник и машина анализирует его историю обучения, а также пул не пройденных им курсов. В число рекомендаций при этом попадут не пройденные курсы, которые похожи по содержанию на изученные ранее

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

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%, что позволяет признать его успешным и готовым к внедрению в пром.