關於機器學習(數據科學)競賽的一些小思考

十一月底到十二月中旬的這一段時間參加了京東舉辦的京東金融信貸需求預測競賽,致使那段時間我都沒有好好準備考六級:),當然有可能好好準備了還是過不了的:);雖然六級沒有好好準備,但是我競賽也沒好好做呀:),所以成績最終排名到50幾名了,本也沒臉寫什麼經驗分享,而且決賽都結束10天了;但是不總結一下吧,感覺不利於進步,所以打算把這個總結當做汲取經驗教訓,同時也分享給其他想參加競賽的同學,做一點微小的貢獻。

因為我的層次呢只有這麼點高,可能只適合那些不知機器學習是何物,競賽baseliine都不知怎麼寫的同學參考;歡迎有經驗的大佬隨時指點我的不足之處,點撥一下我- -。

這個信貸需求預測的競賽應該算是我正式的參加的第一個競賽吧,之前玩過一些小比賽,限於能力有限也只是隨便寫個baseline提交就不管了。最後發現如果真的要認真去參加比賽的話,真的是太耗時間太耗精力了,這個過程真是太虐心了。畢竟這是一個實際業務場景,京東公司里可能都有一個小組專門花時間來研究,靠自己單打獨鬥要做好可見還是挺難的。當然如果認真去做的話,能學到的東西也很多,比如和其他選手的交流,自己置身在實際業務場景去解決實際問題,這不是從書上能學習到的;而且另一方面因為競爭意識,我又不得不去對之前學習的知識去再一次仔細再學習一遍,以便藉助對演算法的更深入的理解來改進模型,比如在參加競賽的階段我仔細研讀了XGBoost,lightgbm演算法系統,也寫了兩篇文章發在這個專欄;另外通過比賽也深刻的認識了自己的不足之處,為以後的學習找到一些方向。所以說參加這個競賽還是有一些收穫的。

對於機器學習競賽所需要的知識做一個優先順序的,或者說你最先應該掌握的知識,做一個排序的話,我覺得應該這樣排:

  1. 機器學習任務的基本概念理解(比如回歸,分類,排序的應用場景;特徵的概念,等)
  2. 編程語言的基本知識(比如Python)
  3. 數據處理和科學計算的庫(比如NumPy,pandas)
  4. 機器學習演算法庫(比如sklearn)
  5. 競賽所選擇演算法的原理(比如xgboost)
  6. 競賽題目中的業務邏輯知識(比如信貸業務)
  7. 對數據的敏感性(能分辯哪些數據有用,哪些沒用)
  8. 機器學習領域知識的綜合能力(比如能熟練運用各種演算法模型做融合,根據任務修改、創造演算法)

理解第1點就等於確定了你所需要解決的任務的方向,方向至關重要,方向不對,後面所做的一切都將白做。以信貸需求預測這個場景為例,題目給定的任務是一個回歸預測,也就是訓練模型預測每一個用戶在12月份的貸款金額;但是經過分析,我發現總共90000多個用戶,而每個月只有20000左右的用戶會貸款,其他用戶都不會貸款;將這些用戶的貸款金額畫一個分布圖如下所示:

11月份19520個用戶的貸款金額分布示意圖

對於有貸款行為的用戶,他們的貸款金額分布大致符合正態分布。

11月份19520個用戶的貸款金額升序排列

從上圖來說貸款用戶的貸款金額基本上可以用線性模型就可以很好的擬合了。因此可以說對於貸款的用戶確實很適合做回歸預測。然而任務是要預測所有90000多個用戶的貸款需求,那麼把所有用戶的貸款金額分布畫出來再看一下。

所有90993個用戶在11月的貸款金額分布

可以看到大部分貸款金額是0,他們的分布可以說非常不適合全部拿來做回歸預測;憑著這個分析我想當然的以為可以先做一個二分類,先把會貸款和不會貸款分出來,然後對會貸款的用戶做一個回顧預測,這樣想可以說很完美了,然而事實卻是,由於數據有限,分類準確率一直很低,而如果分類第一步都做不好,後面的回歸也是扯淡了。所以做用戶分類浪費了很多時間精力,這都是因為沒有理解第1點所導致的。而且題目的排名計算準則是RMSE最小化,題目描述里也明確說了「開展信貸業務除了評估用戶風險之外,還需要預測用戶的借款需求,只有儘可能的給有借款需求的用戶分配合適的額度才能最大限額的增加資金利用率,降低成本並增加收益」,所以任務的本質並不是預測具體哪個用戶要貸款哪個用戶不要貸款,也不是具體某個用戶要貸款多少,而是要在總體水平上預測公司要在下一個月往信貸業務這個資金池裡準備多少現金才能最大限額的增加資金利用率、降低成本並增加收益,資金池裡現金放多了影響資金利用率,放少了不能滿足借款需求從而收益減少。所以本質上只需要通過已有數據來預測下月的總借款需求,對所有用戶都是用回歸預測,將所有用戶的貸款金額加起來就是總的需求啊,問題就解決了。

因此,對於信貸需求預測這個場景,我們可以很堅定的使用回歸模型,不要再花精力做什麼分類了。


對於第2,3,4點,這是能保證你寫出baseline的前提,即使你不懂任何機器學習演算法,你只是剛接觸入門,但是也足以寫一個初級版本的競賽代碼,然後提交結果了。第2,3點保證你能將各類原始數據處理成訓練模型所需要的數據形式,第4點很簡單,調用API就夠,剛開始甚至都不需要調參數,直接使用默認參數就好。很多人都說機器學習就是調參,但是我覺得大部分人還達不到調參的地步;倒不如說機器學習就是處理數據(提特徵)更為貼切,當你到了調參這一步時,你的工作也差不多做完了。

以這個信貸需求預測競賽為例,講一下它的數據是怎樣的。先看看給的數據:

給的數據包含5張表,每張表列數比較少,行數從幾萬行到一千萬行不等;這樣的數據和我們在一些機器學習的課堂上所看到的數據不同,通常我們學習演算法所用的數據都是很完美的數據,你只要劃分一下訓練集,驗證集,測試集就行,然後將數據做一些基本的歸一化等處理再輸入演算法介面,等待結果就行。然而看看這5張表,我們要如何動手把這些數據輸入演算法介面呢?

仔細觀察一下這些表,可以看到每張表都有uid這列,也就是用戶ID,我們可以通過用戶ID將所有表進行拼接組成一張表,然後做一些處理;這裡的工作使用pandas基本可以搞定。然而直接拼接就行了嗎?我們看一下每張表都有一些列,我們可以將這些列都看訓練樣本的屬性,也就是特徵,加起來也有10幾個特徵了,然而就這些特徵夠了嗎?顯然不夠,顯然也沒有這麼簡單,所以這裡就涉及特徵工程了。

數據和特徵工程決定了機器學習的上限,演算法模型只是用來逼近這個上限而已。

時刻謹記上面的機器學習信條,去做特徵工程吧!


第6,7點,為什麼要理解數據,理解業務邏輯?因為這能讓我們更好的取做特徵啊。我們看看上述表格,基本上都是有時間這一列的,而且我們的任務目標是通過8,9,10,11月的用戶借款歷史記錄,購買行為記錄,用戶點擊行為記錄,用戶固有屬性記錄去預測12月份的借款需求,這明顯涉及到時間序列問題。所以有經驗的人自然一開始僅使用歷史借款記錄的那張表,然後使用時間滑動窗口去自動提取特徵就能取得不錯的成績;而我,直到比賽後期才知道原來還有這樣的操作。。

另外,每個用戶的行為都是和時間有關的,每個時間段他的行為都有所區別,這也是有些用戶在這個月借款了在下個月可能又不會借款,隨著時間的移動,用戶的借款需求也是不同的,所以他的一些行為也是變動的,這些不同時間段的不同行為使得不同用戶(不同訓練樣本)具有唯一性,但是我們機器學習就是去學習一些數據分布,如果所有用戶的分布沒有共性,只有個性,那麼學習到的模型又怎麼能去預測其他用戶呢?因為每個用戶都是獨一無二的,預測是不可能的。所以除了找到用戶的個性特徵之外,我們還需要找到用戶和用戶之間的共性,只有這樣,機器學習的模型才可以通過這些共性去預測其他用戶樣本。那麼什麼是共性?這裡就用到統計特徵了,用戶在某個時間點可能行為各不相同,但是在某個時間段的行為卻是相關的,比如,在同一個星期張三星期1,3,5借款了,李四星期2,4,6借款了,那麼他們在這一周內的借款頻率,借款金額的平均值,總額,中間值,最大值,最小值,方差等是不是有可能一樣呢?這樣就找到共性了。

那麼業務邏輯有什麼用呢?

