標簽: 半監督學習,文本分類
作者:煉己者
本博客所有內容以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,並且是非商業用途,謝謝!
如果大家覺得格式看着不舒服,也歡迎大家去看我的簡書
半監督學習文本分類系列
用半監督算法做文本分類(sklearn)
sklearn半監督學習(sklearn)
基於自訓練的半監督文本分類算法
一. 摘要
本文主要講述基於協同訓練的半監督算法做文本分類,用三個差異性比較大的分類器對未標注數據進行標注,它們可以進行交叉驗證,大大提升了對未標注數據標記的置信度(簡單理解就是三個分類器同時對一個未標注數據標記一樣的標簽,那么這個標簽就可信了),從而提高分類器標注的准確率
二. 操作流程
1. 文本預處理
這里就不再贅述,參考這篇文章:中文文本預處理流程
這上面的流程很完整,而且有代碼,你只需要按着那個操作來即可
2. 協同訓練的操作方法
操作思路:
- 把數據data平均分成三份data1,data2,data3(也就是把上面操作之后得到的文本向量均分成三份)
- 寫一個函數:包含三個分類算法。就是構建三個差異性較大的分類器,我采用的是SVM,貝葉斯,xgboost三種算法。
- 用data1訓練SVM分類器,用data2訓練貝葉斯分類器,用data3訓練xgboost分類器。這樣我們就得到了三個初步訓練好的分類器。
- 接下來就是對剩下的所有未標注數據進行操作了,未標注數據一條一條過
操作思路:假設有10條未標注數據,第一條取出來了,三個分類器對它進行預測。有以下三種可能:
- 如果大家預測的都一樣,那就把它連同預測的標簽加入到總的訓練集data里。
- 如果有兩個預測的一樣,另外一個分類器預測的不一樣,比如SVM和貝葉斯預測的一樣,xgboost的不一樣,就把它們倆的標注結果放到data3里,然后再讓xgboost對更新的data3進行訓練。
- 如果大家都預測的不一樣,就把它放回未標注數據中
這樣操作的目的就是為了不斷地訓練三個分類器,讓它們最終對未標注數據預測的結果一樣。這樣一條一條未標注數據地過,直到未標注數據為空,最終過完。
3. 測試結果
我選了5000條數據進行預測。
測試的操作流程
- 把測試數據用同樣的方法轉化成文本向量
- 上面訓練過程中會保存模型,怎么操作可以看這篇文章 :
如何保存sklearn訓練好的算法模型 - 你把所有的模型都保存到一個目錄下了,那么我們進行預測的時候怎么批量地讀取這些模型呢?簡單地說就是怎么把目錄下所有的文件的文件名讀取到一個列表上。看這里—— python如何獲取目錄下的所有文件名
- 讀取模型,調用sklearn里的函數計算精度。因為保存的模型太多了,我是每種模型取100個左右,做測試,然后畫折線圖,看看精度的變化情況。
先放圖,看結果
1)這是svm的結果,我們發現訓練到后面,模型的效果在降低
2)這是bayes的結果,一開始有點詭異,但后面趨於穩定
3)這是xgboost的結果,很鬼畜,不知道為什么會如此波動
從模型效果上來講,我選出了每種模型效果最好的情況
SVM:0.62
bayes:0.67
xgboost:0.75
4.結論
從圖中觀察,我們發現:svm先升后降,bayes先升后穩定,而xgboost很鬼畜。但是效果xgboost是最強的。這里面的原因我知識有限,暫時無法解釋,大伙要是有什么想法可以在底下評論,我們可以交流交流