文本分類又來了,用 Scikit-Learn 解決多類文本分類問題
雷鋒網 AI 研習社按:本文為雷鋒字幕組編譯的技術博客,原標題 Multi-Class Text Classification with Scikit-Learn,作者為 Susan Li 。
翻譯 | 朱茵 整理 | 餘杭 MY
在商業領域有很多文本分類的應用,比如新聞故事通常由主題來分類;內容或產品常常被打上標籤;基於如何在線談論產品或品牌,用戶被分成支持者等等。
然而大部分的文本分類文章和網上教程是二進位的文本分類,像垃圾郵件過濾(spam vs. ham)、情感分析(積極的和消極的)。在大量實例中,我們現實世界的問題要比這些複雜的多。因此,這是我們今天要做的:將消費者的財務投訴分成12個預定義的類。這些數據可以從 data.gov 下載。
我們使用 Python 和 Jupyter Notebook 來開發我們的系統,依靠 Scikit-Learn 作為機器學習的部件。如果你想看下在 PySpark 中的實現,請閱讀下一篇文章:
https://medium.com/@actsusanli/multi-class-text-classification-with-pyspark-7d78d022ed35。
問題形成
我們的問題是有監督的文本分類問題,目標是調查哪一種有監督的機器學習方法最適於解決該問題。
鑒於新的投訴的到來,我們想將它歸到12個分類目錄中。分類器使得每個新投訴被歸類到一個僅且一個類別中。這是一個多類文本分類問題。我已經迫不及待地想看下我們完成的結果。
數據瀏覽
在投入訓練機器學習模型前,我們應當先看一些實例以及每個類別中投訴的數量:
圖1
針對這個項目而言,我們僅需要2欄:「Product」和「Consumer complaint narrative」。
輸入: Consumer_complaint_narrative
實例:「在我的信用報告上有過時的信息,我之前對該信用報告有爭議,該項信息記錄應該被刪除,該信息是7年多之前的並且不符合信用報告的要求。」
輸出:產品
實例:信用報告
我們將在消費者投訴陳述欄刪除無賦值的,並且增加一欄編譯該產品作為一個整數值,因為通常分類屬性變數用整數比用字元串代表要好。
我們也創建了幾個字典以備將來使用。
清理後,這是我們要使用的最初的5行數據:
圖2
不平衡的分類
我們看到每個產品的投訴數值不平衡。消費者的投訴多針對索回債款、信用報告和房屋抵押貸款。
圖3
當我們遇到問題時,我們會用標準演算法解決這些問題。傳統的演算法常常傾向於大多數的分類,並不會將數據分布考慮進去。最糟的情況,少數的分類被當做異常值被忽略了。在一些例子中,像欺詐偵測和癌症預測,我們將仔細設置我們的模型或人工平衡數據集,比如通過欠採樣和過採樣每個類。
然而,在我們的學習不均衡的數據的例子中,我們會將興趣點放在佔少數的的分類上。在大多數分類上具有高準確率的分類器是令人滿意的。然而針對佔少數的分類也應當保持合理的準確度。就這樣吧。
文本表達
分類器和學習演算法不能以他們原來的形式直接處理文本文件,他們大多數需要有固定大小的數字特徵向量而不是帶有變數長度的原來的文本文件。因此,在預處理的階段文本將被轉成更好處理的表達方式。
一個從文本中提取特徵的常用方法是使用辭彙模型袋:一種給每個文件,在我們的例子中的投訴陳述,辭彙的呈現(通常是頻率)將被考慮進去,但這些辭彙出現的順序是被忽略的。
尤其是我們數據集的每個術語,我們將計算一種被稱為術語頻率的測量方法。逆文檔頻率,縮寫成tf-idf。我們將使用 sklearn.feature_extraction.text.TfidfVectorizer 給每個消費者投訴陳述計算一個 tf-idf 向量:
sublinear_df 設置為True 給頻率使用一種演算法形式。
min_df 是文檔的最小數值is the minimum numbers of documents a word must be present in to be kept.
norm 設置為l2,來確保我們的特徵向量具有歐幾里得標準1.
ngram_range 設置為) (1,2)來表明我們同時考慮一元語法和二元語法。
stop_words 設置為"english" 來移除所有相同的代詞("a", "the", ...)用以減少噪音特徵的數量。
(4569, 12633)
現在,每 4569 個消費者投訴陳述由12633個特徵表示,代表不同的一元和二元語法的 tf-idf 分數。
我們可以使用 sklearn.feature_selection.chi2 來尋找和每個產品最相關的術語:
# 『Bank account or service』:
. 最相關的一元語法:
. bank
. overdraft
. 最相關的二元語法:
. overdraft fees
. checking account
# 『Consumer Loan』:
. 最相關的一元語法:
. car
. vehicle
. 最相關的二元語法:
. vehicle xxxx
. toyota financial
# 『Credit card』:
. 最相關的一元語法:
. citi
. card
. 最相關的二元語法:
. annual fee
. credit card
# 『Credit reporting:
. 最相關的一元語法:
. experian
. equifax
. 最相關的二元語法:
. trans union
. credit report
# 『Debt collection』:
. 最相關的一元語法:
. collection
. debt
. 最相關的二元語法:
. collect debt
. collection agency
# 『Money transfers』:
. 最相關的一元語法:
. wu
. paypal
. 最相關的二元語法:
. western union
. money transfer
# 『Mortgage』:
. 最相關的一元語法:
. modification
. mortgage
. 最相關的二元語法:
. mortgage company
. loan modification
# 『Other financial service』:
. 最相關的一元語法:
. dental
. passport
. 最相關的二元語法:
. help pay
. stated pay
# 『Payday loan』:
. 最相關的一元語法:
. borrowed
. payday
. 最相關的二元語法:
. big picture
. payday loan
# 『Prepaid card』:
. 最相關的一元語法:
. serve
. prepaid
. 最相關的二元語法:
. access money
. prepaid card
# 『Student loan』:
. 最相關的一元語法:
. student
. navient
. 最相關的二元語法:
. student loans
. student loan
# 『Virtual currency』:
. 最相關的一元語法:
. handles
. https
. 最相關的二元語法:
. xxxx provider
. money want
這些都很講得通,對么?
多級類別分類器:特徵和設計
為了訓練有監督的分類器,我們首先將「消費者投訴陳述」轉化為數字向量。我們開發了類似 TF-IDF 權值向量的向量表示。
在得到文本的向量表示後,我們可以訓練有監督的分類器來訓練看不見的「消費者投訴陳述」和預測「產品」將落在哪個分類。
上述所有這些數據轉化後,現在我們有了所有的特徵和標籤,是時候來訓練分類器了。針對這種類型的問題,許多演算法可供我們使用。
樸素貝葉斯分類器:最適合的辭彙計算的是多項式變數:
在配置好訓練設置後,我們來做一些預測。
[『Debt collection』]
圖4
[『Credit reporting』]
圖5
還不算太糟!
模型選擇
我們現在可以用不同的機器學習模型來做測試了,評估他們的準確度和尋找任一潛在問題的源頭。
我們將用下列四種模型來做測試:
邏輯回歸
(多項) 樸素貝葉斯
線性支持向量機
隨機森林
圖6
model_name
LinearSVC: 0.822890
LogisticRegression: 0.792927
MultinomialNB: 0.688519
RandomForestClassifier: 0.443826
Name: accuracy, dtype: float64
線性支持向量機和邏輯回歸比其他兩種分類器表現更好,線性支持向量機有一個小優勢,它具備 82% 左右的準確率。
模型評估
繼續我們最好的模型(線性支持向量機),我們看下混淆矩陣,展示下預測的和實際的標籤之間的差異。
圖7
大多數的預測最終呈現的是對角線(預測的標籤 = 實際的標籤),正是我們想要的。然而,還是有許多的誤分類,看看他們是由什麼引起的也許蠻有意思的:
圖8
圖9
你可以看到,一些誤分類的投訴是一些跟不止一個主題相關的投訴(比如,包括信用卡和信用報告的投訴)。這種錯誤將一直發生。
然後我們使用 chi-squared test 來尋找與每個目錄最相關的術語:
# 『Bank account or service』:
. 最高一元語法:
. bank
. account
.最高二元語法:
. debit card
. overdraft fees
# 『Consumer Loan』:
.最高一元語法:
. vehicle
. car
.最高二元語法:
. personal loan
. history xxxx
# 『Credit card』:
.最高一元語法:
. citi
. card
.最高二元語法:
. credit card
. discover card
# 『Credit reporting:
.最高一元語法:
. equifax
. transunion
.最高二元語法:
. xxxx account
. trans union
# 『Debt collection』:
. 最高一元語法:
. collection
. debt
. 最高二元語法:
. account credit
. time provided
# 『Money transfers』:
. 最高一元語法:
. paypal
. transfer
. 最高二元語法:
. money transfer
. send money
# 『Mortgage』:
. 最高一元語法:
. mortgage
. escrow
. 最高二元語法:
. loan modification
. mortgage company
# 『Other financial service』:
. 最高一元語法:
. passport
. dental
. 最高二元語法:
. stated pay
. help pay
# 『Payday loan』:
. 最高一元語法:
. payday
. loan
. 最高二元語法:
. payday loan
. pay day
# 『Prepaid card』:
. 最高一元語法:
. prepaid
. serve
. 最高二元語法:
. prepaid card
. use card
# 『Student loan』:
. 最高一元語法:
. navient
. loans
. 最高二元語法:
. student loan
. sallie mae
# 『Virtual currency』:
. 最高一元語法:
. https
. tx
. 最高二元語法:
. money want
. xxxx provider
這些跟我們的預期一致。
最後,我們給每個類別列印分類報告:
圖9
源代碼可以在 Github 上找到,鏈接如下:
http://suo.im/5l2J51
https://towardsdatascience.com/multi-class-text-classification-with-scikit-learn-12f1e60e0a9
號外號外~
一個專註於
AI技術發展和AI工程師成長的求知求職社區
誕生啦!
歡迎大家掃碼體驗
AI研習社
採用通用語言模型的最新文本分類介紹
※葉志豪:介紹強化學習及其在 NLP 上的應用
※用 OpenCV 檢測圖像中各物體大小
TAG:AI研習社 |