全文共3475字,預計學習時長7分鐘git
圖片來源:unsplash.com/@mattyfoursgithub
數據科學家比軟件工程師更加擅長統計學,也比統計學家更加擅長軟件工程。若是能有效避免在編碼過程當中的錯誤,你必定成爲一個優秀的數據科學家!算法
文中每一個示例的詳細輸出和代碼能夠在github和交互式筆記本中找到。該代碼使用數據工做流管理庫d6tflow,數據與數據集管理庫d6tpipe共享。微信
傳送門:函數
http://tiny.cc/top10-mistakes-stats-code性能
http://tiny.cc/top10-mistakes-stats-bind學習
https://github.com/d6t/d6tflow測試
https://github.com/d6t/d6tpipe優化
1. 沒有徹底理解目標函數編碼
數據科學家想要創建「最佳」模型。然而美是我的的主觀感覺。若是不瞭解目標和目標函數,以及它的行爲模式,就很難構建出「最佳」模型。更況且,目標甚至可能不是數學函數,而是提升業務指標。
對策:大多數人花費大量時間來理解目標函數以及數據和模型跟目標函數之間的聯繫。若是須要優化業務指標,則應該將它標示在正確的數學目標函數上。
案例:F1分數一般用於評估分類模型。分類模型的成功取決於正確的發生率。F1分數是具備誤導性的,由於它代表模型在60%的時間內是正確的,而實際上它只有在40%的時間內是正確的。
f1 0.571 accuracy 0.4
2. 沒有創建某物爲什麼起做用的假說
數據科學家一般但願創建「模型」——聽說xgboost和隨機森林的效果是最好的,因此就使用它吧。很多人在沒有查看數據的狀況下拋出問題的模型,而且沒有造成一個假設——即哪一個模型最有可能最好地捕獲數據的特徵。這也使得解釋的工做很是困難,由於人們只是隨機地向數據扔模型。
對策:多研究數據,理解它的特徵,並造成哪一個模型最有可能捕捉到特徵的假設。
案例:不須要運行任何模型,只需繪製這個樣本數據,就能夠清楚地看到x1與y線性相關,而2與y沒有太大關係。
3. 在分析結果以前沒有看數據
不查看數據的另外一個問題是,結果可能嚴重受異常值或其餘構件的影響。最小化平方和的模型尤爲如此,即便不受異常值的影響,也可能會遇到數據集不平衡、值被剪切或丟失,以及在課堂上看不到的各類真實數據的奇怪構件。
對策:查看研究數據是很是重要的。瞭解數據的性質,以及它們如何影響模型結果。
案例:在異常值的影響下,x1斜率從0.906變爲-0.375!
4. 沒有一個簡單的基線模型
如今,ML變得十分簡單,只需更改一行代碼,就能夠運行一個又一個新模型。從調整參數到偏差指標進一步減小,有了這麼完美的模型,過去那些愚蠢的預測數據的方法均可以被摒棄了。若是沒有這個基本的基準,就不要對模型有好的絕對比較 ,由於在絕對意義上它們都有多是很差的。
對策:預測一個值的最愚蠢的方法是什麼?使用最後一個已知值、滾動平均值或某個常量(如0)創建「模型」。將模型性能與沒有智力的猴子進行比較。
案例:在此時間序列數據集中,Model1必須比MSE分別爲0.21和0.45的Model2更好。可是,只要取最後一個已知值,均方偏差就降低到0.003!
ols CV mse 0.215
rf CV mse 0.428
last out-sample mse 0.003
圖片來源:unsplash.com/@neonbrand
5. 樣本外測試不正確
這個錯誤可能會令事業脫軌!創建的模型在研發方面看起來很好,但在生產方面表現糟糕。
你所說的「能創造奇蹟」的模式會致使很是糟糕的業務結果,可能會讓公司損失逾100萬美圓。重要的是,除了最後一個錯誤,其他的錯誤都要注意。
對策:確保你已經在實際的超樣條件下運行了你的模型,並理解它何時會表現好,何時不會。
案例:在樣本中,隨機森林的MSE爲0.048比OLS爲0.183的線性迴歸要好得多,而在樣本外,MSE爲0.259比線性迴歸MSE爲0.187的線性迴歸差得多。隨機森林過分訓練,在生產中表現不佳!
in-sample
rf mse 0.04 ols mse 0.183
out-sample
rf mse 0.261 ols mse 0.187
6. 樣本外測試不正確:對整個數據集應用預處理
強大的模型可能會過分訓練。過分訓練意味着它在樣本內表現良好,但在樣本外表現不佳。所以,你須要意識到訓練數據會泄漏到測試數據中。若是不當心,不管什麼時候進行特徵工程或交叉驗證,訓練數據均可能滲入測試數據,並提升模型性能。
對策:確保有一個沒有任何來自訓練套件的泄漏的測試套件,特別要注意生產使用中可能出現的任何依賴時間的關係。
案例:這種狀況常常發生。預處理將應用於完整的數據集,而後將其拆分爲訓練和測試,這意味着你沒有真正的測試集。在將數據分紅訓練集和測試集後,預處理須要單獨應用,以使其成爲真正的測試集。
在這種狀況下,兩種方法之間的均方偏差(混合樣本外變異係數均方偏差0.187與真實樣本外變異係數均方偏差0.181)並沒有太大差別,由於訓練和測試之間的分佈特性並沒有太大差別,但狀況可能並不是老是如此。
mixed out-sample CV mse 0.187 true out-sample CV mse 0.181
7. 錯誤的樣品外測試:橫截面數據和麪板數據
你只須要學會交叉驗證。sklearn甚至提供了一些能夠檢測全部數據箱的的便利功能。可是大多數交叉驗證方法都是隨機抽樣的,因此你可能會在測試集中獲得提升性能的訓練數據。
對策:生成測試數據,以便它準確地反映實際生產中進行預測的數據。尤爲是對於時間序列和麪板數據,可能須要生成自定義交叉驗證數據或進行提早滾動測試。
案例:這裏有兩個不一樣實體(如公司)的面板數據,它們在橫截面上高度相關。若是隨機分割數據,則使用測試期間實際上不可用的數據進行精確預測,從而誇大模型性能。你認爲經過使用交叉驗證能夠避免錯誤5,而且發現隨機林在交叉驗證中的性能比線性迴歸好得多。可是,運行一個前滾樣本測試,以防止未來的數據泄漏到測試中,它會再次表現得更糟!(隨機森林MSE從0.047變爲0.211,高於線性迴歸!)
normal CV
ols 0.203 rf 0.051
true out-sample error
ols 0.166 rf 0.229
8. 不考慮決策時有哪些數據可用
在生產中運行模型時,會獲得運行模型時可用的數據。這些數據可能與訓練時中假設的數據不一樣。例如,數據可能會延遲發佈,所以在運行模型時,其餘輸入已經更改而且用了錯誤的數據進行預測,或者真實的y變量不正確。
對策:作一個滾動樣本前向測試。若是在生產中使用過這個模型,訓練數據會是什麼樣的,即有什麼數據能夠作出預測?這是用於進行真正的樣本外生產測試的訓練數據。此外,考慮一下是否對預測採起了行動,在決策時又會產生什麼結果?
9. 微妙的過分訓練
花在數據集上的時間越多,則越有可能過分使用它。由於一直在修改特性和優化模型參數。因爲使用了交叉驗證,因此結果必然是好的。
對策:完成模型的構建以後,請嘗試找到另外一個數據集的「版本」,該版本能夠替代真正的輸出示例數據集。若是你是經理,故意保留數據,這樣它們就不會被用於訓練。
案例:將在數據集1上訓練的模型應用到數據集2上,MSE則增長了一倍多。它們仍然能夠被接受嗎?這是一個判斷的機會,可是從第四點獲得的結果可能會幫助作出決定。
first dataset
rf mse 0.261 ols mse 0.187
new dataset
rf mse 0.681 ols mse 0.495
10. 「須要更多數據」的謬論
圖片來源:unsplash.com/@franki
與直覺相反,開始分析數據的最佳方式一般是對數據的表明性樣本進行處理。這使你夠熟悉數據並構建數據管道,而無需等待數據處理和模型培訓。可是數據科學家彷佛不喜歡這個觀點——越多數據越好。
對策:從一個小的具備表明性樣本開始,看看你能不能從中獲得一些有用的東西。若是把它還給最終用戶,他們會用嗎?它能解決真正的痛點嗎?若是沒有,問題可能不是數據太少,而是方法不對。
github傳送門:https://github.com/d6tdev/top10-mistakes-statistics-binder
交互式筆記本:https://gke.mybinder.org/v2/gh/d6tdev/top10-mistakes-statistics-binder/master?filepath=visualize.ipynb
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)