文本分類實驗項目日志(最後更新-2019.07.19)
文章目錄
- 1 One vs rest & stacking 二分類多分類器文本分類實驗
-
- 1.1 描述
- 1.2 實驗設計
-
- 1.2.1 舊方法
- 1.2.2 新方法
- 1.3 實驗結果和分析
-
- 1.3.1 實驗-舊方法
- 1.3.2 實驗-新方法
- 1.3.3 實驗-新方法-新資料
- 1.4 結論
- 1.5 內建學習的資源
- 1.6 項目位址
1 One vs rest & stacking 二分類多分類器文本分類實驗
1.1 描述
根據5-6月份 one vs rest(all)和stacking的融合實驗的若幹問題,6月中旬進行了改進。
5-6月份最終形成的方案為:融入KB;加入第一層分類器;改變KB傳回類目數量,形成多個對比實驗。具體方法和結果詳見1.3.4
5-6月份實驗存在的問題說明如下:
(1) 類間的相似性可能是影響最終結果的主要因素;
(2) 采取one-hot文本表示出現的次元過大以及OOA問題(如對于5:4:1比例,測試集占1/10,若測試集中某個詞未出現在訓練二分類器中的詞空間裡,則不能表示該特征,那麼測試時會失去該特征,進而影響測試結果);
(3) 最終準确率難以提升。
6月初提出的改進方案如下:
(1) 去掉知識庫;
(2) 加入第二層層級分類,使用fasttext訓練二級分類器。
(3) 使用詞向量表示文本特征。
1.2、 1.3給出了具體的實驗設計和結果。
1.2 實驗設計
1.2.1 舊方法
詳細的實驗方法如圖1所示。(舊版本)

