Почему fit_transform и transform дают разные результаты?

Я играл с LDA в пакете text2vec и был сбит с толку, почему fit_transfrom и transform были разными при использовании одних и тех же данных.

В документации указано, что преобразование применяет изученную модель к новым данным, но результат сильно отличается от тот, что произведен из fit_transform

data("movie_review")
library(stringr)
library(text2vec)
library(dpylr)

tokens = movie_review$review[1:4000] %>% 
  tolower %>% 
  word_tokenizer

it = itoken(tokens, ids = movie_review$id[1:4000], progressbar = FALSE)

v = create_vocabulary(it) %>% 
  prune_vocabulary(term_count_min = 10, doc_proportion_max = 0.2)

vectorizer = vocab_vectorizer(v)

dtm = create_dtm(it, vectorizer, type = "dgTMatrix")

lda_model = LDA$new(n_topics = 10, doc_topic_prior = 0.1, topic_word_prior = 0.01)

set.seed(123)

doc_topic_distr = 
  lda_model$fit_transform(x = dtm, n_iter = 1000, 
                          convergence_tol = 0.001, n_check_convergence = 25, 
                          progressbar = FALSE)

set.seed(123)

new_doc_topic_dist = 
  lda_model$transform(x = dtm, n_iter = 1000, 
                          convergence_tol = 0.001, n_check_convergence = 25, 
                          progressbar = FALSE)

head(doc_topic_distr)
head(new_doc_topic_dist)

Я ожидал, что и doc_topic_distr, и new_doc_topic_distr будут одинаковыми, но они совершенно разные.


person George Hall    schedule 16.07.2019    source источник


Ответы (1)


Хороший вопрос! Действительно, есть проблема с версией CRAN (и она в основном исправлена ​​в версии для разработчиков на github). Проблема следующая:

  1. Во время fit_transform мы изучаем как распределение тем документов, так и распределение слов по темам. После схождения мы сохраняем слово-тему внутри модели и возвращаем в качестве результата тему документа.
  2. Во время transform мы используем фиксированное распределение слов по темам и выводим только темы документов. Нет никакой гарантии, что предполагаемая тема документа будет такой же и во время fit_transform (но она должна быть достаточно близкой).

Что мы изменили в версии для разработчиков — мы запускаем fit_transform и transform, чтобы иметь почти одинаковое распределение по темам документов для каждого метода. (есть пара дополнительных настроек параметров, чтобы убедиться, что они точно такие же - см. документацию для разрабатываемой версии).

person Dmitriy Selivanov    schedule 17.07.2019