文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

 2018-07-25 10:49:00.0

按:本文原標題 Multi-Class Text Classification with Scikit-Learn,作者爲 Susan Li 。

翻譯 | 朱茵      整理 | 餘杭  MY

 

在商業領域有很多文本分類的應用,比如新聞故事通常由主題來分類;內容或產品常常被打上標籤;基於如何在線談論產品或品牌,用戶被分成支持者等等。

然而大部分的文本分類文章和網上教程是二進制的文本分類,像垃圾郵件過濾(spam vs. ham)、情感分析(積極的和消極的)。在大量實例中,我們現實世界的問題要比這些複雜的多。因此,這是我們今天要做的:將消費者的財務投訴分成12個預定義的類。這些數據可以從 data.gov 下載。

我們使用 Python 和 Jupyter Notebook 來開發我們的系統,依靠 Scikit-Learn 作爲機器學習的部件。如果你想看下在 PySpark 中的實現,請閱讀下一篇文章。


問題形成

我們的問題是有監督的文本分類問題,目標是調查哪一種有監督的機器學習方法最適於解決該問題。

鑑於新的投訴的到來,我們想將它歸到12個分類目錄中。分類器使得每個新投訴被歸類到一個僅且一個類別中。這是一個多類文本分類問題。我已經迫不及待地想看下我們完成的結果。


數據瀏覽

在投入訓練機器學習模型前,我們應當先看一些實例以及每個類別中投訴的數量:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖1

針對這個項目而言,我們僅需要2欄:「產品」和「消費者投訴陳述」。

  • 輸入: Consumer_complaint_narrative

實例:「在我的信用報告上有過時的信息,我之前對該信用報告有爭議,該項信息記錄應該被刪除,該信息是7年多之前的並且不符合信用報告的要求。」

  • 輸出:產品

實例:信用報告

我們將在消費者投訴陳述欄刪除無賦值的,並且增加一欄編譯該產品作爲一個整數值,因爲通常分類屬性變量用整數比用字符串代表要好。

我們也創建了幾個字典以備將來使用。

清理後,這是我們要使用的最初的5行數據:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

 圖2

不平衡的分類

我們看到每個產品的投訴數值不平衡。消費者的投訴多針對索回債款、信用報告和房屋抵押貸款。

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖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", ...)用以減少噪音特徵的數量。

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

(4569, 12633)

現在,每 4569 個消費者投訴陳述由12633個特徵表示,代表不同的一元和二元語法的 tf-idf 分數。

我們可以使用 sklearn.feature_selection.chi2 來尋找和每個產品最相關的術語:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

# ‘銀行賬戶或服務’:
 . 最相關的一元語法:
 . 銀行
 . 透支
 . 最相關的二元語法:
 . 透支費用
 . 支票賬戶
# ‘消費者貸款’:
 . :最相關的一元語法:
 . 小轎車
 . 車輛
 . 最相關的二元語法:
 . 車輛 xxxx
 . 豐田汽車金融
# ‘信用卡’:
 . 最相關的一元語法:
 . 花旗銀行
 . 卡
 . 最相關的二元語法:
 . 年費
 . 信用卡
# ‘信用報告’:
 . 最相關的一元語法:
 . 益百利
 . 艾奎法克斯
 . 最相關的二元語法:
 . 反式聯盟
 . 信用報告
# ‘索回債款’:
 . 最相關的一元語法:
 . 收集
 . 債務
 . 最相關的二元語法:
 . 索回債款
 . 索回機構
# ‘轉賬’:
 . 最相關的一元語法:
 . 西聯
 . paypal貝寶
 . 最相關的二元語法:
 . 西聯
 . 轉賬
# ‘住房抵押貸款’:
 . 最相關的一元語法:
 . 修改
 . 住房抵押貸款
 . 最相關的二元語法:
 . 抵押貸款公司
 . 貸款修改
# ‘其它金融服務’:
 . 最相關的一元語法:
 . 口腔
 . 護照
 . 最相關的二元語法:
 . 幫助支付
 . 規定支付
# ‘發薪日貸款’:
 . 最相關的一元語法:
 . 借錢
 . 發薪日
 . 最相關的二元語法:
 . 主要部分
 . 發薪日貸款
# ‘預付卡’:
 . 最相關的一元語法:
 . 服務
 . 預付
 . 最相關的二元語法:
 . 獲得的錢
 . 預付卡
# ‘學生貸款’:
 . 最相關的一元語法:
 . 學生
 . navient
 . 最相關的二元語法:
 . 學生貸款
 . 學生貸款
