1. 程式人生 > >文字分類實驗(多分類)

文字分類實驗(多分類)

引言

最近進行了一個文字分類的實驗,這是一個將之前學習的一些機器學習方法學以致用的機會,特此記錄。

問題描述

原始資料沒有固定格式,主要內容是customer和agent的對話記錄,每個對話記錄可能會有3個標籤,分別對應一級分類(5類)、二級分類(80類)和三級分類,每一級分類都是記錄中客戶反映問題所屬的類別。但是資料不完整,可能有的資料只有一級分類、有的資料只有一級和二級分類。
目的:訓練一個分類器,能準確預測對話記錄對應的問題的分類

資料集

樣本示例如下:
樣本1:

Agent: #SSS/Pro/Windows setup issue/Windows now setting up./Close Solution: ELS CAPTURE N/A
- SA TOADE EMAILCAP HC:OK NOI -
Issue:
Can’t connect her wireless mouse and keyboard
Dell KM636
She’s missing her USB Receiver for the mouse and keyboard
…………(此處省略)
Resolution:
We are dispatching parts only to replace the keyboard, mouse and receiver.
- VDI TARP TAT -
Notes: Her KM636 kits are both missing their Logitech USB Receivers.
We are dispatching parts only to replace the Wireless mouse and keyboard kits.

樣本1對應標籤:Peripherals(一級分類)、Mouse(二級分類)、無三級分類。

樣本2:

Agent: Fan issue Solution: 진단 가능여부
- 가능
사용한 진단도구 및 결과
…………(此處省略)
- BIOS 진입되지 않고 자동 리부팅 됨
- BIOS Recovery Fail
- 불량 증상 관련 엔지니어 현장 방문 점검 안내
필요부품
- FAN Notes: - 노트북 전원 켤시 자동 진단테스트 진입 FAN 에러 이후 재부팅 반복됨

