如何「科學的比較」機器學習模型表現?

最近在趕paper,碼字的時間不多,也剛好借著這個機會踐行「寫少、少寫,寫好」。今天談談如何對比多個機器學習演算法的性能,閱讀本文需要基本的統計檢驗知識,比如明白假設檢驗中 P<0.05通常說明了統計學顯著性差異。

0. 背景

對比多個機器學習的演算法性能是研究中很重要的一步,舉幾個常見的場景:

  • 假設你開發了一個新的演算法,那麼希望在多個數據集上證明你的新演算法是 state of the art(最牛逼的)。
  • 假設你找到了一個新的數據集,你想研究到底什麼演算法在這個數據集上表現最優。
  • 結合上面兩個場景,你想知道你的新演算法在什麼數據集上表現最優。

1. 常見做法與風險

搞機器學習不懂數學和統計,估計大家或多或少都被這麼吐槽過。其實從某個角度看這個觀點也有道理,因為在很長的一段時間裡機器學習演算法的對比都是簡單的走以下幾個步驟:

  • 直接對比誤分率(misclassification rate),也就是準確度。
  • 再好一點的可能對比 精確率(precision)和召回率(recall),或者算一下F1。
  • 在多做一點的可能會比較一下 ROC 曲線下的面積,也就是ROC_AUC。
  • 再嚴謹的可能會嘗試做一下交叉驗證(cross-validation)之後再對比。

大部分對比做到這個程度,其實也仁至義盡了,但這種方法有什麼問題嗎?

  • 無法得到可靠的對比結果,如果演算法A在3個數據集上比較好,而B在5個數據集上表現好,如何證明誰更好?
  • 如果對比多個演算法,兩兩對比效率低,準確度低,而且可能造成嚴重的統計偏差。試問,如果演算法A比B好,B比C好,C比D好,那麼是否A比D好?這種推論僅當其中每個過程都不可逆或者非常明顯才可得。
  • 如果有多個數據集(>2)和多個演算法(>2),對比不直觀且不準確。

10種演算法在4個數據集上的ACC/F1/ROC

以上圖為例,我畫出了10種演算法在4個數據集上的表現,這是很難一眼看出那個演算法更好的。而且往往沒有那個演算法可以包打天下。

1. 一些研究者的嘗試

首先令人感到詫異的是,直到今天大部分的機器學習演算法論文和書籍都還在用上面的簡單做法。雖然往往能得到有效的結論,但一部分研究得到的結論其實站不住腳。

當然,機器學習研究者也進行了一系列嘗試,比如下面的幾篇論文:

  • Statistical Comparisons of Classifiers over Multiple Data Sets
  • An Extension on "Statistical Comparisons of Classifiers over Multiple Data Sets" for all Pairwise Comparisons
  • Time for a change: a tutorial for comparing multiple classifiers through Bayesian analysis (未發表)

大部分方法說白了,就是從統計學概念上延伸出去。統計學上,如果你想對比兩個樣本組是否來自於同一個分布,可以嘗試做t-test,如果你想分析兩個及以上樣本之間的顯著性檢驗,可以做方差分析(ANOVA),也叫做F-test。多樣本之間的差異分析一般的步驟如下:

  • 使用某種顯著性建議測試(如ANOVA)來分析你的多組樣本之間是否存在明顯不同。
  • 如果存在,那麼使用post-hoc來確定到底是哪些樣本間存在差異。
  • 確定了不同的兩組後,在進行配對比較(pairwise analysis),分析的方法依賴於前面步驟中的做法。

舉個簡單的例子,A, B, C三人記錄每天吃的雞蛋數,連續記錄十天,那麼得到一個[3,10]的數據。此時你需要先使用某種顯著性檢測方法來分析ABC三人在每天吃蛋數上是否有明顯的不同如果沒有,那麼分析可以到此為止。如果有,那麼需要在用post-hoc手段來分析到底是A和B不同,還是B和C不同。找到不同的兩個人以後,可以在分析A和B到底不同在哪裡(如ANOVA可以對 mu 進行分析)。

2. 不成熟的小建議

這個流程說來簡單,但其實往往有不少麻煩的地方:

  • 進行多樣本間的顯著性測試往往要求:
    • 樣本殘差(residual)各自符合正態分布(normal distribution)。* 其實這個違反這個原則有時候也不礙事。
    • 數據獨立性假設。
    • 樣本之間的大小一致,比如很多演算法無法檢驗A吃蛋10天的數據,B吃蛋3天的數據,和C吃蛋6天的數據。
  • 很多多樣本的對比測試沒有合適的Python實現,如果想要使用需要使用R或者SPSS。
  • 結果分析中存在各種各樣的陷阱,比如 P = 0.051是否說明可以拒絕假設。

為了迴避某些檢驗的強假設和要求,如等尺寸樣本,我建議大家可以用下面這個框架來對比多個模型:

  1. 使用Kruskal–Wallis測試來確定你的多樣本之間是否存在顯著差異。若p>0.05,進行下一步。* 如果 p 接近0.05,也可以進行以下步驟。
  2. 使用Dunns Test來確定哪些樣本間存在差異,結果是一個n*n的矩陣,可以通過熱力圖可視化(如下圖)。
  3. 針對兩個樣本,可以用Mann–Whitney U test 進行檢測差異性。更直觀的對比兩個樣本,也可以對中值(median)進行對比分析,因為這些演算法都是建議在排序上的(Rank)。

這個框架的好處是這些統計學檢測手段都是非參數的(non-parametric),假設相對較少且可以處理不同尺寸的樣本對比。更重要的是,Python中的Scipy有 Kruskal–Wallis和Mann–Whitney U test的實現,而Dunns test有開源工具包(Python Package Index)開發者是一位毛子大哥。使用這位大哥的工具包,還可以輕鬆的將Dunns Test的結果可視化,下面是我的一個小例子(這個配色是我改的,毛子大哥用了紅配綠實在難看),下圖中可以發現隨機森林(RF)和樸素貝葉斯之間結果有明顯不同:

3. 寫在最後

總體來說,更嚴謹的機器學習演算法評估還是要學習統計的那一套,而不能僅僅對比一下準確率就認為真的有了效果提升。但這種現象的發生不是偶然,可以歸結於:

  • 機器學習很難在大量數據上進行對比,因此樣本數量有限導致統計學意義打了折扣。
  • 比較嚴謹的對比會導致很多水文發不出去,都是出來混口飯都互相理解。
  • 可能,大概,或許...只是因為做機器學習的人真的不太懂統計吧。

玩笑歸玩笑,文中介紹的方法只是拋磚引玉,也並不適用於每個場景,但可以在你不知道如何對比的時候破局。建議在使用以上檢驗測試時先了解一下基本的應用場景和假設,並了解什麼時候可以reject null hypothesis。文中的例子並不嚴謹,如果paper一切順利的話,也會給大家附上鏈接和代碼作為一個實例參考。

祝我好運 (手動滑稽) ?????

推薦閱讀:

價值4.2億,中國如何幫挪威造智能深海漁場?
夢想照進現實 電影里才有的「神器」現已成真
ISSCC 2017 看AI晶元的四大趨勢
2017回顧與2018前瞻:機器學習與人工智慧
科技公司要幹掉專業媒體?先邁過內容這道大坎

TAG:人工智能 | 机器学习 | 数据挖掘 |