1. 程式人生 > >Machine Learning Yearning(5、6、7)

Machine Learning Yearning(5、6、7)

Setting up development and test sets

設定開發和測試集

Chapter 5、Your development and test sets

您的開發和測試集
​ 讓我們回到我們早期貓圖片的那個例子:你執行一個移動app,使用者正在上傳很多不同事物的圖片到該app中。你想自動找到貓的圖片。
​ 您的團隊通過從不同網站上下載貓(positive examples,正樣本)和非貓(negative examples,負樣本)的圖獲得一個大的訓練集。 他們將資料集按照比例70%/ 30%分成訓練集/測試集。 使用這些資料,他們構建了一個在訓練集和測試集上都表現很好的的貓檢測器。
​ 但是當你將這個分類器部署到移動app時,你發現表現真的很糟糕!

這裡寫圖片描述

​ 發生了什麼?
​ 您發現使用者上傳的圖片與您構建訓練集的網站圖片有所不同:使用者上傳的照片使用手機拍攝,這些照片往往解析度較低,比較模糊,並且採光不好。 由於您的訓練集/測試集是由網站圖片構建的,您的演算法沒有很好的兼顧到你所關心的智慧手機圖片的實際分佈。
​ 在大資料的時代之前,在機器學習中使用隨機的70%/ 30%來分割訓練集和測試集是常見的規則。 這種做法可以工作,但在越來越多的應用程式,如訓練集的分佈(上面例子中的網站影象)不同於你最終關心的分佈(手機影象),這是一個壞主意。

​ 我們通常定義:

  • 訓練集 - 學習演算法執行在這上面。
  • Dev(開發)集 - 用於調整引數,選擇特徵,以及對學習演算法做出其他決定。 有時也稱為維持交叉驗證集(hold-out cross validation set)。
  • 測試集 - 用於評估演算法的效能,但不要做出關於使用什麼學習演算法或引數的任何決定。

​ 你定義一個開發集和測試集,你的團隊會嘗試很多想法,如不同的學習演算法引數,看看什麼是最好的。 開發集和測試集能夠使你的團隊快速看到你的演算法做得有多好。

​ 換句話說,開發和測試集的目的是指導你的團隊對機器學習系統進行最重要的更改。
​ 所以,你應該做如下事情:

  • 選擇開發和測試集,以反映您期望在未來獲得的資料,並希望做好。

​ 換句話說,您的測試集不應該只是可用資料的30%這麼簡單,特別是如果您期望您的未來資料(移動app圖片)在性質上與您的訓練集(網站影象)不同時。

​ 如果您尚未啟動移動app,可能還沒有任何使用者,因此可能無法獲取準確反映您未來需要做的更好的資料。 但你可能仍然嘗試去靠近它。 例如,請你的朋友拍一些手機圖片,併發送給你。 一旦app啟動後,您可以使用實際的使用者資料更新您的開發集/測試集。
​ 如果你真的沒有任何方法來獲得接近你期望的未來資料,也許你可以從使用網站影象開始。 但是你應該意識到這將導致系統不能一般化的很好的風險。
​ 我們需要判斷去決定多少投資開發好的開發集和測試集。 但是不要假定你的訓練分佈與你的測試分佈是一樣的。 嘗試選擇反映您最終想要表現良好的測試樣本,而不是訓練遇到的任何資料。

Chapter 6、Your dev and test sets should come from the same distribution

你的開發集和測試集應該來自相同的分佈

根據您最大的市場,將貓應用圖片資料分為四個區域:(i)美國,(ii)中國,(iii)印度和(iv)其他。要想出一個開發集和一個測試集,我們可以隨機分配這兩個區域到開發集,另外兩個到測試集,對吧? 比如美國和印度在開發集; 中國和其他在測試集。

這裡寫圖片描述

​ 一旦定義了開發集和測試集,您的團隊將專注於提高開發集的效能。 因此,開發集應該反映你最想提高的任務:在所有四個地區都要做得很好,而不只是兩個。
​ 開發集和測試集的不同分佈帶來的第二個問題:有一個機會,你的團隊將構建一些在開發集件上工作得很好,只是發現它在測試集上做得不好。 我曾經在很多失望和白費的努力中看到這個結果。 避免讓這些發生在你身上。
​ 例如,假設您的團隊開發的系統在開發集上工作的很好,但在測試集上並不如意。 如果你的開發集和測試集合來自相同的分佈,那麼你會有一個非常明確的診斷哪裡出錯了:你在開發集上過擬合(overfit)了。顯而易見的方法是去獲得更多的開發集資料。

​ 但是如果開發集和測試集來自不同的分佈,那麼你的選擇是不清晰的。幾方面可能會出錯:

  • 1、在開發集上過擬合。
  • 2、測試集比開發集更難。所以你的演算法可能做的和預期一樣好,因此沒有進一步的重大改進的可能了。
  • 3、測試集不一定更難,但只是和開發集不同。所以在開發集上表現很好但並不能在測試集上表現一樣。這種情況下,之前很多提高開發集效能的努力可能都白費了。

​ 在機器學習應用程式上工作是很艱難的。具有不匹配的開發和測試集引入了關於是否改進開發集分佈也提高測試集效能額外的不確定性。具有不匹配的開發和測試集,使得更難找出什麼是有效和無效的努力,因此使得更難以確定工作的優先順序。
​ 如果你面臨的是第三方基準測試 問題,他們的建立者可能會指定開發集和測試集來自不同的分佈。相比開發和測試集來自同一分佈,此時運氣,而不是技術,將對這樣的基準的效能有更大的影響。開發一個在一個分佈上訓練的很好同時能夠很好的推廣到另一個分佈中的學習演算法是一個重要的研究問題。但是如果你的目標是在一個特定的機器學習應用中取得進展,而不是研究進展,我建議嘗試選擇開發集和測試集從相同的分佈。這將使您的團隊更有效率。

Chapter 7、How large do the dev/test sets need to be?

開發集/測試集需要多大?

​ 開發集應該足夠大,以檢測您嘗試的演算法之間的差異。例如,如果分類器A具有90.0%的準確度,分類器B具有90.1%的準確度,那麼100個樣本的開發集將不能檢測出這0.1%的差異。與我看到的其他機器學習問題相比,100個樣本的開發集太小了。常見的開發集的大小在1,000到10,000個樣本之間。有10,000個樣本,你將有很好的機會檢測到這0.1%的提升。[2]
​ 對於成熟和重要的應用,例如廣告,網路搜尋和產品建議 - 我也看到了很多團隊,甚至為提升0.01%積極努力,因為它對公司的利潤有直接影響。在這種情況下,開發集可以遠大於10,000,以便檢測出更小的提升。
​ 測試集的大小應該多大?它應該足夠大,使得對系統的整體效能有一個高的信心。一個流行的啟發式方法是將30%的資料用於測試集。當你有適量的樣本,比如100到10,000的樣本,它會工作的很好。但在大資料的時代,我們現在有機器學習問題,有時會超過十億個樣本,分配給開發集/測試集的比例一直在縮小,即使開發集 /測試集中的樣本絕對數量一直在增長。除了需要評估演算法的效能之外,沒有必要提供過大的開發集/測試集。

——————————

[2]. 在理論上,我們可以測試演算法的變化是否對開發集產生統計上顯著的差異。 在實踐中,大多數團隊不會為此困擾(除非他們出版學術研究論文),我通常沒法發現統計意義的測試對測量臨時進展是有用的。