智慧中國杯百萬大獎賽解讀 |今天你打怪了嗎(四)

openfea發表於2016-12-30

不知道看完前三篇的人裡面,有沒人真正操作過一遍,然後去智慧中國杯的官網提交結果的。如果有的話,說明你是FEA的真粉絲,我們應該支援你,同時你肯定也很沮喪,因為提交的結果不知道排到哪裡去了(150名以內找不到)。

不要沮喪,不要灰心,前面三篇只是開胃菜,真正的大餐在這裡,看完這篇包你能進前50強。

什麼才前50?。。。

不錯了,官方開源的一份程式碼你照做的話,基準得分是0.023,現在大概是100名開外。看完本篇應該得分是0.0259x的樣子,最後的提高還是有難度的,需要智力和體力的結合,只要你每天堅持打怪升級(提交結果),你的成績一定會提升的。

榜單重新整理的很快的,不進則退哦!

好了,廢話不多說,我們正式開始機器學習的優化之旅。

第一部分優化路徑

1、概述

結合本人的經驗,繪製了一個大致做機器學習工程的方法,如下圖:

接到一個專案或任務後,結合專案的需求和背景,對資料進行有針對性的探索,然後再評估資料樣本是否不平衡,需要對資料重取樣等處理,並能給出主要的維度資訊出來。

接下來就可以精心於初步的演算法選擇和引數的確定,結合專案需求和自身對演算法的瞭解程度來進行選擇,沒有唯一答案,一定要善於突破。

然後就可以進行訓練評估,結果還基本滿意就可以進入深入分析資料不斷增加和變換維度上來,維度的選擇對模型的成功起至關重要的作用。

當你實在沒有新的維度增加時,可以考慮通過微調引數,看能不能提高模型的準確率,這時也一定要注意過擬合的問題,以免實驗結果很好,一旦進入實際應用就不行的怪圈當中,最後固話模型。

還是那句話,這是腦力和體力的結合,堅持每天打怪升級,你可以的!

2、重取樣

因為樣本資料的不均衡性,勢必會導致分類結果的傾斜,導致準確率虛高(比如都預測資助為0)。本次的樣本中,得到資助的只佔15%左右,如果不對資料進行過取樣的話,勢必影響訓練的結果。

這時我們可以使用重取樣的方式來平衡訓練資料,重取樣又分為兩種:

過取樣就是重複增加一部分小分類的樣本資料;

欠取樣就是刪除一部分大分類的樣本資料。

我們的樣本總數不多,所以通過過取樣的方式,在訓練資料中增加小分類的資料,來達到均衡的目的。

#過取樣

t1 = filter a by (money==1000)

t15 = filter a by (money==1500)

t20 = filter a by (money==2000)

#增加5倍

a = @udf a,t1 by udf0.append_df with 5

#增加8倍

a = @udf a,t15 by udf0.append_df with 8

#增加10倍

a = @udf a,t20 by udf0.append_df with 10

原始的訓練資料分佈


過取樣後的資料分佈


這個5,8,10是經驗值,到最後的時候都可以進行微調。

3、演算法選擇

演算法的選擇對於初學者來說是一個障礙,因為演算法實在太多了,想把每一個演算法的每一個細節都吃透,往往是徒勞的。這就是好多人的一個疑惑,我要搞機器學習搞人工智慧,是不是先要去念個博士?都說股票市場是經濟的晴雨表,說明股票和經濟是有很大關係的,那你有沒聽說哪個人為了炒股,先去讀個經濟學博士的。

不要躊躇千里不敢邁出一步,機器學習重在實幹,對演算法不全瞭解不要緊,你可以選擇一到兩個重點突破,其他的知道就行,真到用時再去深鑽。

而真正在工程實踐中,可以選擇複合型的演算法,如GBDT和隨機森林,它們都是有多棵決策樹組成,對結果進行多次迭代,效果更好。在多次大賽中都看到他們的身影。我還是給大家推薦幾個演算法,對於初學者可以先看決策樹,這個演算法比較簡單且是個白盒演算法,就是你建好模型後,可以將整個決策樹圖形展示出來,找到每個分支的邊界,特別適合那些喜歡較真的同學。^V^

4、引數優化

引數優化是個大命題,這裡同樣以GBDT和隨機森林為最常用的有:n_estimators(子模型數量),random_state(隨機物件)等。子模型數量越大精度會越高,但有可能造成過擬合,預測時反而效果不好;隨機物件對預測結果影響很小,根據自己的喜好先設定一個。

初步選擇如下:

#GBDT

model = @udf a,b by ML.gbdt with (n_estimators=200,random_state=2016)

#隨機森林

model = @udf a,b by ML.rf with (n_estimators=500,random_state=2016)

5、維度選擇

