我處理 Imbalanced Data 的心得 (上)

今天有朋友貼給我這篇文章
http://d4sg.org/accuracy-paradox-in-disaster-prevention/
(可以不用看,我下面會詳細解釋)

看完我感覺很糟,主要是因為,這短短一篇文章,作者很有自信的講出許多錯誤的觀點,還一副教人的樣子。而且這個網站還提供了無效的 SSL Certificate,讓人不開心(誤)。作者強不強我不知道也不評論,我的觀點有沒有問題我也不確定,但這篇文章有許多問題。讓我用簡單的,high-level 的方式解釋,順便分享我過去處理 imbalanced data 的心得。

接下來的文章,我會先解釋什麼是 imbalanced data,為什麼他很難處理。然後解釋原文的三大問題(看不懂沒關係,後面會解釋):

  1. 從 accuracy 的問題切入,卻沒有解釋取代 accuracy 的方案,莫名的跳到調整 data / model。
  2. 原文提出了五個處理 imbalanced data 的方法,其中的描述錯誤百出,且過度強調一些似是而非的觀點。
  3. 沒有提到現在最新最潮最流行的 Generative Adversarial Networks (GAN) 以及其他類似方法。開玩笑的,我要說的是,他不斷強調 sampling,卻只有提到複製和刪除 instance 那類最原始的方法,而沒有提到生成新 instance 的方法。

其中2,3兩點會在下篇再寫,因為我發現我今天會寫不完XD,接著會分享我過去解決 imbalance 問題的一點經驗和觀點。

什麼是 Imbalanced Data?

也有人說是 unbalanced data,但我其實不知道這兩個字差在哪。imbalance 問題存在於很多種類的問題,一般來說,就是指 data 在某些方面不平均,而不是指這個 data 很猛很 imba。其中,我最熟悉的,常遇到 imbalance 問題的問題是 binary / multiclass / multilabel classification,learning to rank,regression。根據我對原文的理解,他嘗試預測房屋會不會發生火災,我猜測它是在解 binary classification。

Binary classification 的意思就是,給定你某個 data instance (某個住戶) 的 feature (該房屋的地點,住戶資料及周遭的環境),要回答一個 positive (會發生火災) or negative (不會發生火災) 的問題。

為什麼這樣的 data 會 imbalanced? 因為火災很少發生啊,根據原文,該地區8萬多筆資料中,只有不到100筆真的有發生火災,positive:negative大約是 1:800。在我的經驗中,這非常 imbalanced。我們會稱 positive 這個 class 為 minority class,negative 為 majority class。

1:800 會遇到什麼問題? 就是當我的 model 預測所有 data 為”不會發生火災”的話,accuracy 高達 99.9%,因為 accuracy 的算法是答對的 data 數量除以總共有的 data 數量,當”不會發生火災”的住戶占大多數時,分子和分母會非常接近。這時候就會讓人覺得,好像預測非常準,實際上 model 什麼屁都沒學到。

Accuracy 居然沒用,怎麼辦?

這時原文提出解決方法,居然是改變 data / model,讓 model 真的有學到東西。等等,但就算你有學到東西,Accuracy 還是沒用啊,在這樣的情況下,你要怎麼選出最有效的 model 和 feature,要怎麼說服自己你做的東西是有用的? 答案是幾乎不可能。你可能會問,model 有可能會進步到 100% accuracy 啊,這樣不就證明改進有效了? 但在高度 imbalanced data 中,這幾乎是不可能的。因為你只要嘗試去讓 model 多預測一點 minority class,這時候牽一髮而動全身,在很多原本你會預測 majority class 的地方,就會變成預測 minority class,造成 accuracy 大幅下降。

所以解決方法當然就是,不使用 accuracy。過去人們都覺得 accuracy 是個很直覺的 evaluation 方法,卻沒有想過 accuracy 通常跟實際上的效益沒有很高的連結,所以才會在這裡有如此的盲點。

以原文的火災預測案例來說,可以舉出幾種 evaluation 方法可以比 accuracy 更能反映效益:

  1. 當你預測一個不會發生火災的地方”會發生火災”,那你頂多就是提高一些人的戒備,或是多派一些人去警告住戶,這叫做 false alarm 或是 false positive,這個 cost 不高。但如果你預測一個會發生火災的地方”不會發生火災”,那可能會疏於警戒,導致火災發生,救災遲到,這時候就會損失很多財產,甚至人命,這樣 cost 就很高。因此,我可以設定這兩種預測錯誤的 cost 是多少,然後算出平均每筆 data cost 是多少。這樣的 evaluation 就會很接近真實狀況。
  2. 我有 10 組人,想要讓他們分別駐守 10 個最有可能發生火災的地點,這時候我要解的問題就變成了 ranking,要以發生火災的機率將 data 從高排到低。假設你的 model accuracy 很高,預測發生火災的地方有 90% 真的會發生火災,預測不會發生火災的地方都不會發生火災。但是你提出的前 10 個最有可能發生火災的地方卻只有 50% 會發生火災,那 model accuracy 這麼高有什麼用? 一半的人力都浪費掉了。因此,在這邊的評估方式應該改為 precision at 10,也就是我預測的前 10 名裡面,有多少比例真的有發生火災。

