不知道看完前三篇的人裏面,有沒人真正操做過一遍,而後去智慧中國杯的官網提交結果的。若是有的話,說明你是FEA的真粉絲,咱們應該支持你,同時你確定也很沮喪,由於提交的結果不知道排到哪裏去了(150名之內找不到)。算法
不要沮喪,不要灰心,前面三篇只是開胃菜,真正的大餐在這裏,看完這篇包你能進前50強。微信
什麼才前50?。。。app
不錯了,官方開源的一份代碼你照作的話,基準得分是0.023,如今大概是100名開外。看完本篇應該得分是0.0259x的樣子,最後的提升仍是有難度的,須要智力和體力的結合,只要你天天堅持打怪升級(提交結果),你的成績必定會提高的。dom
榜單刷新的很快的,不進則退哦!機器學習
好了,廢話很少說,咱們正式開始機器學習的優化之旅。學習
第一部分、優化路徑測試
一、概述優化
結合本人的經驗,繪製了一個大體作機器學習工程的方法,以下圖:人工智能
接到一個項目或任務後,結合項目的需求和背景,對數據進行有針對性的探索,而後再評估數據樣本是否不平衡,須要對數據重採樣等處理,並能給出主要的維度信息出來。.net
接下來就能夠精心於初步的算法選擇和參數的肯定,結合項目需求和自身對算法的瞭解程度來進行選擇,沒有惟一答案,必定要善於突破。
而後就能夠進行訓練評估,結果還基本滿意就能夠進入深刻分析數據不斷增長和變換維度上來,維度的選擇對模型的成功起相當重要的做用。
當你實在沒有新的維度增長時,能夠考慮經過微調參數,看能不能提升模型的準確率,這時也必定要注意過擬合的問題,以避免實驗結果很好,一旦進入實際應用就不行的怪圈當中,最後固話模型。
仍是那句話,這是腦力和體力的結合,堅持天天打怪升級,你能夠的!
二、重採樣
由於樣本數據的不均衡性,勢必會致使分類結果的傾斜,致使準確率虛高(好比都預測資助爲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是經驗值,到最後的時候均可以進行微調。
三、算法選擇
算法的選擇對於初學者來講是一個障礙,由於算法實在太多了,想把每個算法的每個細節都吃透,每每是徒勞的。這就是好多人的一個疑惑,我要搞機器學習搞人工智能,是否是先要去念個博士?都說股票市場是經濟的晴雨表,說明股票和經濟是有很大關係的,那你有沒據說哪一個人爲了炒股,先去讀個經濟學博士的。
不要躊躇千里不敢邁出一步,機器學習重在實幹,對算法不全瞭解沒關係,你能夠選擇一到兩個重點突破,其餘的知道就行,真到用時再去深鑽。
而真正在工程實踐中,能夠選擇複合型的算法,如GBDT和隨機森林,它們都是有多棵決策樹組成,對結果進行屢次迭代,效果更好。在屢次大賽中都看到他們的身影。我仍是給你們推薦幾個算法,對於初學者能夠先看決策樹,這個算法比較簡單且是個白盒算法,就是你建好模型後,能夠將整個決策樹圖形展現出來,找到每一個分支的邊界,特別適合那些喜歡較真的同窗。^V^
四、參數優化
參數優化是個大命題,這裏一樣以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)
五、維度選擇
通過前面幾步以後,剩下最重要的就是基於業務的理解,作出好的維度特徵數據來,這是一個模型可以成果的關鍵。
上篇文章中,只使用了消費數據的維度,並無成績,圖書館,教室等維度,這些信息對於提高準確率也是有用的。
成績的維度
#裝載成績數據
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
第二部分、注意事項
在整個維度計算和選擇的過程當中,我也發現了幾個好玩的事情,給你們介紹一下,避免你們從新跳到坑裏面去。
一、學生ID
在剛作這個系列的時候,我就一直和官方提供的開源程序作對比,明明個人維度比以前要多要好,但在成績上就是沒有超過官方的。最後通過我仔細的排查才發現少了一個我一直認爲和這個預測沒有關係的學生ID。
這個ID是從0開始,顯然是通過脫敏處理的,但按照什麼樣的規則咱們並不清楚,但不要少了這個維度,他可能包含了某方面的信息,加上這個維度後我就完全超過了官方提供的基準成績。
二、成績數據要訓練和測試集合並後再分拆
本次競賽的數據直接分紅了訓練和測試數據,若是沒有交集是不必合併後才分拆的。但成績數據只有排名,若是不合並,你根本不知道這個排名的意義,因此要合併起來,找出最大值,計算每一個人的排名比值(自身排名/最大排名),而後再根據預測人數據進行分拆。這裏麪包括了學院ID等信息,都對預測有影響。
三、不是全部維度都是積極的
我講了維度很重要,維度的質量和多少都很關鍵,通常意義上來說有效維度越多越好,但維度並非都是積極向上的,有些維度的引入反而會帶來消極做用,影響你的成績。
在第二篇的《學霸去哪了》文中我分析了深夜出入宿舍的維度,我就沒多想,直接加入進行訓練了,結果反而致使成績大幅降低。看來深夜出入宿舍的維度和資助關係不大,至少和本次的數據關係不大。
因此你們在選擇維度時,也要精心考慮設計過。
第三部分、小結
經過本文的詳細解讀,精準教育資助的這個話題就告一段落了,下一篇將開啓金融用戶貸款風險預測的解讀。
喜歡這個系列的朋友不要忘記給我點贊哦,你的支持是我更新的最大動力。
哦!再次重申一下,須要完整代碼的朋友請關注咱們的微信公衆號openfea,發送關鍵字「fea」,將微信自動回覆的文章「OpenFEA一次學個夠,全程 or 週末由您選」轉發到您的朋友圈後,將分享成功的截圖發送至郵箱fea@hzhz.co便可得到,先到先得哦!
往期精彩文章: