Simple text classification | LSTM | Keras

莉森羊
5 min readAug 15, 2018

--

好久沒碰Keras了,近期都在tensorflow的海裡激泳(其實是被浪打 🏄‍)。不過不得不說,從以前就挺喜歡Keras的~簡單好上手,很適合入門以及快速試驗!

“An open notebook on a wooden surface in front of a laptop” by Nick Morrison on Unsplash

看完本篇你將會學到:

✔️用python進行文本資料建模前處理:如標籤編碼、拆分數據集、文本切詞

✔️Multiclass Classification

✔️簡單的 LSTM模型構建、模型訓練與評估

But, 你將不會學到的是…

✖️ LSTM的原理

本篇程式碼參考自Maryada Krishna ReddyLSTM教學,有興趣的人請點超連結,謝謝他的分享!

有別於Maryada Krishna Reddy的教學文

本篇文章專為有Multiclass Classification任務需求的人客們而寫,分享在多元分類的場景下,如何用Keras跑LSTM文本模型。🎃🎃

一些版本…

  • Python 3.6.4 |Anaconda
  • Keras 2.1.5
  • Tensorflow 1.9.0

資料描述

  • log檔,109.2 MB
  • 類別:279類
  • 總資料數:84,020筆
原始資料示意圖

步驟

1. 輸入資料的處理 (input data processing)2. LSTM模型構建 (model building)3. 模型評估測試 (model evaluation)

Part I : 輸入資料的處理 (input data processing)

  • 先匯入所需的套件
  • 匯入處理過的資料(清理資料方面,例如url clean等就不在本文詳述) →挑選目標欄位作為分析使用
  1. 欄位 domain_2rd : 欲分析的內容,任務是判斷來自哪個user agent
  2. 欄位 user_agent_set: 作為訓練的標籤(Label)
前5筆的資料樣貌
  • 訓練集&測試集的拆分

sklearn 的 LabelEncoder 可以將標籤的編碼值範圍限定在[0 , n_classes-1],也可以用在非數值型標籤的編碼來轉換成數值標籤。(有沒有很好用~)

題外話,以往在做這種多類別標籤的時候,我都是用 one-hot encoding的方式,例如類別數是3時,就用 Keras 改造的 numpy 的一個函數 np_utils.to_categorical,把標籤變成 one-hot 的形式:

  • [1,0,0]
  • [0,1,0]
  • [0,0,1]

但這次在實作時,發現標籤可以不用one-hot encoding,而留在後面模型訓練時,調整一個參數值即可(這裡就先鋪個梗吧 👽)

  • Tokenizer切詞

將文字資料做切詞,並將文本轉換為序列

Part II : LSTM模型構建 (model building)

  • 構建 RNN 模型架構

想知道類別數量的話,有個方法是將前面的Y(編碼過後的label)排序後

類別數 = sorted(Y)[-1] + 1

  • 模型訓練

前面鋪的梗這邊就要揭曉啦~剛剛說過這次的標籤編碼不是採用one-hot encoding的形式,而是 integer encodings:

  • 1
  • 2
  • 3

❗️那在做compile時,loss就要指定sparse_categorical_crossentropy ,而不是過去常用的categorical_crossentropy

model summary

因為我這台沒GPU…QQ 所以給大家看一下CPU還是可以跑的,只是比較慢而已…

…真的只是“而已”嗎…我的筆電開始有飛機起飛的聲音啦… 🛫

神啊,給我一台TITAN啊(許願池)

話說昨天在整理GPU規格時有一點心得,有空再分享給大家

訓練過程

可以看到,跑了6個Epoch後就Early Stopping囉,訓練的準確率落在 93.7%,最後一部分就是要來進行模型評估了。

Part III: 模型評估測試 (model evaluation)

輸入測試集的資料進行模型測試,得到93.8%的準確率。

感謝瀏覽到這裡的你們,恭喜達成以下成就:

✔️ 使用pandas進行資料的匯入與欄位挑選

✔️拆分訓練集和測試集,並將標籤進行數值編碼

✔️用Tokenizer切詞

✔️簡單的 LSTM模型構建

✔️模型訓練與評估

如果您喜歡本文的話,歡迎多按幾下Claps 👏👏👏
有您的鼓勵,會增加我的產文效率! 🚀
也歡迎多留言給我,我們可以聊聊技術或人生

--

--

Responses (1)