訂 evaluation 方法事實上是個相當困難的問題,你可以試試看從上面這兩種方法,找到漏洞,應該相當容易。另外就是,這種精確定義問題的邏輯其實除了在 machine learning 這個領域中,是相當少見的,對許多人來說是違反直覺的,因為他們就算能精確定義出問題,也無法精確地解決這個問題。這也是為什麼許多非 machine learning 出身,稍微會一點工具的人,很容易就會解錯問題。

上面這個例子中,一個很大的漏洞就是,無法估計人命損失的 cost。因此大部分時候,我們還是會很謹慎的用各種不同的 evaluation,例如 F-measure,AUC 系列,或是 ROC 等等的 curve 系列方法,來 evaluate model 的有效性。

那如果你想要 optimize 的東西真的是 accuracy 怎麼辦? 那 99.9% 不就很高了嗎XD 即使變成 99.99% 也應該沒什麼感覺才對。如果你剛剛感到了一絲不安,覺得這 0.09% 差很多,那很有可能你心中在想的是別種 evaluation。如果真的在意那一點點差別,要怎麼避免前面提到的牽一髮而動全身的問題? 比較有機會的方法是找到更有效的 feature,以及使用更複雜或是更符合 data 特性的 model,這我就不多說了。

在確定 evaluation 要用什麼之後,imbalance 還是會造成 model training 上的困難,等我在下集解釋囉~

Advertisements

10 thoughts on “我處理 Imbalanced Data 的心得 (上)

Add yours

  1. FNR、FPR就可以分析模型的可行性,其預測是否有不平衡,甚至透過繪製ROC曲線、PR曲線可以找到在哪個參數下最合適的模型。

    而這問題最根本在於樣本資料數不足,近幾年探討的GAN模型可以模仿並生成資料,但實際上樣本資料少到一個極致,原先的資料就已經不足以描述原本的模型,實際上會學出另一個區域的模型,這種情況對於預測火災似乎也幫不上忙。

    我認為目前可行性最高的,反而是提高描述火災的特徵維度,但是維度提高表示資料量需要更多,才能描述的更完整,但實際上這就是我們原本的問題,因此我們可以透過降維方法,提取最具代表性的幾維特徵,再讓機器學習適合的模型,或許可以讓預測模型更具有說服力。

    Like

    1. 感謝你的回覆

      第一段所說的方法,就如同我內文所說,在實際上有更接近想要 optimize 的東西的 evaluation 時,我們並不會特別去依賴 ROC 等等的分析。他們固然有幫助,但實際上會偏離真正的目標,而且如果目標是我文章所講的範例1的類型,其實是可以做 cost-sensitive learning 去直接 optimize 的。我想,我內文應該寫得夠清楚吧?只是我還沒講到實際上知道這些 evaluation 後要如何去做調整。

      而 imbalanced data 的根本問題當然不是資料不足,而是 imbalance。資料不足有資料不足的時候要做的事,imbalance 有 imbalance 要做的事,不可以混為一談。例如資料夠,但高度 imbalanced,你仍然無法透過普通的學習方法去 optimize AUC,F1 等等的。

      關於 synthetic data 的部份,其實我還沒講到他們會如何幫助 learning。實際上他們的運作方式不是很單純,並不是說 data 少就不適合,也不是說 data 多就適合。這我在下一篇會提出解釋和相關經驗。

      而你提到的最後一段,其實方向是對的,任何 machine learning application 最重要的一步就是找出重要的 feature,經驗上這個改變甚至比專為問題設計特殊的 model 還要有效。但您後面提出的解釋有些問題,維度高並不代表需要資料更多,您遇到的應該是 feature 中有過多不重要或是過度相似的部份,進而因為您使用的 model 的特性而產生負面的影響。我不確定你所說的降維包不包含 feature selection,如果不包含,其實也是蠻有問題的。很多人會說可以用 PCA 之類的方法,但其實這類 unsupervised 方法會讓資訊有所損失,可能會把原本很重要的資訊遺漏掉。無論如何,了解自己所使用的 model,才能知道這些方法會產生什麼影響,不同的 preprocessing 對不同 model 都會產生不同的效果。如同 GAN,這類方法也有一些不單純的效果,在無計可施的時候也是一招。

      Like

  2. 你好 有幸能拜讀你的文章 真的受益良多~ 希望能趕快看到後續的部分
    另外,想請問一下,以上述火災的問題來看,如果我願意接受比較多的false positive,但很不能接受false negative(預測火災不會發生卻發生),可以用ROC curve中最低false negative的機率來當evaluation嗎?

    Like

      1. 抱歉抱歉~是我搞錯了,我原本的想法是去找model中最大化的true positive rate,但只要全部都預測positive就會有100%TPR了,只是整個model也就完全沒價值了,所以似乎不太可行。

        Like

  3. 你的approach比較像是cost-function based的method(assign different to cost to positive and negative classes,例如火災的例子:false negative造成的損失 >> false positive)至於D4SG的部分關於「複製和刪除 instance 的方法」則是 sampling based 的 approaches,對於生成的instance不要純粹產生replicated copies,就有點像SMOTE (Synthetic Minority Over-Sampling Technique)的想法,他們都是方法,應該沒都有錯誤才對。

    Like

    1. 提醒一下,這篇的重點是在 evaluation,不是在怎麼 train model,因為 evaluation 比怎麼 train還重要,這才是這篇點出的他們的錯誤點。

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

%d bloggers like this: