天天看點

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

不知道看完前三篇的人裡面,有沒人真正操作過一遍,然後去智慧中國杯的官網送出結果的。如果有的話,說明你是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 周末由您選”轉發到您的朋友圈後,将分享成功的截圖發送至郵箱[email protected]即可獲得,先到先得哦!

往期精彩文章:

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

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

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

版權聲明:本文為CSDN部落客「weixin_33717117」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33717117/article/details/92375930