樣本2對應標籤:System(一級分類)、PowerSupply(二級分類、 Fan Issue(三級分類)

原始資料共有9000+,但是不是所有資料都能用於模型的訓練的,因為部分資料為非英文,並且有部分標籤是缺失的,可能只能用來訓練一級分類器。

資料預處理

由於樣本中各種語言魚龍混雜(日文、韓文等等),本次實驗定位在只對英文樣本進行處理。並且由於樣本不是結構化的,資料預處理的好壞可能會直接影響到分類器的效能

在實際操作中,我進行了兩步操作。
第一步:去除原始文字中的所有標點符號和數字

specialsymbols = "[\s+\.\!\/_,$%^*(+\"\'" + string.punctuation + "]+|[+——!,。?<>《》:;、[email protected]
#¥%……&*()]+"
mathsysmbols = '\d+(\.\d+)*([×\+\-\*\/]\d+(\.\d+)*)*[0-9A-Za-z]*' # 將所有中英文符號替換成空格 def replaceAllSymbols(oldStr): # 去掉數字 oldStr = re.sub(mathsysmbols.decode("utf-8"), " ".decode("utf-8"), oldStr) # 再去掉符號 return re.sub(specialsymbols.decode("utf-8"), " ".decode("utf-8"), oldStr)

第二步:檢測上一步處理好文字中是否含有非英文。

def checkOnlyContainEnglish(check_str):
    if check_str.strip() == '':
        return False
    #將原始資料編碼回UTF-8,才能檢測中文,坑點。
    for ch in check_str.encode('utf-8'):                
        if ch.isalpha() or ch.isdigit() or ch == ' ':
            continue
        else:
            return False
    return True

經過上述兩步處理後,樣本中將不含有非英文。

最終,原始資料儲存在一個list中,list中每一項的形式如下:

[文字,標籤1,標籤2,標籤3] #標籤可能為‘’

實驗方法

  1. 基於SVM的分類方法
    直接使用sklearn包進行了SVM模型的訓練。
  2. 基於Naive Bayes的分類方法
    直接使用sklearn包進行貝葉斯模型訓練。
  3. 基於LSTM迴圈神經網路的分類方法
    使用pytorch搭建了一個簡單的LSTM迴圈神經網路,用LSTM最後一個隱藏狀態進行了後續分類。在網路訓練過程中,使用了early stop機制,如果連續n次在驗證集上的準確率低於歷史最好值,就提前結束訓練在測試集上驗證效能。

資料劃分

進過預處理後,大約還有5890個樣本。
在不同實驗中,資料集的劃分如下表所示:

實驗編號 訓練集 驗證集 測試集
1 80% - 20%
2 80% - 20%
3 60% 20% 20%

實驗結果

一級分類和二級分類分別訓練了分類器,實驗結果如下:

準確率 SVM Bayes LSTM 1based-svm 1based-svm(2)
一級分類準確率(%) 75.97 68.33 66.46 - -
二級分類準確率(%) 65.33 37.84 49.48 60.46 66.11

1based-svm的預測方式:
一級分類有A、B兩類,用一級分類器得到的概率分佈P1為0.3,0.7
二級分類有a1,a2,b1,b2四類,用二級分類器得到的概率分佈P2為0.1, 0.2, 0.3, 0.4
那麼1based-svm最終預測的概率分佈為0.1*0.3, 0.2*0.3, 0.3*0.7, 0.4*0.7
一級分類對二級分類的指導方式還有待改進。

1based-svm(2)的預測方式:
一級分類有A、B兩類,用一級分類器得到的概率分佈P1為0.3,0.7
二級分類有a1,a2,b1,b2四類,用二級分類器得到的概率分佈P2為0.1, 0.2, 0.3, 0.4
那麼1based-svm最終預測的概率分佈為0.1*(1+0.3), 0.2*(1+0.3), 0.3*(1+0.7), 0.4*(1+0.7)。該方式與前一種方式相比弱化了一級分類對二級分類概率分佈的影響,得到的效果較單獨訓練的SVM略有上升。

注:一級分類和二級分類彼此獨立,即進行二級分類時沒有引入上一級分類資訊。

實驗中的一些問題

  1. 在資料預處理時,只將資料處理成了[文字,一級標籤,二級標籤,三級標籤]的形式,沒有建立整理好的資料與原始資料之間的索引,導致在最終輸出測試集預測結果到excel時編碼難度上升,應該在資料預處理時將資料預處理成[原始資料編號,文字,一級標籤,二級標籤,三級標籤]的形式;
  2. 在資料預處理時,原本是要將資料中非英文的項刪除,但是在處理時首先將utf-8編碼的文字改用Unicode編碼,然後進行了非英文檢測,結果處理好的資料中仍然有非英文。仔細研究後發現,在.decode(‘utf8’)後應該在檢測非英文時.encoed(‘utf8’),否則無法檢測出非英文;

實驗程式碼

一些疑問

  1. 從實驗結果中可以看到,當分類器預測二級分類時,SVM分類器的效能只下降了10%,而樸素貝葉斯分類器的效能下降了50%,為什麼會產生如此大的區別。
  2. 在1based-svm模型中,我嘗試使用一級分類器的結果來修正二級分類器的輸出的概率分佈,但是可能是調整的幅度過大了p2’=p2*p1,最終模型的準確率反而下降了。
  3. 在1based-svm(2)中,我修改了概率分佈調整策略,p2’=p2*(1+p1),這樣的策略下,概率分佈的調整幅度較2中要小,實驗結果表明,這種策略和單獨訓練一個二級SVM分類器的效果是差不多的,所以說這樣的策略也不是很成功。
  4. 上述兩種策略都不是很奏效,如果合理的使用一級概率分佈來指導二級概率分佈,需要思考。

最後

才疏學淺,歡迎討論。
2017.11.9 上海

相關推薦

文字分類實驗分類

引言 最近進行了一個文字分類的實驗,這是一個將之前學習的一些機器學習方法學以致用的機會,特此記錄。 問題描述 原始資料沒有固定格式,主要內容是customer和agent的對話記錄,每個對話記錄可能會有3個標籤,分別對應一級分類(5類)、二級分類(80

重新實現關於Mikolov的整合文字分類實驗詳細過程-

前言:為了實現文字分類,將一個文字內容確定的分為積極或者消極,我們採用了Mikolov的文字分類方法,通過他在試驗中的方法實現文字的二值分類。本文旨在如何重現他論文中實現的分類實驗。論文參看Mikolov的ENSEMBLE OF GENERATIVE AND DISCRIM

【火爐煉AI】深度學習009-用Keras遷移學習提升性能分類問題

tro ray size array 全連接 步驟 loss pytho numpy 【火爐煉AI】深度學習009-用Keras遷移學習提升性能(多分類問題) (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn

【火爐煉AI】深度學習010-Keras微調提升效能分類問題

【火爐煉AI】深度學習010-Keras微調提升效能(多分類問題) (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 前面的文章(【火爐

Python機器學習庫sklearn裡利用感知機進行三分類分類的原理

from IPython.display import Image %matplotlib inline # Added version check for recent scikit-learn 0.18 checks from distutils.vers

機器學習基礎五十三—— 精確率與召回率分類問題精確率和召回率的計算

精確率(precision),召回率(recall)由混淆矩陣(confusion matrix)計算得來。 在資訊檢索中,精確率通常用於評價結果的質量,而召回率用來評價結果的完整性。 實際上,精確度(precision)是二元分類問題中一個常用的指

Leetcode 075 顏色分類 Python C++ 史上最詳細題解系列解法

每天更新一道python or C++ leetcode題,力求講解清晰準確,客官們可以點贊或者關注。 題目: 給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 此題中,我們使用整數

線性判別分析(LDA)和python實現分類問題

上一篇寫過線性判別分析處理二分類問題https://blog.csdn.net/z962013489/article/details/79871789,當使用LDA處理多分類問題時,通常是作為一個降維工具來使用的。若我們有一個D維的樣本集,該樣本集包含C個類別共

matlab二分類實驗使用libsvm工具包+SVMcgForClass函式

這幾天在做資料探勘實驗,實驗要求在 Matlab 環境下,利用 libsvm 工具包設計一個 SVM 兩類分類器。在給定的資料集上進行 2-折交叉驗證,另外可以使用SVMcgForClass函式尋找最優的c和g引數。 我在做實驗的過程中參考了以下網址的解釋,這

Python機器學習庫sklearn裡利用LR模型進行三分類分類的原理

首先,LR將線性模型利用sigmoid函式進一步做了非線性對映。 將分類超平面兩側的正負樣本點,通過壓縮函式轉化成了以0.5為分解的兩類:類別0和類別1。 這個轉化過程見下圖: 上圖給出的是線性邊界與LR分佈函式(即sigmoid函式)的對映對應關係;同樣,對於非線

matlab 下交叉驗證與 svm 分類模型的使用

筆記下面是程式碼,註釋一般都能看懂的。%datas為讀入的資料集 labels為讀入的標籤 %規範化資料 [datas_normal] = premnmx(datas) ; %交叉驗證 k =10

人臉識別的LOSS分類Softamx

超多分類的Softmax 早期深度人臉識別方法,框架為CNN + Softmax,以“超多分類”這樣一種比較難的任務訓練CNN,強迫網路在第一個FC層形成比較緊湊的,判別力很強的深度人臉特徵,之後用於人臉識別。 Softmax優缺點 Softmax是soft(軟

《機器學習》 周志華學習筆記第七章 貝葉斯分類課後習題python 實現

課後習題答案 1.試用極大似然法估算西瓜集3.0中前3個屬性的類條件概率。 好瓜有8個,壞瓜有9個 屬性色澤,根蒂,敲聲,因為是離散屬性,根據公式(7.17) P(色澤=青綠|好瓜=是) = 3/8 P(色澤=烏黑|好瓜=是) = 4/8 P(色澤=淺白|好瓜=是) =

python資料分析:分類分析classification analysis

何為分類分析 在機器學習和統計中,分類是基於包含其類別成員資格已知的觀察(或例項)的訓練資料集來識別新觀察所屬的一組類別(子群體)中的哪一個的問題。例如,將給定的電子郵件分配給“垃圾郵件”或“非垃圾郵件”類,並根據觀察到的患者特徵(性別,血壓,某些症狀的存在或不存在等)為給定患者分配

發現的一些github優秀分類集合待完善

首先是Github祕籍,如果在github上只會幹star,download啥的,太low了,這麼好的社群,雖然當個小粉絲膜拜眾多大神也不是不行,但是自己去做點東西,應該更有意義吧,話說現在很多公司招聘也更願意招到在Github上有分享精神的大神呢,所以閒暇之餘,嗑包瓜子學習下怎麼玩這個社群也不錯哦

Java 實驗案例

實驗任務 任務一:圖形面積周長計算小程式 任務二:飼養員餵養動物程式 實驗內容: 任務一: 圖形面積周長計算 任務目的: 掌握多型的含義及應用場合 掌握上轉型物件和多型的實現 掌握abstract關鍵字

SVM人臉識別分類案例機器學習

運用sklearn自帶的資料集做一個分類任務from sklearn.datasets import fetch_lfw_people faces = fetch_lfw_people(min_faces_per_person=60) fig, ax = plt.subplo

機器學習之線性分類Linear Classifiers——腫瘤預測例項

線性分類器:一種假設特徵與分類結果存線上性關係的模型。該模型通過累加計算每個維度的特徵與各自權重的乘積來幫助決策。 # 匯入pandas與numpy工具包。 import pandas as pd import numpy as np # 建立特徵列表。 column_n

Tensorflow學習筆記--使用遷移學習做自己的影象分類Inception v3

本文主要使用inception v3的模型,再後面接一個softmax,做一個分類器。具體程式碼都是參照tf github。 整體步驟: 步驟一:資料準備,準備自己要分類的圖片訓練樣本。 步驟二:retrain.py 程式,用於下載inception v3模型及訓練後面的

樸素貝葉斯分類Python實現

基本思想: 樸素貝葉斯分類器,在當給出了特徵向量w情況下,分類為ci的條件概率p(ci | w)。 利用貝葉斯公式:p(ci | w) = p(w | ci) * p(ci) / p(w),可以完成轉化,觀察公式可以發現分母p(w)都一樣,所以只要比較分子的