訓練/開發/測試集劃分
設立訓練集,開發集和測試集的方式大大影響了或者團隊在建立機器學習應用方面取得進展的速度。同樣的團隊,即使是大公司裡的團隊,在設立這些資料集的方式,真的會讓團隊的進展變慢而不是加快,看看應該如何設立這些資料集,讓團隊效率最大化。
在此,想集中討論如何設立開發集和測試集,開發(dev)集也叫做開發集(development set),有時稱為保留交叉驗證集(hold out cross validation set)。然後,機器學習中的工作流程是,嘗試很多思路,用訓練集訓練不同的模型,然後使用開發集來評估不同的思路,然後選擇一個,然後不斷迭代去改善開發集的效能,直到最後可以得到一個令滿意的成本,然後再用測試集去評估。
現在,舉個例子,要開發一個貓分類器,然後在這些區域裡運營,美國、英國、其他歐洲國家,南美洲、印度、中國,其他亞洲國家和澳大利亞,那麼應該如何設立開發集和測試集呢?
其中一種做法是,可以選擇其中4個區域,打算使用這四個(前四個),但也可以是隨機選的區域,然後說,來自這四個區域的資料構成開發集。然後其他四個區域,打算用這四個(後四個),也可以隨機選擇4個,這些資料構成測試集。
事實證明,這個想法非常糟糕,因為這個例子中,開發集和測試集來自不同的分佈。建議們不要這樣,而是讓開發集和測試集來自同一分佈。的意思是這樣,們要記住,想就是設立開發集加上一個單實數評估指標,這就是像是定下目標,然後告訴團隊,那就是要瞄準的靶心,因為一旦建立了這樣的開發集和指標,團隊就可以快速迭代,嘗試不同的想法,跑實驗,可以很快地使用開發集和指標去評估不同分類器,然後嘗試選出最好的那個。所以,機器學習團隊一般都很擅長使用不同方法去逼近目標,然後不斷迭代,不斷逼近靶心。所以,針對開發集上的指標最佳化。
然後在左邊的例子中,設立開發集和測試集時存在一個問題,團隊可能會花上幾個月時間在開發集上迭代最佳化,結果發現,當們最終在測試集上測試系統時,來自這四個國家或者說下面這四個地區的資料(即測試集資料)和開發集裡的資料可能差異很大,所以可能會收穫"意外驚喜",並發現,花了那麼多個月的時間去針對開發集最佳化,在測試集上的表現卻不佳。所以,如果開發集和測試集來自不同的分佈,就像設了一個目標,讓團隊花幾個月嘗試逼近靶心,結果在幾個月工作之後發現,說“等等”,測試的時候,"要把目標移到這裡",然後團隊可能會說"好吧,為什麼讓花那麼多個月的時間去逼近那個靶心,然後突然間可以把靶心移到不同的位置?"。
所以,為了避免這種情況,建議的是將所有資料隨機洗牌,放入開發集和測試集,所以開發集和測試集都有來自八個地區的資料,並且開發集和測試集都來自同一分佈,這分佈就是所有資料混在一起。
這裡有另一個例子,這是個真實的故事,但有一些細節變了。所以知道有一個機器學習團隊,花了好幾個月在開發集上最佳化,開發集裡面有中等收入郵政編碼的貸款審批資料。那麼具體的機器學習問題是,輸入\(x\)為貸款申請,是否可以預測輸出\(y\),\(y\)是他們有沒有還貸能力?所以這系統能幫助銀行判斷是否批准貸款。所以開發集來自貸款申請,這些貸款申請來自中等收入郵政編碼,zip code就是美國的郵政編碼。但是在這上面訓練了幾個月之後,團隊突然決定要在,低收入郵政編碼資料上測試一下。當然了,這個分佈資料裡面中等收入和低收入郵政編碼資料是很不一樣的,而且他們花了大量時間針對前面那組資料最佳化分類器,導致系統在後面那組資料中效果很差。所以這個特定團隊實際上浪費了3個月的時間,不得不退回去重新做很多工作。
這裡實際發生的事情是,這個團隊花了三個月瞄準一個目標,三個月之後經理突然問"們試試瞄準那個目標如何?",這新目標位置完全不同,所以這件事對於這個團隊來說非常崩潰。
所以建議們在設立開發集和測試集時,要選擇這樣的開發集和測試集,能夠反映未來會得到的資料,認為很重要的資料,必須得到好結果的資料,特別是,這裡的開發集和測試集可能來自同一個分佈。所以不管未來會得到什麼樣的資料,一旦演算法效果不錯,要嘗試收集類似的資料,而且,不管那些資料是什麼,都要隨機分配到開發集和測試集上。因為這樣,才能將瞄準想要的目標,讓團隊高效迭代來逼近同一個目標,希望最好是同一個目標。