2018.3.20號左右,因為研究生的數據挖掘課程的老師要求我們集體參加一個比賽 ,所以在比賽參與時間、比賽難度和比賽類型的幾種條件下,我們選擇了2018平安產險數據建模大賽-駕駛行為預測駕駛風險比賽,這個比賽是由平安保險公司提供數據,借由DataFoundation和CCF聯合平台舉辦的賽事。參加比賽一共兩個月,因為是初次參加參賽,加上投入的時間不夠,所以結果不是很好。但是這次經驗是為了下個學期再參加比賽積累,所以特此總結一個整個比賽過程,反省一下。
比賽數據、比賽過程記錄、比賽代碼都已經上傳到github 地址https://github.com/20130353/pingan_competition.git,方便隨時回顧。
比賽中存在問題
- 沒有驗證線上和線下數據是否一致。
比賽最開始的時候,因為時間不夠,臨時分析了一下數據。但是這次比賽不一樣的是,有線上和線下數據的區別,我們只分析了線下數據,完全沒有考慮線上數據。作為數據分析人員,做比賽的時候我們必須要充分了解數據特性和數據分布,同時需要打比賽的時候要確定線上和線下數據是否一致。並針對結果進行不同的處理。當然很多時候線上數據和線下數據分布應該是一樣的,因為線下數據是從線上數據中隨機抽取的一部分。
- 沒有找對正確的訓練數據。
正如第一點所說,我們只分析了線下數據沒有分析線上數據,但是事實上比賽方只是把線下數據作為測試用例,真正的訓練數據和預測數據都在線上,所以我們一開始分析的只是測試用例,這對后面的數據挖掘完全沒有用。
- 沒有確定數據的范圍和缺失。
沒有確定數據的范圍和缺失也意味着沒有預處理,經過后來的預處理結果和沒有預處理的結果對比,發現經過預處理的結果效果提議提升0.01。所以最開始還是要預處理。
- 預處理方式選擇太多。
小組每個成員對於丟失數據的處理方式對不一樣,每個人有每個人的道理,但是事實上訓練數據達到百萬級別,丟失數據和錯誤數據的比例很小,不同的預處理方式影響很小,所以沒有必要考慮太復雜的預處理方式。同時考慮到這次比賽的平台計算要求,我們應該選擇代價的方式處理數據。所以這個問題告訴我們,預處理的方式不一定只考慮最后結果,要在軟件和硬件兩方面的考慮下,選擇最合適的方式。
- 代碼寫的太慢。
因為對python不熟,所以寫代碼非常慢,即使是有想法但是實現想法可能需要幾天甚至是幾個星期。
- 優化代碼時想的太多。
因為比賽平台的硬件條件很差,所以對時間和內存要求很大,我們在優化代碼方面耗時非常長,但是事實上是沒有必要的,一方面我們可以直接從網上找最簡單的方式優化代碼,另一方方面可以直接問同學,畢竟我們是一個班參加比賽,大家遇到的問題差不多,為什么不直接請教同學從而快速解決問題呢?當時我想問同學時,同組成員覺得這是別的同學的辛苦勞動成果,擔心人家是否會給我們,擔心很多問題,但是我覺得這只是個比賽,同學直接就是相互學習,沒有必要把競爭放到這里來,但是我仍然是在嘗試了很久之后才問同學的,中間耽誤了不少時間,所以我應該吸取教訓。以求在最短時間內解決問題,比賽就是要在最短時間內找到最好的結果。
- 沒有充分利用特征。
原始數據只提供了九個特征,所以我們得自己創造特征,我們找了很多資料創造了很多合理的特征,但是結果並不好,所以我們認為是特征的問題。但是有同學不斷實踐證明特征的結果搭配好的模型可以提醒效果。而我們從頭到尾只使用了一種模型,遇到結果不好,我們就認為是特征不好,否定了這些特征,這樣實際上浪費了這些特征的價值,同時也是浪費時間。
- 沒有充分利用python的工具包。
詳細地說就是眼界不夠廣,不知道很多現成的工具包,只知道sklearn的幾個基本工具包,但是sklearn里的模型都是很舊的模型,效果也一般。最近很多的xgboost、lightBGM等模型,就用模型的默認值就可以取得很好的效果。
- 寫的代碼總是有問題。
感觸很深的是代碼寫完之后經常是線下測試數據沒有問題,但是線上就出錯。寫代碼的時候完全沒有想過線上是否可行,每次等待在線測試幾個小時之后出bug了才知道,但是浪費幾個小時的時間。這也反映出自己寫代碼的不嚴謹性,所以以后要多考慮看看在提交。
值得借鑒的博客
在作比賽的過程中參考了很多有意義的博客,在這里mark一下,為后面作比賽做准備。
博客中重點要看的是:
整套流程博客 https://blog.csdn.net/guoxinian/article/details/73740746
天池比賽經驗總結 - https://segmentfault.com/a/1190000012084849
因為這兩篇博客的都包含整個流程,對剛開始做比賽的同學來說,這個具有很大的指導意義。其中天池比賽經驗的博客的實戰意義更好。
剩下的就是一些常規博客。
- 十分鍾搞定 - pandas https://www.cnblogs.com/chaosimple/p/4153083.html
- 正負相關分析博客 https://blog.csdn.net/kt513226724/article/details/79843073
- 基本信息可視化博客 https://blog.csdn.net/qq_24330285/article/details/80707504
- 缺失值處理 - https://blog.csdn.net/lujiandong1/article/details/52654703
- Xgboost 原理和實戰 - https://blog.csdn.net/sinat_22594309/article/details/60957594
- Xgboost 原理 - https://blog.csdn.net/sinat_22594309/article/details/60957594
- Xgboost 調參過程 - http://www.cnblogs.com/harvey888/p/7203256.html
- Xgboost 調參過程 - https://blog.csdn.net/han_xiaoyang/article/details/5266539
- Xgboost 調參經驗 - http://www.cnblogs.com/mfryf/p/6293814.html
- LGB 原理 - https://blog.csdn.net/niaolianjiulin/article/details/76584785
- LGB 參數速查 - https://blog.csdn.net/weiyongle1996/article/details/78446244
值得堅持的習慣
在比賽過程,我養成了記錄文檔的習慣,同時又將文檔分成python學習記錄文檔、比賽過程記錄兩個文檔,我覺得這樣記錄有助於幫助思考和記錄過程,有時候因為研究生學業太忙一段時間沒有做比賽就會忘記做到哪里了,需要話很長時間來回憶,有文檔之后可以直接查文檔,而且文檔的時候會有源源不斷的新想法冒出來,幫助擴展想法。
但是有個問題是,我是將比賽結果記錄和想法記錄記錄寫在一起的,有時候要看自己的比賽結果就很不方便,所以下次作比賽需要把想法和結果單獨分開來寫。