0
| 本文作者: 光陰 | 2017-05-25 17:15 |
雷鋒網按:本文作者 Jason Brownlee 為澳大利亞知名機器學習專家,對時間序列預測尤有心得。原文發布于其博客。雷鋒網編譯。

Jason Brownlee
許多隨機機器學習算法存在同樣的問題:相同的算法、相同的數據,得到的計算結果卻每次都不同。這意味著在進行隨機算法檢驗或者算法比較的時候,必須重復試驗很多次,然后用它們的平均值來評價模型。
那么對于給定問題,隨機機器學習算法需要試驗多少次,才足以客觀有效的反映模型性能?
一般建議重復30次以上甚至100次左右。有人甚至重復幾千次,完全無視邊際遞減效應。
對于衡量隨機機器學習算法性能所需的重復試驗次數,在本教程中,我將教會大家如何用統計學方法來正確預估。
本教程分以下4部分:
數據生成
基本分析
重復次數的影響分析
標準誤差計算
本教程使用Python語言,版本 2或者3均可,為順利運行示例代碼,請務必安裝SciPy 、NumPy、Pandas和Matplotlib庫。
下面正式開始我們的教程
第一步是生成可用的數據。
假設我們將一個神經網絡模型或其它隨機算法,在數據的訓練集上重復訓練了1000次,并且記錄了模型在測試集上的均方根誤差(RMSE)。作為本教程后續分析的前提,假設我們所用的數據呈正態分布。
務必查看一下結果的分布形態,通常結果會呈高斯分布(即正態分布)。
我們會預先生成研究用的樣本總體,這么做對后續研究非常有幫助,因為程序生成的樣本總體其均值和標準差就確定下來,而這在實際應用中常常是無法得知的。
我們用均值=60,標準差=10作為參數生成試驗數據。
下面是生成1000個隨機數的代碼,將結果保存為results.csv文件.
代碼中我們用seed()作為隨機數生成器種子函數,來確保每次運行代碼后得到的數據都一致。使用normal()函數生成正態分布隨機數,用savetxt()函數將數據保存為ASCII格式。

運行這段代碼后,我們得到一個名為results.csv的文件,里面保存了1000個隨機數,它們代表了隨機算法重復運行的模擬結果。
下面是該文件的最后十行數據。
6.160564991742511864e+01
5.879850024371251038e+01
6.385602292344325548e+01
6.718290735754342791e+01
7.291188902850875309e+01
5.883555851728335995e+01
3.722702003339634302e+01
5.930375460544870947e+01
6.353870426882840405e+01
5.813044983467250404e+01
現在咱們先把如何得到這批數據的事放一邊,繼續往下進行。
得到樣本總體之后,我們先對其進行簡單的統計分析。
下面三種是非常簡單有效的方法:
計算統計信息,比如均值、標準差和百分位數。
繪制箱線圖來查看數據散布程度
繪制直方圖來查看數據分布情況
通過下面的代碼進行簡單的統計分析,首先加載results.csv數據文件,然后進行統計計算,并繪圖顯示。

可以看出,算法的平均性能約為60.3,標準差約為9.8。
假定數據表示的是類似均方根誤差一樣的最小值,從統計結果看,最大值為99.5,而最小值為29.4。

下面的箱線圖中展示了數據的散布程度,其中箱形部分是樣本中段(上下四分位之間)數據(約占樣本的50%),圓點代表異常值,綠線表示中位數。

由圖可知,結果圍繞中值分布合理。
最后生成的是數據的直方圖,圖中顯示出了正態分布的貝爾曲線(鐘形曲線),這意味著我們在進行數據分析工作時,可以使用標準的統計分析工具。

由圖可知,數據以60為對稱軸,左右幾乎沒有偏斜。
3.重復次數的影響分析
之前我們生成了1000個結果數據。對于問題的研究來說可能多了,也可能不夠。
該如何判斷呢?
第一個想法就是畫出試驗重復次數和這些試驗結果均值之間的曲線圖。我們希望隨著重復次數的增加,結果的均值能很快穩定。繪制成曲線后,看起來起始段波動較大且短,而中后部平穩且長。
利用下面的代碼繪制出該曲線。

