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


標簽: 半監督學習,文本分類
作者:煉己者

本博客所有內容以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,並且是非商業用途,謝謝!
如果大家覺得格式看着不舒服,也歡迎大家去看我的簡書


半監督學習文本分類系列

用半監督算法做文本分類(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是最強的。這里面的原因我知識有限,暫時無法解釋,大伙要是有什么想法可以在底下評論,我們可以交流交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM