1. 程式人生 > >基於協同訓練的半監督文字分類演算法

基於協同訓練的半監督文字分類演算法

標籤: 半監督學習,文字分類
作者:煉己者
---
本部落格所有內容以學習、研究和分享為主,如需轉載,請聯絡本人,標明作者和出處,並且是非商業用途,謝謝!
如果大家覺得格式看著不舒服,也歡迎大家去看我的簡書


半監督學習文字分類系列

用半監督演算法做文字分類(sklearn)
sklearn半監督學習(sklearn)
基於自訓練的半監督文字分類演算法


一. 摘要

本文主要講述基於協同訓練的半監督演算法做文字分類,用三個差異性比較大的分類器對未標註資料進行標註,它們可以進行交叉驗證,大大提升了對未標註資料標記的置信度(簡單理解就是三個分類器同時對一個未標註資料標記一樣的標籤,那麼這個標籤就可信了),從而提高分類器標註的準確率

二. 操作流程

1. 文字預處理

這裡就不再贅述,參考這篇文章:中文文字預處理流程
這上面的流程很完整,而且有程式碼,你只需要按著那個操作來即可

2. 協同訓練的操作方法

操作思路:

  1. 資料data平均分成三份data1,data2,data3(也就是把上面操作之後得到的文字向量均分成三份)
  2. 寫一個函式:包含三個分類演算法。就是構建三個差異性較大的分類器,我採用的是SVM,貝葉斯,xgboost三種演算法。
  3. 用data1訓練SVM分類器,用data2訓練貝葉斯分類器,用data3訓練xgboost分類器。這樣我們就得到了三個初步訓練好的分類器。
  4. 接下來就是對剩下的所有未標註資料進行操作了,未標註資料一條一條過
    操作思路:假設有10條未標註資料,第一條取出來了,三個分類器對它進行預測。有以下三種可能:

    • 如果大家預測的都一樣,那就把它連同預測的標籤加入到總的訓練集data裡。
    • 如果有兩個預測的一樣,另外一個分類器預測的不一樣,比如SVM和貝葉斯預測的一樣,xgboost的不一樣,就把它們倆的標註結果放到data3裡,然後再讓xgboost對更新的data3進行訓練。
    • 如果大家都預測的不一樣,就把它放回未標註資料中

這樣操作的目的就是為了不斷地訓練三個分類器,讓它們最終對未標註資料預測的結果一樣。這樣一條一條未標註資料地過,直到未標註資料為空,最終過完。

3. 測試結果

我選了5000條資料進行預測。

測試的操作流程

  1. 把測試資料用同樣的方法轉化成文字向量
  2. 上面訓練過程中會儲存模型,怎麼操作可以看這篇文章 :
    如何儲存sklearn訓練好的演算法模型
  3. 你把所有的模型都儲存到一個目錄下了,那麼我們進行預測的時候怎麼批量地讀取這些模型呢?簡單地說就是怎麼把目錄下所有的檔案的檔名讀取到一個列表上。看這裡—— python如何獲取目錄下的所有檔名
  4. 讀取模型,呼叫sklearn裡的函式計算精度。因為儲存的模型太多了,我是每種模型取100個左右,做測試,然後畫折線圖,看看精度的變化情況。

先放圖,看結果

1)這是svm的結果,我們發現訓練到後面,模型的效果在降低

svm

2)這是bayes的結果,一開始有點詭異,但後面趨於穩定

bayes

3)這是xgboost的結果,很鬼畜,不知道為什麼會如此波動

xgboost

從模型效果上來講,我選出了每種模型效果最好的情況

SVM:0.62
bayes:0.67
xgboost:0.75

4.結論

從圖中觀察,我們發現:svm先升後降,bayes先升後穩定,而xgboost很鬼畜。但是效果xgboost是最強的。這裡面的原因我知識有限,暫時無法解釋,大夥要是有什麼想法可以在底下評論,我們可以交流交流