# ‘虛擬貨幣’:
 . 最相關的一元語法:
 . 處理
 . https
 . 最相關的二元語法:
 . xxxx 提供商
 . 金錢需要

這些都很講得通,對麼?


多級類別分類器:特徵和設計

  • 爲了訓練有監督的分類器,我們首先將「消費者投訴陳述」轉化爲數字向量。我們開發了類似 TF-IDF 權值向量的向量表示。

  • 在得到文本的向量表示後,我們可以訓練有監督的分類器來訓練看不見的「消費者投訴陳述」和預測「產品」將落在哪個分類。

上述所有這些數據轉化後,現在我們有了所有的特徵和標籤,是時候來訓練分類器了。針對這種類型的問題,許多算法可供我們使用。

  • 樸素貝葉斯分類器:最適合的詞彙計算的是多項式變量:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

在配置好訓練設置後,我們來做一些預測。

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

[‘債務索回’]

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖4

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

[‘信用報告’]

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖5

還不算太糟!


模型選擇

我們現在可以用不同的機器學習模型來做測試了,評估他們的準確度和尋找任一潛在問題的源頭。

我們將用下列四種模型來做測試:

  • 邏輯迴歸

  • (多項)  樸素貝葉斯

  • 線性支持向量機

  • 隨機森林

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖6

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

model_name
LinearSVC: 0.822890
LogisticRegression: 0.792927
MultinomialNB: 0.688519
RandomForestClassifier: 0.443826
Name: accuracy, dtype: float64

線性支持向量機和邏輯迴歸比其他兩種分類器表現更好,線性支持向量機有一個小優勢,它具備 82% 左右的準確率。


模型評估

繼續我們最好的模型(線性支持向量機),我們看下混淆矩陣,展示下預測的和實際的標籤之間的差異。

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖7

大多數的預測最終呈現的是對角線(預測的標籤 = 實際的標籤),正是我們想要的。然而,還是有許多的誤分類,看看他們是由什麼引起的也許蠻有意思的:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖8

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖9

你可以看到,一些誤分類的投訴是一些跟不止一個主題相關的投訴(比如,包括信用卡和信用報告的投訴)。這種錯誤將一直髮生。

然後我們使用 chi-squared test 來尋找與每個目錄最相關的術語:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

# ‘銀行賬號和服務’:

 . 最高一元語法:

 . 銀行

 . 賬戶

 . 最高二元語義:

 . 借記卡

 . 透支費用

# ‘消費貸’:

 . 最高一元語義:

 . 車輛

 . 小型汽車

 . 最高二元語義:

 . 個人貸款

 . 歷史xxxx

# ‘信用卡’:

 . 最高一元語義:

 . 卡

 . 發現

 . 最高二元語義:

 . 信用卡

 . 發現卡

# ‘信用’:

 . 最高一元語義:

 . 艾奎法克斯

 . 反式聯盟

 . 最高二元語義:

 . xxxx 賬戶

 . 反式聯盟

# ‘索回債務’:

 . 最高一元語義:

 . 債務

 . 收集

 . 最高二元語義:

 . 信用賬戶

 . 時間期限

# ‘轉賬’:

 . 最高一元語義:

 . paypal貝寶

 . 轉

 . 最高二元語義:

 . 轉賬

 . 發送錢

# ‘住房抵押貸款’:

 . 最高一元語義:

 . 住房抵押貸款

 . 第三方託管

 . 最高二元語義:

 . 貸款修改

 . 住房抵押貸款公司

# ‘其它金融服務’:

 . 最高一元語義:

 . 護照

 . 口腔

 . 最高二元語義:

 . 規定支付

 . 幫助支付

# ‘發薪日貸款’:

 . 最高一元語義:

 . 發薪日

 . 貸款

 . 最高二元語義:

 . 發薪日貸款

 . 發薪日

# ‘預付卡’:

 . 最高一元語義:

 . 預付

 . 服務

 . 最高二元語義:

 . 預付卡

 . 使用卡

# ‘學生貸款’:

 . 最高一元語義:

 . navient貸款公司

 . 貸款

 . 最高二元語義:

 . 學生貸款

 . 薩利美-學生貸款市場協會

# ‘虛擬貨幣’:

 . 最高以一元語義:

 . https

 . tx

 . 最高二元語義:

 . 金錢需求

 . xxxx 提供者

這些跟我們的預期一致。

最後,我們給每個類別打印分類報告:

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

文本分類又來了,用 Scikit-Learn 解決多類文本分類問題

圖9

源代碼可以在 Github 上找到,期待大家的反饋和提問。 


原文鏈接:https://towardsdatascience.com/multi-class-text-classification-with-scikit-learn-12f1e60e0a9


文章來源:雷鋒網