經過前面幾步之後,剩下最重要的就是基於業務的理解,做出好的維度特徵資料來,這是一個模型能夠成果的關鍵。

上篇文章中,只使用了消費資料的維度,並沒有成績,圖書館,教室等維度,這些資訊對於提升準確率也是有用的。

成績的維度

#裝載成績資料

score = load csv by $train_path/score_train.$efile with (header=-1)

rename score as (0:"id",1:"college",2:"order")

score1 = load csv by $test_path/score_test.$efile with (header=-1)

rename score1 as (0:"id",1:"college",2:"order")

score = union score,score1

#學院排名最大

sgt = group score by college

sgt_max = agg sgt.order by max_order:max

sgt_max = @udf sgt_max by udf0.df_reset_index

score2 = @udf score,sgt_max by udf0.df_ljoin with (college,college)

#排名比值

score2 = add real by (score2['order'] / score2['max_order'])

圖書館進出的維度

#裝載圖書館進出資料

lt = load csv by $train_path/library_train.$efile with (header=-1)

lt1 := load csv by $test_path/library_test.$efile with (header=-1)

lt = union lt,lt1

rename lt as (0:"id",1:"gate",2:"time")

#以人為單位,計算圖書進出的維度

lt_count = @udf lt by udf0.df_agg_count with (id)

lt_count = @udf lt_count by udf0.df_reset_index

rename lt_count as ("index":"id","count":"lt_count")

宿舍進出的維度

#宿舍進出資料

dt = load csv by $train_path/dorm_train.$efile with (header=-1)

dt1 := load csv by $test_path/dorm_test.$efile with (header=-1)

dt = union dt,dt1

dt = rename dt as (0:"id",1:"time",2:"isout")

#以人為單位,計算宿舍進出的維度

dt_io_count = @udf dt by udf0.df_agg_count with (id)

dt_io_count = @udf dt_io_count by udf0.df_reset_index

rename dt_io_count as ("index":"id","count":"io_count")

dt_in = filter dt by (isout==0)

dt_in_count = @udf dt_in by udf0.df_agg_count with (id)

dt_in_count = @udf dt_in_count by udf0.df_reset_index

rename dt_in_count as ("index":"id","count":"in_count")

dt_count = join dt_io_count,dt_in_count by id,id

第二部分注意事項

在整個維度計算和選擇的過程中,我也發現了幾個好玩的事情,給大家介紹一下,避免大家重新跳到坑裡面去。

1、學生ID

在剛做這個系列的時候,我就一直和官方提供的開源程式做對比,明明我的維度比之前要多要好,但在成績上就是沒有超過官方的。最後經過我仔細的排查才發現少了一個我一直認為和這個預測沒有關係的學生ID。

這個ID是從0開始,顯然是經過脫敏處理的,但按照什麼樣的規則我們並不清楚,但不要少了這個維度,他可能包含了某方面的資訊,加上這個維度後我就徹底超過了官方提供的基準成績。

2、成績資料要訓練和測試集合並後再分拆

本次競賽的資料直接分成了訓練和測試資料,如果沒有交集是沒必要合併後才分拆的。但成績資料只有排名,如果不合並,你根本不知道這個排名的意義,所以要合併起來,找出最大值,計算每個人的排名比值(自身排名/最大排名),然後再根據預測人資料進行分拆。這裡麵包括了學院ID等資訊,都對預測有影響。

3、不是所有維度都是積極的

我講了維度很重要,維度的質量和多少都很關鍵,一般意義上來講有效維度越多越好,但維度並不是都是積極向上的,有些維度的引入反而會帶來消極作用,影響你的成績。

在第二篇的《學霸去哪了》文中我分析了深夜出入宿舍的維度,我就沒多想,直接加入進行訓練了,結果反而導致成績大幅下降。看來深夜出入宿舍的維度和資助關係不大,至少和本次的資料關係不大。

所以大家在選擇維度時,也要精心考慮設計過。

第三部分小結

通過本文的詳細解讀,精準教育資助的這個話題就告一段落了,下一篇將開啟金融使用者貸款風險預測的解讀。

喜歡這個系列的朋友不要忘記給我點贊哦,你的支援是我更新的最大動力。

哦!再次重申一下,需要完整程式碼的朋友請關注我們的微信公眾號openfea,傳送關鍵字“fea”,將微信自動回覆的文章“OpenFEA一次學個夠,全程 or 週末由您選”轉發到您的朋友圈後,將分享成功的截圖傳送至郵箱fea@hzhz.co即可獲得,先到先得哦!

 

往期精彩文章:

智慧中國杯演算法賽解讀 | 精準資助資料探索(一)

智慧中國杯百萬大獎賽解讀 | 學霸去哪了(二)

智慧中國杯百萬大獎賽解讀 | 精準資助機器學習(三)

相關文章