[第 11 屆 iT 邦幫忙鐵人賽] Day 27:第三招 資料面改善

Chao-Hsuan Ke
小小實驗室
Published in
7 min readSep 25, 2019

上一篇想辦法去改善分類演算法但似乎改善幅度不高,正所謂山不轉路轉,如果分類器改善不了,那何不來改善一下資料面的問題呢?

針對資料的部分我們會用以下三種方式重新處理一下資料集,其中用兩個不同的方式重新把文字轉向量,最後是加入正規化的部分。方法依序是:

  1. TF-IDF
  2. word2vec model
  3. data normalization

以下會針對這三個方式一一講解,之後再把重新編碼後的數值再進行一次分類計算,以便比較是否不同的編碼方式可以改善分類演算法?

為了公平起見,依然還是採用原先標記好的資料再來進行文字轉字詞

https://github.com/deternan/PTT_Stock/blob/master/source/tagging.txt

TF-IDF

有關 TF-IDF 的簡介可以直接連到 Wiki 的介紹,這邊就不多說了。

主要公式如下,而原本公式上 documents 的數量就是原始資料 instances 的數量。

把文章轉成 TF-IDF 向量的程式碼可以從這逼邊下載:

https://github.com/deternan/PTT_Stock/tree/master/src/main/java/ptt/tf/idf

所以的變數存放在 Parameter 類別裡,如果要自行轉檔的話記得要換成自己的路徑。然後執行 TfIdfMain.java 類別即可。

轉換後的向量檔也可以從這邊下載:

https://github.com/deternan/PTT_Stock/blob/master/source/tagging_tfidf.arff

我們同樣測試之前提到的三個分類演算法,用此資料集來進行分類計算,得到的結果分別是:

  • 支持向量機 (Support Vector Machine, SVM):68.35 %
  • 貝氏分類器 (Naïve-Bayes):62.963 %
  • 隨機森林(Random Forest):63.2997 %
Naïve-Bayes classification accuracy
Random Forest classification accuracy
SVM classification accuracy

誒 … 結果好像有變好耶 !! 😆

不錯 不錯 ~

word2vec model

我們原本將文字轉向量值是使用 fasttext 進行 (model也是)。這邊想嘗試看看如果使用 Google 的 word2vec 進行轉換,然後再來進行分類計算,看看結果是否可以改善?

利用 word2vec 轉向量值的 code 也幫大家準備好了,可以直接從下方網址,不過自己要記得改 model 位置就是了。

https://github.com/deternan/PTT_Stock/blob/master/src/main/java/ptt/arff/TaggingData_to_Arff_Word2Vec.java

轉換後的向量檔也可以從這邊下載,下載後也可以直接在 Weka 上執行。

https://github.com/deternan/PTT_Stock/blob/master/source/tagging_word2vec_txt.arff

一樣用 Weka 跑三個分類演算法,得到的結果分別是:

  • 支持向量機 (Support Vector Machine, SVM): 50.1684 %
  • 貝氏分類器 (Naïve-Bayes): 51.515 %
  • 隨機森林(Random Forest): 53.1987 %
Naïve-Bayes classification accuracy
Random Forest classification accuracy
SVM classification accuracy

結論:好像沒有比較好,怎麼反而好像更低了 😓

Normalization

為了讓資料的標準差不至於過大,通常在進分類等數學計算時資料都會先進行前處理的動作,最常見的就是 data normalization (資料正規化)了。資料正規化是將資料個數值的大小經過一些計算(例如:Standard Score)來將資料數值限縮在一定範圍內,通常範圍會定在 0 至 1 或是 -1 至 1 之間。

在 Weka 也可以先針對資料進行正規化,讀入檔案後進行分類計算前,只要在 Filter 中依照 “weka” → “filters” → “unsupervised” → “attribute” 選擇 『Normalization』

然後會看到指令列上出現了 將數值限縮在 0 至 1 的範圍

之後再執行各分類(或其他)計算時,原本讀入的資料都會被先正規劃後才載入各演算法內。

同樣的,我們也是用三個演算法來跑一下正規劃後的資料,而資料 model 是採取 fasttext 轉換後的數值。得到的結果依序如下

一樣用 Weka 跑三個分類演算法,得到的結果分別是:

  • 支持向量機 (Support Vector Machine, SVM):56.229 %
  • 貝氏分類器 (Naïve-Bayes):50.8418 %
  • 隨機森林(Random Forest):52.1886 %
Naïve-Bayes classification accuracy (data normalization)
Random Forest classification accuracy (data normalization)
SVM classification accuracy (data normalization)

依序跑完了三個我們假設可能的改善方式,這裡一下這三個方式各自又使用分類演算法得到的結果如下表:

從數據看起來用了 TF-IDF 的編碼方式反而得到了最好的分類結果,或許這也算是給了我們一條未來如何改善的一個明燈吧。

免責聲明:本文章提到的股市指數與說明皆為他人撰寫文章內容,包括:選股條件,買入條件,賣出條件和風險控制參數,只適用於文章內的解釋與說明,此提示及建議內容僅供參考之用,並不構成投資研究、認購、招攬或邀約任何人士投資任何投資產品或交易策略,亦不應視為投資建議。

Previous

Next

--

--

Chao-Hsuan Ke
小小實驗室

永遠熱愛自己的工作,總是找一堆事把自己的時間塞滿。喜歡接觸不同領域,像是 歷史、文化、金融和公共政策 等議題,期許著自己會什麼就分享什麼。