圖1 文本分類架構
整個實驗可分為6個環節:資料預處理,訓練一級fasttext分類器,建構三級分類知識庫,訓練二分類分類器,訓練融合分類器和測試分類器。每個環節的詳細方法如下:
- 資料預處理。原始資料集儲存在兩個txt檔案,大小共約680MB,具體資料形狀如圖2所示。
大規模文本分類實驗-項目日志1 One vs rest & stacking 二分類多分類器文本分類實驗 圖2 資料集形狀
根據實驗設計思路,需要抽取并生成新的資料集。表1列出了4次實驗的資料集詳細資訊,其中1-3次是5月份實驗用資料集,第4次是6月份資料集,第4次與前3次的差別是:(1)類别數量增加一倍左右;(2)每個三級類的文檔數量未固定,即類别資料分布不均衡。(3)細化資料清洗環節(如抽取時考慮類号名字特點、去除無效文檔、去除重複詞語等)。
表1 資料集介紹
實驗次數 | 大小 | 類别數量 | 文檔數量 |
---|---|---|---|
1 | 7MB | 10 | 1000*10=10000 |
2 | 332MB | 467 | 1000*467=467000 |
3 | 278MB | 358 | 1000*358=358000 |
4 | 312MB | 773 | 727367 |
資料集劃分:每個類下,訓練二分類資料集:訓練融合分類資料集:最終測試集 = 5:4:1。
下面的流程主要以實驗4的資料集為例。
2. 訓練一級分類器。将所有資料集按照每行資料為‘__label__A,word1\tword2’的格式存儲。A代表一級分類号,word1代表文檔分詞後的第一個詞。然後使用fasttext模型訓練分類器,最後抽取總資料集的20%作為一級分類器測試。
3. 訓練二分分類器。對于每個三級類,長度為 l e 3 l e n g t h le3_{length} le3length,那麼該類的二分訓練集長度為 l e 3 b i n a r y L e n g t h = l e 3 l e n g t h ∗ 0.5 le3_{binaryLength} = le3_{length}*0.5 le3binaryLength=le3length∗0.5,從這些資料中随機抽取10個子集,然後加入其它三級類的若幹資料(長度大緻與屬于本類資料相同,記為 s u b n sub_n subn),最終的目标是使得每個子集包含sub_n個屬于該類的文檔, s u b n sub_n subn個不屬于該類的文檔。這 2 ∗ s u b n 2*sub_n 2∗subn個文檔使用機器學習分類算法訓練一個二分類器。共得到773*10=7730個分類器。
4. 訓練融合分類器。将 l e 3 l e n g t h le3_{length} le3length,那麼該類的融合訓練集長度為 l e 3 m e r g e L e n g t h = l e 3 l e n g t h ∗ 0.4 le3_{mergeLength} = le3_{length}*0.4 le3mergeLength=le3length∗0.4,抽取 l e 3 m e r g e L e n g t h le3_{mergeLength} le3mergeLength條該類文檔和不屬于該類的 l e 3 m e r g e L e n g t h le3_{mergeLength} le3mergeLength條文檔組合成 2 ∗ l e 3 m e r g e L e n g t h 2*le3_{mergeLength} 2∗le3mergeLength條文檔,然後用10個該類的二分分類器進行分類,結果以機率形式給出(分到類A81的機率),并儲存為長度為10的向量,标簽為1或0(如“A81”類資料,則标簽記為1,非“A81”類記0)。然後将這些向量進行訓練,得出融合的分類器。這樣共得到773個融合分類器。
5. 測試分類器。測試過程包括5個方面:測試一級分類器;知識庫(KB)分類;測試二分分類器;測試融合分類器;測試系統分類器。其中,測試系統分類器有多種方案,将在1.3.4節的結果和分析中提到。
1.2.2 新方法
新方法與舊方法的差別如下:
- 去掉KB。原因是經過實驗發現,加入KB會過濾掉正确的類号;去掉KB的副作用是增加測試的時間開銷。
- 加入二級分類。在一級分類的基礎上加入二級分類,原因是為了降低測試的時間開銷。
- 文本表示階段采用詞向量方法。原因是原來方法(tf-idf)會生成詞彙映射表檔案(将近900MB),并且會造成次元過大和OOA問題;使用詞向量可以避免前兩個問題,OOA問題與詞向量模型以及資料集有關。
-
使用詞向量中的詞作為自定義詞典分詞。這樣做的好處是在文本表示階段盡可能使每一個特征(詞語)都能夠用詞向量表示。(目前還在實驗階段)
新方法的具體步驟如下:
- 資料預處理。同1.2.1的1,僅使用第4次抽取的資料集。
- 訓練一級分類器。同1.2.1的2。
- 訓練二級分類器。将所有資料集按照每行資料為‘__label__A8,word1\tword2’的格式存儲。A8代表二級分類号,word1代表文檔分詞後的第一個詞。然後使用fasttext模型訓練分類器,最後抽取總資料集的20%作為測試。
- 訓練二分分類器和融合分類器。步驟與1.2.1的3和4大緻同,僅文本表示階段不同。
- 測試分類器。測試過程包括5個方面:測試一級分類器;測試二級分類器;測試二分分類器;測試融合分類器;測試系統分類器。其中,測試系統分類器較複雜,将在1.3中提到。
1.3 實驗結果和分析
1.3.1 實驗-舊方法
本次實驗加入了層級分類(FC)和知識庫(KB),第一層分類器使用fasttext算法,第二層分類器使用svm算法。其中,fasttext的測試結果為0.95.
最終測試時,經過和老師及學長讨論形成了兩種方案,後來經過實驗,又總結了幾種優化政策。下面是這幾種方案的介紹。
(1) 文檔首先經過KB,得到20個三級類号,然後僅在這20個類的20*10=200個二分類器和20個融合分類器中進行分類測試。記為way_1。
(2) 文檔首先經過7730個二分類器和773個融合分類器,然後将所有分類結果按機率從大到小排序,與KB的結果取交集。記為way_2。
(3) 加入一級分類。文檔首先經過一級分類器,得到一級分類号(如A),并經過KB,得到20個三級分類号(如A81,A84,B02,…,C81),然後僅在一級分類号下并且存在于20個三級分類号的分類器中進行分類測試(如在A81,A84中測試)。記為way_3。
以上三種方案,把最後得到排名前三的三級類号作為最終的分類結果。
此外,加入了baseline,即不加入KB和層級分類的結果,如下表所示。
表2 實驗4結果
實驗代号 | 準确率 | 運作時間/s |
---|---|---|
Baseline | 0.184 | 58113(約16h) |
Way_1 | 0.215 | 14886(約4.1h) |
Way_2 | 0.216 | 28106(約7.8h) |
Way_3 | 0.231 | 7035(約2h) |
從表2可以看出,增加KB,準确率提高了近0.03,并且時間性能大大改善。way_1和way_2主要差别在于時間,way_1運作時間更短,這與方案(1)和方案(2)的步驟有關。(1)和(2)是計算所有三級類的分類結果并排序,而(1)僅需要計算由知識庫得到的三級類下的分類器并排序,是以(1)的時間性能更好。
實驗Way_3驗證了加入第一層分類器是有效的,時間性能提高了一倍,準确率提高了0.015。是以下一步将考慮以way_3為基礎進行優化。
實驗發現,對于方案(3),增加從知識庫中傳回的結果數目,如經過KB得到30個結果,最終的準确率得到提高。是以,進行了幾組優化實驗,如表3所示。
表3 way_3的優化實驗結果
實驗代号 | KB類号數 | 準确率 | 運作時間/s |
---|---|---|---|
Way_3 | 20 | 0.231 | 7035(約2h) |
Way_4 | 30 | 0.269 | 10951(約3h) |
Way_5 | 50 | 0.305 | 20411(約5.6h) |
Way_6 | 60 | 0.312 | 20150(約5.6h) |
由表3,增加KB的類号後,準确率顯著提高,但相應的時間開銷也增加。
為了分析具體分類時每個類的效果,實驗統計了每個文檔在分類時的第一層分類結果、KB分類結果、最終分類結果清單(top10)。以way_6為例,選取三個有代表性的類别,其中其整體的準确率如表4所示,選取其中若幹個文檔具體分析結果如表5所示。
表4 三個類的準确率
三級類号 | 文檔數 | 準确率 |
---|---|---|
A849 | 1526 | 0.84 |
D08 | 820 | 0.475 |
Q593 | 732 | 0.000 |
表5 三個文檔的具體分類結果
文檔 | KB結果 | Le1結果 | 最終結果(取top10,不足10個全部選擇) |
---|---|---|---|
A849_C1 | A:12;B:1;C:1;D:20… | A | [‘A849’, ‘A81’] |
D08_C1 | B:1;C:1;D:5;Q:41… | D | [‘D52’,‘D43’,‘D90’] |
Q593_C1 | S:7;Q:40… | Q | [‘Q942’,‘Q945’,‘Q95-3’,‘Q25’, ‘Q53’,‘Q935’,‘Q954’,‘Q936’, ‘Q948’, ‘Q24’] |
由表5知,在D08類中一個文檔的KB結果中出現了較多的Q類,并且最終分類結果中未命中D08;在Q593類中一個文檔中雖然大部分都是Q類,但最終結果(top3)并沒有命中。
表4和表5隻是列出了個别文檔的分類情況,這三個類全部分類情況見附件1.
此外,為了分析其它類的分類效果,統計了那些效果較差的類别,如圖5所示。其中,橫坐标表示準确率,縱坐标表示低于準确率的三級類類别數量。類别總數為773.
圖5 三級類準确率分布情況
從圖5可以看出,大部分三級類的準确率低于0.5,有将近一半低于0.3,有20個三級類準确率為0.0.
基于目前的實驗,可考慮的優化方法包括這幾個方面:改善KB;改善第一層分類器性能;剔除效果非常差的類别。
1.3.2 實驗-新方法
本次實驗加入了第二層級分類(FC),并且文本表示使用詞向量方法(百科訓練的詞向量模型,大小1.7GB),第二層分類器使用fasttext算法,第三層分類器使用svm算法。其中,第一層分類器的測試結果為0.95,第二層分類器的測試結果為0.93.
新方法的幾次過程結果如表6所示。
實驗代号 | 描述 | 準确率 | 運作時間/s |
---|---|---|---|
Baseline(Way_6) | 舊方法最好結果 | 0.312 | 20150(約5.6h) |
New_way_1 | 加入二級分類器 | 0.334 | 14169(約3.9h) |
New_way_2 | 在new_way_1基礎上去掉KB | 0.484 | 64741(約18h) |
New_way_3 | 在new_way_2基礎上使用詞向量 | 0.455 | 33425(約9.3h) |
由表6,New_way_1加入二級分類器的效果提升不大,但是時間開銷降低。New_way_2去掉KB後準确率大幅提升,達到0.484,但是時間開銷增大3倍多。New_way_3使用詞向量,準确率降低了0.03,但時間開銷降低了一倍。
由此分析,新方法是有效的。
對于新方法New_way_3,使用詞向量仍會出現OOA問題,故使用詞向量中的詞作為自定義詞典分詞。這樣做的好處是在文本表示階段盡可能使每一個特征(詞語)都能夠用詞向量表示。這個方法目前在實驗階段。
1.3.3 實驗-新方法-新資料
本次資料選取的是規模為7.32GB資料,經過預處理後,大小為5.16GB。預處理包括分詞、去除無效資料等。分詞使用百度詞向量生成的詞典進行分詞。5.16GB資料的情況如表7所示。
表7 新資料集介紹
實驗次數 | 大小 | 類别數量 | 文檔數量 |
---|---|---|---|
5 | 5.16GB | 1679 | ? |
由于類别資料少會影響分類性能,故去掉資料小于500條的三級類别,共得到851個三級類。
根據這851個類進行實驗,方法與1.3.2相同。
使用fasttext訓練一級分類器的準确率為0.92,訓練二級分類器的準确率為0.77。
表8給出了實驗的結果。
實驗代号 | 描述 | 準确率 | 運作時間/s |
---|---|---|---|
New_way_data_1 | 和New_way_3不同的是未加入2級分類器 | 0.20 | 147581(約41h) |
New_way_data_2 | 方法和new_way_3同 | 0.41 | 35556(約9.8h) |
1.4 結論
根據新-舊實驗和若幹次讨論,得到結論如下:
(1) 加入第二層分類器是有效的。對比表6的幾個方案結果,發現加入第二層分類對分類效果和時間性能有一定提升。
(2) 去掉知識庫是有效的。根據表6的結果,去掉KB能大幅提升準确率。
(3) 使用詞向量可以縮短訓練和測試時間。根據表6結果,詞向量在準确率方面和TF-IDF方法相差不大,但時間開銷降低一半,此外,使用詞向量不需要生成額外的映射檔案。
根據以上結論,新方法是目前最好的文本分類方案,将應用到實際的标引項目中。
1.5 內建學習的資源
內建學習-1:https://blog.csdn.net/qq_20386411/article/details/82985219
內建學習-2: https://blog.csdn.net/qq_32690999/article/details/78759463
Stacking原理:https://blog.csdn.net/wstcjf/article/details/77989963
Stacking代碼實作:https://www.jianshu.com/p/5905f19c4df6
模型融合(stacking&blending) :https://blog.csdn.net/u014356002/article/details/54376138
1.6 項目位址
Hierarchical-text-classify