1. 程式人生 > >在PYTHON中使用TMTOOLKIT進行主題模型LDA評估

在PYTHON中使用TMTOOLKIT進行主題模型LDA評估

統一 進行 常量 註意 參數 cti 8.0 數列 ng-

主題建模的英文一種在大量文檔中查找抽象藝術主題藝術的方法。有了它,就有可能發現隱藏或“潛在”主題的混合,這些主題因給定語料庫中的文檔而異。一種作為監督無的機器學習方法,主題模型不容易評估,因為沒有標記的“基礎事實”數據可供比較。然而,由於主題建模通常需要預先定義一些參數(首先是要發現的主題?的數量),因此模型評估對於找到給定數據的“最佳”參數集是至關重要的。

概率LDA主題模型的評估方法

使用未標記的數據時,模型評估很難。這裏描述的指標都試圖用理論方法評估模型的質量,以便找到“最佳”模型。仍然重要的是要檢查這個模型是否有意義。實際上評估模型質量的好一種方法的英文人在環路方法,人類必須手動插入隨機“入侵者”字樣或“主題入侵者”。不過,最好先選擇理論方法最好的模型。

評估後部分布的密度或發散度

有些指標僅用於評估後驗分布(主題 - 單詞和文檔 - 主題分布),而無需以某種方式將模型與觀察到的數據進行比較。胡安等人。描述一種方法,該方法依賴於模型的主題 - 單詞分布中所有主題之間的成對距離。他們聲稱主題之間的成對距離越高,模型捕獲的信息密度越高。度量標準歸結為計算每對分布的余弦相似度u*v/(|u|*|v|)(其中|u||v|是各個向量的L2範數)uv在主題模型的後驗主題 - 詞分布中,然後取這些相似性的均值。平均值越低,主題越不相似,模型越好(至少通過此度量標準) 。

使用美聯社數據查找最佳主題模型

使用tmtoolkit計算和評估主題模型

主題建模的主要功能位於tmtoolkit.lda_utils。模塊中由於我們將使用LDA。包,因此我們需要先安裝它才能使用特定於該包的評估函數我們可以從導入我們需要的功能開始:

  1. import matplotlib.pyplot as plt # for plotting the results
  2. plt.style.use(‘ggplot‘)
  3. # for loading the data:
  4. from tmtoolkit.utils import unpickle_file
  5. # for model evaluation with the lda package:
  6. from tmtoolkit.lda_utils import tm_lda
  7. # for constructing the evaluation plot:
  8. from tmtoolkit.lda_utils.common import results_by_parameter
  9. from tmtoolkit.lda_utils.visualize import plot_eval_results

接下來,我們加載由文檔標簽,詞匯表(唯一單詞)列表和文檔 - 術語 - 矩陣組成的數據dtm。我們確保dtm尺寸合適:

  1. doc_labels, vocab, dtm = unpickle_file(‘ap.pickle‘)
  2. print(‘%d documents, %d vocab size, %d tokens‘ % (len(doc_labels), len(vocab), dtm.sum()))
  3. assert len(doc_labels) == dtm.shape[0]
  4. assert len(vocab) == dtm.shape[1]

現在我們定義應該評估的參數集我們設置了一個常量參數字典。const_params,它將用於每個主題模型計算並保持不變我們還設置了。varying_params包含具有不同參數值的字典的不同參數列表:

 

在這裏,我們想要從一系列主題中計算不同的主題模型ks = [10, 20, .. 100, 120, .. 300, 350, .. 500, 600, 700]。由於我們有26個不同的值ks,我們將創建和比較26個主題模型。請註意,還我們alpha為每個模型定義了一個參數1/k(有關LDA中的α和測試超參數的討論,請參見下文)。參數名稱必須與所使用的相應主題建模包的參數匹配。在這裏,我們將使用lda,因此我們通過參數,如n_itern_topics(例如,而與其他包的參數名稱也會有所不同num_topics,不是而n_topics在gensim)。

我們現在可以使用模塊中的evaluate_topic_models函數開始評估我們的模型tm_lda,並將不同參數列表和帶有常量參數的字典傳遞給它:

 

默認情況下,這將使用所有CPU內核來計算模型並並行評估它們。如果我們要評估4個CPU內核和26個模型,tmtoolkit將啟動4個子進程並將前4個模型計算分配給它們,我們剩下22個。當在任何子過程上完成第一個模型計算時,第五個模型計算任務由該子過程啟動,依此類推。這可確保所有子進程(以及所有CPU核心)始終處於忙碌狀態。

函數評估將報道查看eval_results所有遊戲2元組的列表。這些元組中的每一個都包含一個字典,其中包含用於計算模型的參數以及各個度量返回的評估結果字典。隨著results_by_parameter我們重組對於我們感興趣的,我們要在X軸上繪制的參數結果:

  

plot_eval_results函數使用在評估期間計算的所有度量創建33繪圖。之後,如果需要,我們可以使用matplotlib方法調整繪圖(例如添加繪圖標題),最後我們顯示和/或保存繪圖。

結果

技術分享圖片

主題模型評估,alpha = 1 / k,beta = 0.01

該圖顯示了各個度量的歸一化值,即阿倫和涓的[0,1]之間的縮放值,以及對數似然的[-1,0]。我們可以看到對數似然最大值為k值在100和350之間.Arun度量指向200到400之間的值.Duan度量開始在k = 100附近最小化但在另一個範圍內不會再次上升?。這可能是因為此方法僅評估主題詞分布。由於語料庫非常大(超過40萬個單詞),即使對於大K,計算的度量也可能非常低,因為主題詞分布中的“密度”(即單詞之間的成對距離)每個主題的分布)仍將非常高。

請註意,對於“loglikelihood”度量,僅報告最終模型的對數似然估計,這與Griffiths和Steyvers使用的調和均值方法不同。無法使用Griffiths和Steyvers方法,因為它需要一個特殊的Python包(gmpy2) ,這在我運行評估的CPU集群機器上是不可用的。但是,“對數似然”將報告非常相似的結果。

阿爾法和貝塔參數

除了主題數量之外,還有alphabeta(有時是文獻中的eta)參數。兩者都用於定義Dirichlet先驗,用於計算各自的後驗分布.Alpha是針對特定於文檔的主題分布的先驗的“濃度參數”,並且是針對主題特定的單詞分布的先前的β 。兩者都指出了關於主體和語料庫中單詞的稀疏性/同質性的先驗信念。

阿爾法在文檔中的主題稀疏性中起作用。高阿爾法值意味著主題稀疏性的影響較小,即預期文檔包含大多數主題的混合,而低的α值意味著我們希望文檔僅涵蓋少數主題。這也是為什麽alpha經常被設置為主題數量的一小部分(比如我們的評估中的1 / k):隨著要發現的主題越來越多,我們希望每個文檔都包含更少但更具體的主題。作為極端的例子:如果我們只想發現兩個主題(k = 2),那麽很可能所有文檔都包含兩個主題(不同的數量),因此我們有一個很大的alpha = 1/2值。如果我們想發現k = 1000主題,很可能大多數文檔不會覆蓋所有1000個主題,但只有一小部分(即稀疏性很高),因此我們采用alpha = 1/1000的低值來解釋這個問題預期的稀疏性。

同樣,β在主題中的單詞稀疏性中起作用。高貝塔值意味著詞稀疏性的影響較小,即我們期望每個主題將包含語料庫的大部分詞。這些主題將更“一般”,他們的單詞概率將更加統一。低β值意味著主題應該更具體,即它們的單詞概率將更不均勻,從而在更少的單詞上放置更高的概率。當然,這也與要發現的主題數量。有關高的β意味著很少但更常見的主題被發現,低貝塔應該用於更具體的更多主題.Griffiths和Steyvers解釋說,測試版“會影響模型的粒度:文檔語料庫可以合理地分解為不同規模的一組主題[...]。

技術分享圖片

主題模型,alpha = 1 / k,beta = 0.1

當我們使用與上述相同的alpha參數和相同的k範圍運行評估時,但是當β= 0.1而不是β= 0.01時,我們看到對數似然在k的較低範圍內最大化,即大約70到300(見上圖)隨著阿倫等人度量,它指向?在70和240之間的值因此,這證實了我們對測試的假設:。在嘗試查找較少數量的主題時應使用較高的測試階段。有趣的是,這次胡安度量也在給定?值範圍內的曲線中顯示了一個谷。這意味著,當使用具有許多主題的模型時,更高的測試值也會導致主題詞分布中的信息密度降低。

組合這些參數有很多種可能性,但是解釋這些參數通常並不容易。下圖顯示了不同情景的評估結果:(1)α和β的固定值取決於k,(2)α和β都固定, (3)α和β均取決於k

技術分享圖片

(1)主題模型,alpha = 0.1,beta = 1 /(10k)

技術分享圖片

(2)主題模型,alpha = 0.1,beta = 0.01

技術分享圖片

(3)主題模型,alpha = 1 / k,beta = 1 /(10k)

LDA超參數α,β和主題數量都相互關聯,相互作用非常復雜。認為對於給定的一組文檔存在某種“正確”的參數配置是錯誤的。首先,重要的是要弄清楚模型應該是多麽精細。如果它應該只涵蓋一些但非常一般的主題,或者應該捕獲更多更具體的主題。可以相應地設置阿爾法和測試階段,並且可以計算一些示例模型(例如,通過使用compute_models_paralleltmtoolkit中的函數)。在大多數情況下,用於定義模型“粒度”的beta的固定值似乎是合理的,這也是Griffiths和Steyvers所推薦的。一個更精細的模型評估,具有不同的alpha參數(取決於k)使用解釋的指標可以完成很多主題。

對保留數據的驗證

主題模型也可以在保留數據上進行驗證。遺憾的是,所提到的用於主題建模的Python的軟件包都沒有正確計算保持數據的困惑,而tmtoolkit目前也沒有提供這一點。此外,這甚至更加計算密集,特別是在進行交叉驗證時。不過,將這些結果與交叉驗證的結果進行比較會很有意思,這可以在將來的工作中完成。

▍需要幫助?聯系我們

在PYTHON中使用TMTOOLKIT進行主題模型LDA評估