1
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標題 Multi-Class Text Classification with Scikit-Learn,作者為 Susan Li 。
翻譯 | 朱茵 整理 | 余杭 MY
在商業(yè)領(lǐng)域有很多文本分類的應(yīng)用,比如新聞故事通常由主題來分類;內(nèi)容或產(chǎn)品常常被打上標簽;基于如何在線談?wù)摦a(chǎn)品或品牌,用戶被分成支持者等等。
然而大部分的文本分類文章和網(wǎng)上教程是二進制的文本分類,像垃圾郵件過濾(spam vs. ham)、情感分析(積極的和消極的)。在大量實例中,我們現(xiàn)實世界的問題要比這些復(fù)雜的多。因此,這是我們今天要做的:將消費者的財務(wù)投訴分成12個預(yù)定義的類。這些數(shù)據(jù)可以從 data.gov 下載。
我們使用 Python 和 Jupyter Notebook 來開發(fā)我們的系統(tǒng),依靠 Scikit-Learn 作為機器學(xué)習的部件。如果你想看下在 PySpark 中的實現(xiàn),請閱讀下一篇文章。
問題形成
我們的問題是有監(jiān)督的文本分類問題,目標是調(diào)查哪一種有監(jiān)督的機器學(xué)習方法最適于解決該問題。
鑒于新的投訴的到來,我們想將它歸到12個分類目錄中。分類器使得每個新投訴被歸類到一個僅且一個類別中。這是一個多類文本分類問題。我已經(jīng)迫不及待地想看下我們完成的結(jié)果。
數(shù)據(jù)瀏覽
在投入訓(xùn)練機器學(xué)習模型前,我們應(yīng)當先看一些實例以及每個類別中投訴的數(shù)量:
圖1
針對這個項目而言,我們僅需要2欄:“產(chǎn)品”和“消費者投訴陳述”。
輸入: Consumer_complaint_narrative
實例:“在我的信用報告上有過時的信息,我之前對該信用報告有爭議,該項信息記錄應(yīng)該被刪除,該信息是7年多之前的并且不符合信用報告的要求?!?/p>
輸出:產(chǎn)品
實例:信用報告
我們將在消費者投訴陳述欄刪除無賦值的,并且增加一欄編譯該產(chǎn)品作為一個整數(shù)值,因為通常分類屬性變量用整數(shù)比用字符串代表要好。
我們也創(chuàng)建了幾個字典以備將來使用。
清理后,這是我們要使用的最初的5行數(shù)據(jù):
圖2
不平衡的分類
我們看到每個產(chǎn)品的投訴數(shù)值不平衡。消費者的投訴多針對索回債款、信用報告和房屋抵押貸款。
圖3
當我們遇到問題時,我們會用標準算法解決這些問題。傳統(tǒng)的算法常常傾向于大多數(shù)的分類,并不會將數(shù)據(jù)分布考慮進去。最糟的情況,少數(shù)的分類被當做異常值被忽略了。在一些例子中,像欺詐偵測和癌癥預(yù)測,我們將仔細設(shè)置我們的模型或人工平衡數(shù)據(jù)集,比如通過欠采樣和過采樣每個類。
然而,在我們的學(xué)習不均衡的數(shù)據(jù)的例子中,我們會將興趣點放在占少數(shù)的的分類上。在大多數(shù)分類上具有高準確率的分類器是令人滿意的。然而針對占少數(shù)的分類也應(yīng)當保持合理的準確度。就這樣吧。
文本表達
分類器和學(xué)習算法不能以他們原來的形式直接處理文本文件,他們大多數(shù)需要有固定大小的數(shù)字特征向量而不是帶有變量長度的原來的文本文件。因此,在預(yù)處理的階段文本將被轉(zhuǎn)成更好處理的表達方式。
一個從文本中提取特征的常用方法是使用詞匯模型袋:一種給每個文件,在我們的例子中的投訴陳述,詞匯的呈現(xiàn)(通常是頻率)將被考慮進去,但這些詞匯出現(xiàn)的順序是被忽略的。
尤其是我們數(shù)據(jù)集的每個術(shù)語,我們將計算一種被稱為術(shù)語頻率的測量方法。逆文檔頻率,縮寫成tf-idf。我們將使用 sklearn.feature_extraction.text.TfidfVectorizer 給每個消費者投訴陳述計算一個 tf-idf 向量:
sublinear_df 設(shè)置為True 給頻率使用一種算法形式。
min_df 是文檔的最小數(shù)值is the minimum numbers of documents a word must be present in to be kept.
norm 設(shè)置為l2,來確保我們的特征向量具有歐幾里得標準1.
ngram_range 設(shè)置為) (1,2)來表明我們同時考慮一元語法和二元語法。
stop_words 設(shè)置為"english" 來移除所有相同的代詞("a", "the", ...)用以減少噪音特征的數(shù)量。
(4569, 12633)
現(xiàn)在,每 4569 個消費者投訴陳述由12633個特征表示,代表不同的一元和二元語法的 tf-idf 分數(shù)。
我們可以使用 sklearn.feature_selection.chi2 來尋找和每個產(chǎn)品最相關(guān)的術(shù)語:
# ‘銀行賬戶或服務(wù)’:
. 最相關(guān)的一元語法:
. 銀行
. 透支
. 最相關(guān)的二元語法:
. 透支費用
. 支票賬戶
# ‘消費者貸款’:
. :最相關(guān)的一元語法:
. 小轎車
. 車輛
. 最相關(guān)的二元語法:
. 車輛 xxxx
. 豐田汽車金融
# ‘信用卡’:
. 最相關(guān)的一元語法:
. 花旗銀行
. 卡
. 最相關(guān)的二元語法:
. 年費
. 信用卡
# ‘信用報告’:
. 最相關(guān)的一元語法:
. 益百利
. 艾奎法克斯
. 最相關(guān)的二元語法:
. 反式聯(lián)盟
. 信用報告
# ‘索回債款’:
. 最相關(guān)的一元語法:
. 收集
. 債務(wù)
. 最相關(guān)的二元語法:
. 索回債款
. 索回機構(gòu)
# ‘轉(zhuǎn)賬’:
. 最相關(guān)的一元語法:
. 西聯(lián)
. paypal貝寶
. 最相關(guān)的二元語法:
. 西聯(lián)
. 轉(zhuǎn)賬
# ‘住房抵押貸款’:
. 最相關(guān)的一元語法:
. 修改
. 住房抵押貸款
. 最相關(guān)的二元語法:
. 抵押貸款公司
. 貸款修改
# ‘其它金融服務(wù)’:
. 最相關(guān)的一元語法:
. 口腔
. 護照
. 最相關(guān)的二元語法:
. 幫助支付
. 規(guī)定支付
# ‘發(fā)薪日貸款’:
. 最相關(guān)的一元語法:
. 借錢
. 發(fā)薪日
. 最相關(guān)的二元語法:
. 主要部分
. 發(fā)薪日貸款
# ‘預(yù)付卡’:
. 最相關(guān)的一元語法:
. 服務(wù)
. 預(yù)付
. 最相關(guān)的二元語法:
. 獲得的錢
. 預(yù)付卡
# ‘學(xué)生貸款’:
. 最相關(guān)的一元語法:
. 學(xué)生
. navient
. 最相關(guān)的二元語法:
. 學(xué)生貸款
. 學(xué)生貸款
# ‘虛擬貨幣’:
. 最相關(guān)的一元語法:
. 處理
. https
. 最相關(guān)的二元語法:
. xxxx 提供商
. 金錢需要
這些都很講得通,對么?
多級類別分類器:特征和設(shè)計
為了訓(xùn)練有監(jiān)督的分類器,我們首先將“消費者投訴陳述”轉(zhuǎn)化為數(shù)字向量。我們開發(fā)了類似 TF-IDF 權(quán)值向量的向量表示。
在得到文本的向量表示后,我們可以訓(xùn)練有監(jiān)督的分類器來訓(xùn)練看不見的“消費者投訴陳述”和預(yù)測“產(chǎn)品”將落在哪個分類。
上述所有這些數(shù)據(jù)轉(zhuǎn)化后,現(xiàn)在我們有了所有的特征和標簽,是時候來訓(xùn)練分類器了。針對這種類型的問題,許多算法可供我們使用。
樸素貝葉斯分類器:最適合的詞匯計算的是多項式變量:
在配置好訓(xùn)練設(shè)置后,我們來做一些預(yù)測。
[‘債務(wù)索回’]
圖4
[‘信用報告’]
圖5
還不算太糟!
模型選擇
我們現(xiàn)在可以用不同的機器學(xué)習模型來做測試了,評估他們的準確度和尋找任一潛在問題的源頭。
我們將用下列四種模型來做測試:
邏輯回歸
(多項) 樸素貝葉斯
線性支持向量機
隨機森林
圖6
model_name
LinearSVC: 0.822890
LogisticRegression: 0.792927
MultinomialNB: 0.688519
RandomForestClassifier: 0.443826
Name: accuracy, dtype: float64
線性支持向量機和邏輯回歸比其他兩種分類器表現(xiàn)更好,線性支持向量機有一個小優(yōu)勢,它具備 82% 左右的準確率。
模型評估
繼續(xù)我們最好的模型(線性支持向量機),我們看下混淆矩陣,展示下預(yù)測的和實際的標簽之間的差異。
圖7
大多數(shù)的預(yù)測最終呈現(xiàn)的是對角線(預(yù)測的標簽 = 實際的標簽),正是我們想要的。然而,還是有許多的誤分類,看看他們是由什么引起的也許蠻有意思的:
圖8
圖9
你可以看到,一些誤分類的投訴是一些跟不止一個主題相關(guān)的投訴(比如,包括信用卡和信用報告的投訴)。這種錯誤將一直發(fā)生。
然后我們使用 chi-squared test 來尋找與每個目錄最相關(guān)的術(shù)語:
# ‘銀行賬號和服務(wù)’:
. 最高一元語法:
. 銀行
. 賬戶
. 最高二元語義:
. 借記卡
. 透支費用
# ‘消費貸’:
. 最高一元語義:
. 車輛
. 小型汽車
. 最高二元語義:
. 個人貸款
. 歷史xxxx
# ‘信用卡’:
. 最高一元語義:
. 卡
. 發(fā)現(xiàn)
. 最高二元語義:
. 信用卡
. 發(fā)現(xiàn)卡
# ‘信用’:
. 最高一元語義:
. 艾奎法克斯
. 反式聯(lián)盟
. 最高二元語義:
. xxxx 賬戶
. 反式聯(lián)盟
# ‘索回債務(wù)’:
. 最高一元語義:
. 債務(wù)
. 收集
. 最高二元語義:
. 信用賬戶
. 時間期限
# ‘轉(zhuǎn)賬’:
. 最高一元語義:
. paypal貝寶
. 轉(zhuǎn)
. 最高二元語義:
. 轉(zhuǎn)賬
. 發(fā)送錢
# ‘住房抵押貸款’:
. 最高一元語義:
. 住房抵押貸款
. 第三方托管
. 最高二元語義:
. 貸款修改
. 住房抵押貸款公司
# ‘其它金融服務(wù)’:
. 最高一元語義:
. 護照
. 口腔
. 最高二元語義:
. 規(guī)定支付
. 幫助支付
# ‘發(fā)薪日貸款’:
. 最高一元語義:
. 發(fā)薪日
. 貸款
. 最高二元語義:
. 發(fā)薪日貸款
. 發(fā)薪日
# ‘預(yù)付卡’:
. 最高一元語義:
. 預(yù)付
. 服務(wù)
. 最高二元語義:
. 預(yù)付卡
. 使用卡
# ‘學(xué)生貸款’:
. 最高一元語義:
. navient貸款公司
. 貸款
. 最高二元語義:
. 學(xué)生貸款
. 薩利美-學(xué)生貸款市場協(xié)會
# ‘虛擬貨幣’:
. 最高以一元語義:
. https
. tx
. 最高二元語義:
. 金錢需求
. xxxx 提供者
這些跟我們的預(yù)期一致。
最后,我們給每個類別打印分類報告:
圖9
源代碼可以在 Github 上找到,期待大家的反饋和提問。
原文鏈接:https://towardsdatascience.com/multi-class-text-classification-with-scikit-learn-12f1e60e0a9
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。