1. 程式人生 > >[機器學習]機器學習在短文字分類專案中的應用

[機器學習]機器學習在短文字分類專案中的應用

一:前言

之前答應一個朋友介紹一下機器學習專案的基本流程,就以一個短文字分類專案為示例,介紹一下在面對機器學習專案時的基本解決思路,因為不是專業的演算法工程師,所以有疏漏之處請大家多多見諒。同時由於這是一個內部比賽專案,所以資料無法公開,但是程式碼會分享在git上,程式碼寫的也很一般,請大家多多理解。

二:題目

為了減少公司售後服務的人力投入,相關部門做了售後智慧機器人,主要通過使用者的問題得到他的意圖所屬類別,但是現有的方案對使用者提問問題的類別識別準確率較低,需要研究更為優化的方案提升問題類別識別準確率。出題方提供的資料集如下,大概22w條資料,已知存在大量髒資料,問題和所屬類別中間用\t分隔。


同時提供2w條預測資料,預測資料只有使用者的問題,需要去預測這2w條問題所屬的類別。

在本題中,評價標準是優先比較問題識別總的準確率,準確率相同比較類別24的召回率(查準率和查全率的加和平均)。

三:解決思路

1.判斷題目類別

機器學習專案有(分類/迴歸/聚類)三大類問題,分類就是訓練集已知樣本和對應的類別,然後去預測新的樣本類別;迴歸就是相當於分類中的離散值類別變成連續值;聚類就是訓練集中沒有類別,需要通過聚類演算法去找到對應類別。

本道題是一個典型的分類的問題,由於使用者所提的問題都很短,所以是一個短文字分類問題,確定好問題之後,下面就是去搜集對應的資料了。

2.蒐集資料

一般來說現有的問題學術界都已經給出瞭解決方案,所以可以通過關鍵詞(短文字分類/Text Classfication)去搜索(百度/中國知網/Google Scholar),通過查閱資料可以知道解決短文字分類有以下幾種常見的解決方案:

(1)通過TF-IDF演算法生成每個短文字的特徵向量,然後使用傳統分類演算法去訓練模型,通過模型去預測新資料的類別。

(2)通過Word2Vec演算法生成每個短文字的特徵向量,然後使用CNN卷積神經網路進行模型訓練,通過模型去預測新資料的類別。

(3)通過Word2Vec演算法生成每個短文字的特徵向量,然後使用CNN進行文字語義相似度分析,通過文字相似度判斷所屬類別。

3.確認方案

由於剛開始做的時候對該型別專案不熟悉,所以就採用了第一種最傳統的做法,簡單高效學習成本低。下面概述的就是基於第一種方案,該方案效果較優,但可拓展性差,後面會做詳細說明。

4.資料探查

在實際專案中,樣本分佈不均勻和樣本質量低下都是常見的問題,分佈不均勻反映在不同類別的訓練樣本數量呈幾十到上百倍的差距,樣本質量低下反映的是大量樣本類別標錯/樣本特徵值缺失/樣本特徵值錯誤等問題。通過人工探查和資料分析得到如下的結論:


5.資料處理

資料處理有兩方面工作:

(1)首先要使用分詞工具對樣本進行切詞,並過濾掉停用詞(停用詞就是類似標點符號/轉折詞/語氣詞這些詞彙,因為本方案採用的是TF-IDF方法,是基於詞頻逆文字的方案,所以不需要這些語氣轉折詞),並針對過濾掉停用詞為空的樣本標記為“閒聊”類別。

(2)使用TF-IDF提取各類別的關鍵詞,然後進行近義詞拓展,得到每個類別的關鍵詞,如果訓練集中某類別的樣本不包含對應的類別關鍵詞,就將該樣本過濾(因為使用者提問的問題都是很直白的,比如酒店型別的問題中一般都會包含訂房/退房/改簽等,所以可以認為不包含對應類別的關鍵詞但是屬於該類別的樣本就是髒樣本,這種方式是基於規則的,通過該方式過濾了30%的髒樣本,人工check之後發現效果過濾很好)。


6.資料平衡

資料不平衡是機器學習專案中最常遇見的問題,容易造成過擬合,業界也有很多解決方案,本方案採用了最簡單的隨機過取樣方式,針對實驗預測效果不佳的類別進行過取樣。


7.特徵工程

特徵工程在正常的機器學習專案中屬於最重要的一環,比如你有n個樣本,那你要構造出m個特徵(m範圍一般幾百到幾千,以購物為例,使用者過去1/2/3/4/5/6/7天的購買數就是7維特徵了,這種專案就需要根據業務去構建合適的特徵),這樣一個n*m的矩陣就可以作為輸入去訓練模型了。由於本文是短文字分類的問題,直接使用TF-IDF通過字典構造特徵的,並不需要人為干預,所以在這裡特徵工程就不是重點要說的了。使用TF-IDF為文字構造向量,維度設定為1w維,特徵向量矩陣如下(因為維度太高,所以無法使用Smote演算法進行過取樣,也無法使用K-means進行樣本過濾,所以建議還是使用Word2Vec生成幾百維向量,方便拓展,但是畢竟這種方法好理解,作為練手完全可以)。


8.模型選擇

因為這是個分類問題,所以採用分類演算法,業界常用邏輯迴歸/xgboost/gbdt/隨機森林等,在進行模型訓練時,一般要選擇百分之80資料作為訓練集,百分之20資料作為測試集,用訓練集去訓練模型,用測試集去測試模型的好壞,這樣可以通過測試集的結果進行調參。為了防止模型抖動,一般會每次使用不同的不相交的百分之20資料作為測試集,剩下的資料作為訓練集,取平均測試結果作為模型的預測結果,這種方式叫做五折(100/20)交叉驗證,當然你也可以採用任意折交叉驗證,這個視經驗而定。如果訓練了不同的模型,可以將多個模型結果進行融合,模型融合有bagging/stacking/blending等方法,本文方案也嘗試了加權方式的模型融合,但是發現效果沒有直接使用隨機森林方法好,可能是引數沒調好,最後因為時間原因還是採用速度快且效果明顯的隨機森林演算法。下圖分別表示各模型效果以及隨機森林演算法在各個子類別上的效果(在實驗中發現某些樣本數少的類別預測效果明顯低於平均值,這個時候可以針對這些類別進行過取樣或者單獨預測)。


9.預測結果

最後用模型去預測,得到預測資料集的類別,和出題方給的真實類別進行比對,得出該模型預測結果總體準確率為百分之91%,類別24的f1值為0.98。


10.總結與反思

本文采用了傳統的機器學習方法對短文字進行分類,容易理解且方便上手,但是採用TF-IDF演算法生成的向量維度太高,無法進行有效拓展,如果採用Word2Vec方法,向量維度可以降低到幾百維,這時可以使用K-means演算法對樣本進行聚類,對距離類別中心點較遠的樣本點進行過濾,同樣可以採用Smote演算法進行取樣,有效的解決了髒樣本過濾和類別不平衡的問題,降低了模型過擬合的風險。由於工作方向和時間的原因,沒有進一步實現解決該問題的CNN方案。

四:程式碼地址

程式碼中敏感資訊有刪減,希望大家見諒,僅供參考

https://github.com/pengjiapeng/hackathon