今天有朋友貼給我這篇文章
http://d4sg.org/accuracy-paradox-in-disaster-prevention/
(可以不用看,我下面會詳細解釋)
看完我感覺很糟,主要是因為,這短短一篇文章,作者很有自信的講出許多錯誤的觀點,還一副教人的樣子。而且這個網站還提供了無效的 SSL Certificate,讓人不開心(誤)。作者強不強我不知道也不評論,我的觀點有沒有問題我也不確定,但這篇文章有許多問題。讓我用簡單的,high-level 的方式解釋,順便分享我過去處理 imbalanced data 的心得。
接下來的文章,我會先解釋什麼是 imbalanced data,為什麼他很難處理。然後解釋原文的三大問題(看不懂沒關係,後面會解釋):
- 從 accuracy 的問題切入,卻沒有解釋取代 accuracy 的方案,莫名的跳到調整 data / model。
- 原文提出了五個處理 imbalanced data 的方法,其中的描述錯誤百出,且過度強調一些似是而非的觀點。
- 沒有提到現在最新最潮最流行的 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 更能反映效益:
- 當你預測一個不會發生火災的地方”會發生火災”,那你頂多就是提高一些人的戒備,或是多派一些人去警告住戶,這叫做 false alarm 或是 false positive,這個 cost 不高。但如果你預測一個會發生火災的地方”不會發生火災”,那可能會疏於警戒,導致火災發生,救災遲到,這時候就會損失很多財產,甚至人命,這樣 cost 就很高。因此,我可以設定這兩種預測錯誤的 cost 是多少,然後算出平均每筆 data cost 是多少。這樣的 evaluation 就會很接近真實狀況。
- 我有 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 上的困難,等我在下集解釋囉~
Leave a comment