Латентное выделение Дирихле (LDA) в Spark - повторяющаяся модель - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу сохранить модель LDA из пакета pyspark ml-clustering и применить модель к обучающему и тестовому набору данных после сохранения.Однако результаты расходятся, несмотря на посев семян.Мой код следующий:

1) Импортные пакеты

from pyspark.ml.clustering import LocalLDAModel, DistributedLDAModel
from pyspark.ml.feature import CountVectorizer , IDF

2) Подготовка набора данных

countVectors = CountVectorizer(inputCol="requester_instruction_words_filtered_complete", outputCol="raw_features", vocabSize=5000, minDF=10.0)
cv_model = countVectors.fit(tokenized_stopwords_sample_df)
result_tf = cv_model.transform(tokenized_stopwords_sample_df)
vocabArray = cv_model.vocabulary
idf = IDF(inputCol="raw_features", outputCol="features")
idfModel = idf.fit(result_tf)
result_tfidf = idfModel.transform(result_tf)
result_tfidf = result_tfidf.withColumn("id", monotonically_increasing_id())    
corpus = result_tfidf.select("id", "features")

3) Обучение модели LDA

lda = LDA(k=number_of_topics, maxIter=100, docConcentration = [alpha], topicConcentration = beta, seed = 123)
model = lda.fit(corpus)
model.save("LDA_model_saved")
topics = model.describeTopics(words_in_topic)  
topics_rdd = topics.rdd
modelled_corpus = model.transform(corpus)

4) Реплицируйте модель

#Prepare the data set
countVectors = CountVectorizer(inputCol="requester_instruction_words_filtered_complete", outputCol="raw_features", vocabSize=5000, minDF=10.0)
cv_model = countVectors.fit(tokenized_stopwords_sample_df)
result_tf = cv_model.transform(tokenized_stopwords_sample_df)
vocabArray = cv_model.vocabulary
idf = IDF(inputCol="raw_features", outputCol="features")
idfModel = idf.fit(result_tf)
result_tfidf = idfModel.transform(result_tf)   
result_tfidf = result_tfidf.withColumn("id", monotonically_increasing_id())
corpus_new = result_tfidf.select("id", "features")

#Load the model to apply to new corpus
newModel = LocalLDAModel.load("LDA_model_saved")
topics_new = newModel.describeTopics(words_in_topic)  
topics_rdd_new = topics_new.rdd
modelled_corpus_new = newModel.transform(corpus_new)

Следующие результаты отличаются, несмотря на мое предположение, что они равны: topics_rdd != topics_rdd_new и modelled_corpus != modelled_corpus_new (также при проверке извлеченных тем они различаются так же, как ипредсказанные классы в наборе данных)

Так что мне действительно странно, что одна и та же модель предсказывает разные классы («темы») в одном и том же наборе данных, даже если я установила начальное число в генерации модели.Может ли помочь кто-то с опытом репликации моделей LDA?

Спасибо:)

1 Ответ

0 голосов
/ 10 июня 2019

Я столкнулся с подобной проблемой при внедрении LDA в PYSPARK.Несмотря на то, что я использовал seed, каждый раз, когда я запускаю код для одних и тех же данных с одинаковыми параметрами, результаты были разными.

Я пришел к следующему решению после множества попыток:

  1. Сохранено cv_model после его запуска и загрузки в следующих итерациях, а непереоснащение это.

  2. Это больше связано с моим набором данных.Размер некоторых документов в корпусе, который я использовал, был очень мал (около 3 слов на документ).Я отфильтровал эти документы и установил лимит, так что в корпус будут включены только те документы, которые содержат не менее 15 слов (может быть выше у вас).Я не уверен, почему это сработало, может быть что-то связанное подчеркивает сложность модели.

В общем, теперь мои результаты одинаковы даже после нескольких итераций.Надеюсь это поможет.

...