由圖可以看出,前200次數據均值波動較大, 600次后,均值趨于穩定,曲線波動較小。

為了更好的觀察曲線,將其放大,只顯示前500次重復試驗結果。
同時將1000次試驗結果的均值線疊加上,以便找到兩者之間的偏差關系。

圖中橙色直線就是1000重復試驗結果的均值線。

同時也能看到重復100次時,結果與均值較近,重復次數達到400時,結果更理想,但是提升不明顯。
是不是很棒?不過會不會還有更好的辦法呢?
標準誤差用來計算樣本均值偏離總體均值的多少。它和標準差不同,標準差描述了樣本觀察值的平均變化量。標準誤差能夠根據樣本均值的誤差量或者誤差散布來估計總體均值。
標準誤差可以通過下式計算:
standard_error = sample_standard_deviation / sqrt(number of repeats)
即標準誤差等于樣本的標準差除以重復次數的均方根。
我們希望標準誤差會隨著試驗次數的增加而減小。通過下面的代碼,計算每個重復試驗次數對應的樣本均值的標準誤差,并繪制標準誤差圖。

運行代碼后,會繪制出標準誤差與重復次數的關系曲線。
和預期的一樣,隨著重復試驗次數的增加,標準誤差快速減小。標準誤差下降到一定程度后,趨于穩定,通常把1~2個單位內的值,稱為可接受誤差。
標準誤差的單位和樣本數據的單位一致。

在上圖中添加縱坐標為0.5和1的輔助線,幫助我們找到可接受的標準誤差值。代碼如下:

雷鋒網友情提醒,圖中出現的兩條紅色輔助線,分別代表標準誤差等于0.5和1。
由圖可知,如果試驗重復次數等于100次左右,標誤差開始小于1,如果試驗重復次數等于300~350次左右,標準誤差小于0.5。隨著重復試驗次數的增加,標準誤差趨于穩定,變化較小。再次提醒大家記住,標準誤差可以衡量樣本均值偏離總體均值的多少。

我們也可以使用標準誤差來作為均值的置信區間。比如,用總體均值的95%作為置信區間的上下界。這種方法只適合試驗重復次數大于20的情況。
置信區間定義如下:
樣本均值 +/- (標準誤差*1.96)
下面計算置信區間,并將其作為誤差線添加到重復試驗次數對應的樣本均值上。這是計算代碼。

下圖創建了帶置信區間的樣本均值曲線。
其中紅色直線表示總體的均值(在教程開始根據給定的均值和標準差生成了總體,所以總體的均值已知),重復1000次或更多后,可以用樣本均值代替總體均值。
圖中誤差線包裹著均值線。而且樣本均值夸大或高估了總體均值,不過還是落在總體均值的95%置信區間內。
95%置信區間的含義是做100次重復試驗,有95次包含了總體均值的真值,另外5次沒有包括。
圖中可以看出,隨著重復次數的增加,由于標準誤差的減小,95%置信區間也逐漸變窄。

放大上圖后,這種趨勢在20到200之間時尤其明顯。

這是由上述代碼生成的樣本均值和誤差線隨試驗次數變化的曲線。此圖能更好的反映樣本均值與總體均值的偏差。

實際上,既涉及使用隨機算法的計算試驗方法又涉及統計學的參考資料非常少。
我個人認為1995年科恩的書是兩者結合最好的:
Empirical Methods for Artificial Intelligence(人工智能實證方法),Cohen(科恩),1995
如果你對這篇教程感興趣,我強烈推薦此書。
另外,維基百科上還有幾篇文章可能對你有幫助:
如果你還有其他好的相關資料,可以在評論區與大家交流。謝謝。
在這篇教程里,我們提供了一種合理選擇試驗重復次數的方法,這有助于我們評價隨機機器學習算法的正確性。
下面是幾種重復次數選擇的方法:
簡單粗暴的直接用30、100或者1000次。
繪制樣本均值和重復次數的關系曲線,并根據拐點進行選擇。
繪制標準誤差和重復次數的關系曲線,并根據誤差閾值進行選擇。
繪制樣本置信區間和重復次數的關系曲線,并根據誤差散布進行選擇。
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。