當然了解業務邏輯也是為了提特徵,上面講的時間滑動窗口特徵只是純粹從數字上去構建特徵的;對於一些具體的業務,我們也可以人為通過各列數據去生成一些有利於預測的特徵。比如借款業務,有借款就要有還款,通過借款金額和還款期數,我們可以構造每月的還款特徵;每個用都有一個借款限額,我們可以檢查用戶在某月的貸款金額是不是超過限額了從而構造特徵;等等。


第7點,對數據的敏感性。

有時候我們的數據很亂很臟,並不是所有數據都是有利於我們的模型構建,另外往往存在一些缺失值和異常值,以及訓練集合測試集分布不一致的數據。因此我們有必要對數據進行檢查,排除不好的數據,保留好的數據;這個就需要一些統計學知識了,更需要有對數據的敏感性認知。下面以正在進行的天池AI智能製造競賽這個數據具體提出一些問題供大家參考。

天池AI智能製造這個競賽我是前兩天才正式看數據動手寫代碼的,目前寫了2個版本的baseline,排名top95/1952(估計明天就掉出100名了,因為昨天我還是71.。看來還是有挺多大牛往上沖啊)

我們看看數據:

這個比賽的數據有8027個屬性,但訓練集只有500個樣本,線下甚至可以隨便丟特徵選特徵,線下成績都不會太差,因為毫無疑問肯定會過擬合。相比信貸需求預測的數據需要自己生成特徵不同,這個數據需要刪除特徵,就是降維,很多人想到PCA,然而PCA真的適合嗎?我們需要去看看數據和實際進行試驗。

看上圖這個屬性,如果做異常值檢查,那麼取值300的可能被做異常值處理了,然而它真是異常值嗎?實際上它是這樣的:

那麼對於這樣的特徵如何處理呢?直接歸一化?

這樣的特徵又該如何處理呢?用線性模型時怎麼處理,樹形模型呢?

這樣的呢?

這樣的呢?訓練集和測試集分布很不一致,是直接丟掉還是做一些處理?

這個是異常值嗎?

等等情況,總之機器學習之前對數據進行分析是必不可少的,訓練好模型之後經過模型性能的反饋我們還需要回過頭來繼續分析數據,所以哪有機會給你調參呢?調參是前十名才需要做的吧……,所以至少如果你還沒沒有進入前二十,你都不需要去特意調參,選特徵要緊(一家之言)。。。

數據分析,數據與處理的帖子網上很多,隨便搜一下就有了,我就不多說啦。

對於機器學習競賽,如果有大佬看到這裡,歡迎指點指點我- -。。。。。閉門造車不可取,特別希望有高人指點,可能這就是環境和平台的缺陷吧,如果你身邊都沒有大牛,那你的水平天花板就只有那麼高了;所以讀書讀一個好大學是有多麼重要。。。當然也不是否定我湖,只是讀研了活動範圍窄接觸的人太少,能認識大牛的機會更少。。。。。。


文末做一個預告,說了要做一個總結,這篇文章只是泛泛而談,沒什麼乾貨,所以我會在最近幾天選一個下午直播擼代碼(免費參觀,普通話不標準,對口音敏感的慎重),參考別人的代碼的同時將這次比賽的代碼做一個重構。會講一些基本的數據處理和模型搭建,以及演算法原理吧,就是上面講到的第2,3,4,5,7點這些相關內容。將近2000行的代碼,重構加講解估計得要一個下午,所以這個直播質量節奏啥的不做保證,只是做一個記錄,有興趣的同學歡迎去圍觀,到時在QQ群里公布直播時間和平台網址,掃描下方二維碼進群。。

qm.qq.com/cgi-bin/qm/qr? (二維碼自動識別)

群里也上傳了信貸需求預測的數據文件,有興趣的同學可以下載下來去玩玩。


更新

本次競賽代碼重構視頻

京東金融信貸需求預測機器學習競賽--代碼重構_演講?公開課_科技_bilibili_嗶哩嗶哩www.bilibili.com圖標

重構代碼和原始代碼均上傳github

wangle1218/2017JDD--loan-forecastinggithub.com圖標
推薦閱讀:

網貸平台貸款數據分析
【APT報告】海蓮花團伙的活動新趨勢
快消與大數據:利用DataHunter制定異常庫存處理策略
為什麼現在那麼多妹子做數據分析師?我一個人帶4個妹子團隊壓力好大(><) 沒有性別歧視,只是好奇男的都跑哪去了?
你費那麼大勁做的數據分析,有用嗎?

TAG:机器学习 | Python | 数据分析 |