В этом пайплайне используются три модели машинного обучения.
Fasttext - неглубокая архитектура нейронной сети, основанная на изучении контекста слов. Нами была взята предобученная архитектура с этого замечательного сайта, а именно модель araneum_none_fasttextcbow_300_5_2018.
Как она нам поможет?
В нашей задачи основным видом данных являются курсы с образовательных платформ: Сoursera, Stepik, Openedu. Это названия курсов с данных платформ, то есть текстовые данные. Их нам нужно преобразовать в числовой вид, то есть создать эмбеддинги курсов. Для этого названия курсов мы приводим в удобный для моделей вид (очистка, токенизация, лемматизация и т.д.), после чего отдаем в Fasttext названия курсов и получаем их эмбеддинги.
В нашем случаем у нас есть API векторизации. То есть функция vectorize_text
, которая принимает текст и возвращает вектор.
Umap - это алгоритм уменьшения размерности векторов.
Для чего используем эту модель?
После того, как мы получили эмбеддинги курсов из Fasttext, мы хотим уменьшить их размерность, чтобы потом сделать кластеризацию и разделить курсы на кластеры.
Обращаемся к методам fit_transform
модели, чтобы обучить на наших курсах и трансформировать это в двумерные вектора, потому что изначально Fasttext отдает эмбеддинги размерности 300. Сохраняем модель в объект pickle, она нам понадобится еще при построении эмбеддингов дисциплин студентов.
Agglomerative clustering - алгоритм кластеризации.
Для чего пригодится эта модель?
У нас есть двумерные вектора каждого курса с различных образовательных платформ. Мы применяем алгоритм аггломеративной кластеризации, чтобы разделить курсы на группы, где в каждой группе будут находится похожие курсы. В нашем случае оптимальным количеством кластеров является число 20.
Мы получили курсы, разделенные на кластеры. Чтобы рекомендовать студентам курсы из какого-то кластера, нужно выбрать то, с чем будем сравнивать эмбеддинг курса студента. Самое первое, что приходит в голову - центроида кластера. Так и поступили. Для каждого из 20 кластеров посчитали центроиды и записали их в json файл.
У нас есть конкретный студент (его корпоративный email) и список его курсов. Ключевой момент - рекомендации мы строим по каждому из курсов, а не в целом для высех курсов студента, это происходит потому, что у студента очень "разношерстные" курсы, и если мешать эмбеддинг Электротехники и Английского языка получится непонятно что в векторном пространстве.
vectorize_text
)transform
- получаем сжатый эмбеддинг до двух измерений (функция umap_emb
).