向AI轉型的程式設計師都關注了這個號👇👇👇
機器學習AI算法工程 公眾號: datayx
這裡將主要介紹我在比賽中用到的幾個模型,從理論到代碼實現進行總結,其中涉及CHI選擇特徵詞,TFIDF計算權重,樸素貝葉斯、決策樹、SVM、XGBoost等算法,實現傳統的文本分類並取得了不錯的效果。
此外,還是用cnn卷積神經網絡實現了中文的文本分類,效果要優於上述算法。
完整源碼(包括冠軍源碼) 獲取方式:
關注微信公眾號 datayx 然後回復 文本分類 即可獲取。
數據集
數據集中主要包含下面幾個文件,可見數據集很小也很簡單,只需要使用training.csv文件進行訓練我們的文本分類模型,使用testing.csv進行預測並提交結果即可:
下面是訓練集的前兩行,每一行的第一個數字表示該行文本的類別,後面的描述就是要建模的文本。這個數據集是11個公司的描述數據,我們要根據4774條訓練數據去預測2381條數據的類別標籤。除此之外,我們還可以看到這些訓練數據存在較嚴重的類別不平衡問題。如下圖所示:
2,合晟資產是一家專注於股票、債券等二級市場投資,為合格投資者提供專業資產管理服務的企業。公司業務範圍包括資產管理、投資諮詢和投資顧問服務。公司管理的私募基金產品主要包括股票型、債券型資產管理計劃或證券投資基金,管理總資產規模80億元左右。根據中國證券投資基金業協會數據,公司管理的私募證券投資基金(顧問管理)類規模較大,公司管理規模處於50億元以上的第一梯隊。
2,公司的主營業務為向中小微企業、個體工商戶、農戶等客戶提供貸款服務,自設立以來主營業務未發生過變化。
了解完數據集,接下來我們開始進行文本分類,開始提交結果。
2, 樸素貝葉斯分類法
在這裡插句題外話,往往這種競賽大家喜歡一上來什麼都不做先提交一個結果站站場面==也就是提交一個隨機結果、均值等。因為我看到這個比賽的時候都已經快結束了,比較匆忙,所以第一次提交的也是直接用隨機數生成的,後來還自作多情的按照訓練集的類比佔比作為每個類別概率生成隨機數(結果顯示確實有提高),代碼如下所示
好,接下來說正經的,我用的第一種方法就是樸素貝葉斯,可以參見我之前的一篇博客,http://blog.csdn.net/liuchonge/article/details/52204218
介紹了使用CHI選擇特徵,TFIDF計算特徵權重,樸素貝葉斯分類的整體流程。因為之前做了這樣的嘗試,所以這裡直接套過來看看效果如何,代碼入下,這裡的代碼都是自己實現的,太醜,其實可以直接調用gensim的接口去做,以後有時間改改代碼:
這裡我們可以為每個類選出最具代表性的十個詞語看一下,從下面的特徵詞可以看出來,我們程序提取的特徵詞還是很具有類別區分度的,也可以看出第四類和第九類、第五類和第八類較為相似,可能在分類上會比較難區分:
接下來調用train.py函數,就可以得到我們的預測結果,這裡我使用了樸素貝葉斯、決策樹、SVC三種算法,但是結果顯示樸素貝葉斯效果更好,根據參數不同測試集準確率大概達到了78%~79%左右。此外還有幾個地方可以調節:
特徵詞維度的選擇,即上面代碼feature_select_use_new_CHI()函數中每個類別選擇多少個特徵詞,取值範圍在100-500
特徵權重的計算方式,即上面代碼document_features()函數中對每個特徵詞的權重計算方式,我們可以認為只要出現就記為1,否則為零;或者使用其在該文本中出現次數作為權重;或者使用TF-IDF作為權重,或者其他方法。。。
分類器的選擇及參數調整,其實我們應該取出500條記錄作為測試集去驗證模型好壞以及作為參數選擇的依據,但是因為時間比較緊迫,所以我並未作這部分工作==
此外,在獲得了上面所說的類別特徵詞之後(每類取十個),我還嘗試著用簡單的類別匹配方法進行分類,思路很簡單,就是看測試集包含哪個特徵集中的單詞更多,代碼入下:
這個效果一般,準確率好像是在69%或者74%左右。
XGBoost算法–文本分類
考慮到xgboost算法在各類競賽中都有很好的效果,我也決定使用該算法嘗試一下效果如何,在網上找了一篇博客,直接套用到這裡。我們使用所有的詞作為特徵進行one-hot編碼(使用from sklearn.feature_extraction.text import CountVectorizer和 from sklearn.feature_extraction.text import TfidfTransformer),代碼如下:
效果不錯,測試集可以達到80%的準確度,出乎意料的好==然後我還嘗試將提取出來的特徵用到XGBoost模型上,也就是在train.py中調用xgboost模型,結果發現準確度出不多也是80%左右,沒有很大提升。其實這裡也應該做參數優化的工作,比如xgboost的max_depth、n_estimate、學習率等參數等應該進行調節,因為時間太緊我這部分工作也沒做,而是使用的默認設置==
4, 卷積神經網絡
這裡使用YOON KIM的模型框架,代碼使用WILDML的,可以參見我之前的一篇博客,為了適用於本任務,修改一下 data_helpers.py文件中的代碼,增加load_AI100_data_and_labels()函數,用於讀取訓練集和測試集。然後就可以訓練了,這裡使用隨機初始化的詞向量,讓其隨模型訓練,效果不錯,測試集精確度達到了82%以上,之後我還嘗試了一下使用char-cnn模型,但是效果不太好,根本就沒有辦法收斂,可能是參數選擇的不對或者訓練集太小了,但是到這比賽就結束了,我也沒有時間和機會去嘗試更所得模型和參數==
5,冠軍的方法
賽後,舉辦方請第一名的選手分享了方法和經驗,我發現他也是使用的卷積神經網絡,不過分詞的時候加入了詞性標註,然後使用gensim單獨訓練詞向量,然後卷積層的使用了1000個卷積核等等吧,其分享連結為:http://geek.ai100.com.cn/2017/05/18/1580
模型架構如下圖所示:
閱讀過本文的人還看了以下:
《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼
《深度學習之pytorch》pdf+附書源碼
將機器學習模型部署為REST API
FashionAI服裝屬性標籤圖像識別Top1-5方案分享
重要開源!CNN-RNN-CTC 實現手寫漢字識別
yolo3 檢測出圖像中的不規則漢字
同樣是機器學習算法工程師,你的面試為什麼過不了?
前海徵信大數據算法:風險概率預測
【Keras】完整實現『交通標誌』分類、『票據』分類兩個項目,讓你掌握深度學習圖像分類
VGG16遷移學習,實現醫學圖像識別分類工程項目
特徵工程(一)
特徵工程(二) :文本數據的展開、過濾和分塊
特徵工程(三):特徵縮放,從詞袋到 TF-IDF
特徵工程(四): 類別特徵
特徵工程(五): PCA 降維
特徵工程(六): 非線性特徵提取和模型堆疊
特徵工程(七):圖像特徵提取和深度學習
如何利用全新的決策樹集成級聯結構gcForest做特徵工程並打分?
Machine Learning Yearning 中文翻譯稿
螞蟻金服2018秋招-算法工程師(共四面)通過
全球AI挑戰-場景分類的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(列印收藏)
python+flask搭建CNN在線識別手寫中文網站
中科院Kaggle全球文本匹配競賽華人第1名團隊-深度學習與特徵工程
不斷更新資源
深度學習、機器學習、數據分析、python
搜索公眾號添加: datayx
長按圖片,識別二維碼,點關注