阿裏大航杯AI電力大賽比賽分享及數加平台,機器學習pai使用經驗
1. 背景
本文以阿裏大航杯AI電力大賽為背景,講述數加平台及機器學習pai的使用。大賽聚焦電力市場營銷活動業務難點——企業用電需求預測,開放了揚中市高新區1000多家企業的曆史用電量數據,要求參賽者通過模型算法精準預測該地區下一個月的每日總用電量。
2. 數據介紹
本次競賽主要數據源為企業用電量表Tianchi_power2,阿裏雲抽取了揚中市高新區的1000多家企業的用電量(數據進行了脫敏),包括企業ID(匿名化處理),日期和用電量。具體字段如下表:
考慮到天氣對企業用電量的影響,同時也提供了天氣數據。具體字段如下:
其中dt 字段表示日期,temperature_bigh字段表示當天最好溫度,temperature_low字段表示當天最低溫度,weather字段表示天氣情況,wind_direction字段表示風向,wind_direction字段表示風級。
通過對數據觀察發現節假日對用的量的影響非常大,於是加入了節假日特征及季節特征。
第一季數據下載:競賽數據
3 解決方案概述
本賽題提供了企業用戶每天的用電量,記錄的時間區間是2015.01.01至2016.11.30,需要預測的是2016年12月份企業用戶每天的用電總量。通過分析用戶的用的量,我們發現174,175,1416三家企業每天的用電量比較高,三家用電總和約為總電量的1/2,其中1416一家用電約占總用電量1/4,我們首先根據用戶id,將以上三家劃分出來,然後提取了用戶相關的特征、天氣相關的特征,節假日相關的特征。針對全部企業用電及劃分的企業用電,最後訓練了XGBoost(最後未使用),4個GBDT(每份)進行模型融合。
3.1特征工程
比賽過程中使用的特征:
企業用電量特征:
Record_date,power_consumption,year,month,day,dow,mean_1,d_max_1,d_min_1,d_median_1,mean_2,d_max_2,d_min_2,d_median_2,mean_avg,mean_dist,d_max_avg,d_max_dist,d_min_avg,d_min_dist,d_median_avg,d_median_dist,row_n
天氣特征(僅使用了溫度特征):
tem_h,tem_l,tem_avg,tem_dist
節假日季節特征:
season,holiday
特征提取使用的是ide,提取步驟如下:
1.在左邊首先選擇任務開發-->自己建立的文件夾(有多位隊員可以創建自己的文件夾,方便使用)-->右擊新建任務(這裏使用的ODPS_SQL,因為sql最容易上手)-->鍵入腳本名稱即可。
2.在編輯框中,編輯自己的sql語句(建表時注意不要與隊友所建表名稱一致,否則將無法更新表中字段,這裏係統是不提示表名是否重複的),然後運行即可。
特征提取的全部sql語句(sql):特征提取
在使用ide過程中,可以在函數管理選項中,查看可以使用的函數及使用方法
可以在表查詢選項中可以查看已經創建的表(自動同步在機器學習pai平台創建的表):
3.2模型的設計及融合
通過分析174,175,1416企業,對174號企業短時間用電較為穩定,博主直接使用了上個月均值作為預測值(短期mae為4k左右);對175號企業訓練4個gbdt模型,然後使用勝者通吃策略融合模型(mae為10k左右);1416號企業用電較為異常很難使用模型準確預測,同時對總的用電影響較大,為減少誤差,使用15年12月數據加上66000(16年11月均值與15年12均值差值的1/2);對剩餘企業使用4個gbdt模型預測,對預測值求和最為最終預測值。然後對整體全部企業的用電總和使用4個gbdt模型預測。最後,對兩組預測值使用0.65,0.35的權值融合。
模型的設計主要在機器學習pai上完成,建立步驟如下:
Gbdt模型的訓練及數據預測
- 實驗的創建:
在首頁中可以選擇從已有實驗的模板創建也可新建空白實驗,本實驗選擇新建空白實驗:
上傳節假日數據:
然後添加字段:
按照下圖方式,讀取數據表:
使用與讀取數據表同樣的方式,拖拉所需控件。本實驗中訓練所用結構圖如下:
其中sql腳本是為了剔除過年一段時間的數據,語句如下:
select record_date, power_consumption, year, month, day, dow, mean_1, d_max_1, d_min_1, d_median_1, mean_2, d_max_2, d_min_2, d_median_2, mean_avg, mean_dist, d_max_avg, d_max_dist, d_min_avg, d_min_dist, d_median_avg, d_median_dist, tem_h, tem_l, tem_avg, tem_dist, row_n, holiday, season from ${t1} where record_date<='2016-01-30'or record_date>='2016-02-19'
gbdt的訓練參數(4個模型僅在樹的數量,學習率,最大葉子樹,樹深進行了微調):本實驗gbdt預測部分如下:
對四個模型的預測結果融合部分sql語句:
select concat(year,'/',month,'/',day) as predict_date, (prediction_a+prediction_b+prediction_c+prediction_d)/4 as power_mean, prediction_a, prediction_b, prediction_c, prediction_d from ${t1} ; select predict_date, (case when abs(prediction_a-power_mean)<abs(prediction_b-power_mean) and abs(prediction_a-power_mean)<abs(prediction_c-power_mean) and abs(prediction_a-power_mean)<abs(prediction_d-power_mean) then prediction_a when abs(prediction_b-power_mean)<abs(prediction_a-power_mean) and abs(prediction_b-power_mean)<abs(prediction_c-power_mean) and abs(prediction_b-power_mean)<abs(prediction_d-power_mean) then prediction_b when abs(prediction_c-power_mean)<abs(prediction_a-power_mean) and abs(prediction_c-power_mean)<abs(prediction_b-power_mean) and abs(prediction_c-power_mean)<abs(prediction_d-power_mean) then prediction_c when abs(prediction_d-power_mean)<abs(prediction_a-power_mean) and abs(prediction_d-power_mean)<abs(prediction_b-power_mean) and abs(prediction_d-power_mean)<abs(prediction_c-power_mean) then prediction_b end) as prediction from ${t1};
Xgboost 模型的訓練及預測 使用pai命令在IDE中實現,參數設置參照gbdt,pai命令如下:drop table if exists xgb_pred_1; DROP OFFLINEMODEL IF EXISTS xgboost_1;
-- train
PAI
-name xgboost
-project algo_public
-Deta="0.01"
-Dobjective="reg:linear"
-DitemDelimiter=","
-Dseed="0"
-Dnum_round="3500"
-DlabelColName="power_consumption"
-DinputTableName="tianchi_power_sum_min_input_1"
-DenableSparse="false"
-Dmax_depth="8"
-Dsubsample="0.4"
-Dcolsample_bytree="0.6"
-DmodelName="xgboost_1"
-Dgamma="0"
-Dlambda="50"
-DfeatureColNames="year,month,day,dow,holiday,season,mean_1,d_max_1,d_min_1,d_median_1,mean_2,d_max_2,d_min_2,d_median_2,mean_avg,mean_dist,d_max_avg,d_max_dist,d_min_avg,d_min_dist,d_median_avg,d_median_dist,tem_h,tem_l,tem_avg,tem_dist,row_n"
-Dbase_score="0.11"
-Dmin_child_weight="100"
-DkvDelimiter=":";
-- predict
PAI
-name prediction
-project algo_public
-DdetailColName="prediction_detail"
-DappendColNames="year,day"
-DmodelName="xgboost_1"
-DitemDelimiter=","
-DresultColName="prediction_result"
-Dlifecycle="28"
-DoutputTableName="xgb_pred_1"
-DscoreColName="prediction_score"
-DkvDelimiter=":"
-DfeatureColNames="year,month,day,dow,holiday,season,mean_1,d_max_1,d_min_1,d_median_1,mean_2,d_max_2,d_min_2,d_median_2,mean_avg,mean_dist,d_max_avg,d_max_dist,d_min_avg,d_min_dist,d_median_avg,d_median_dist,tem_h,tem_l,tem_avg,tem_dist,row_n"
-DinputTableName="tianchi_power_sum_min_output_2"
-DenableSparse="false";
select * from xgb_pred_1;
同樣訓練4個xgboost模型,在pai下進行結果融合(Tip:ide下與pai下的數據表是同步的):
其中的Sql語句與gbdt融合所用語句一致。
在使用pai的過程中有什麼疑問可以查看幫助文檔:
總結
在pai界麵中,IDE下具有與pai同樣的功能,並且數據是同步的,但pai下有更好的可視化效果,可根據自己的喜好自行選擇。
致謝
作為一名天池新手,第一次參加阿裏雲的天池競賽,成功的被比賽給吸引了,在比賽的這一個月的時間裏收獲頗多,認識了好多大神,還有阿裏雲的師兄們感謝你們的幫助。本想最後一天放大殺器,沒想到大家都提高了那麼多,感覺像是參加了假比賽,遇到了假數據(笑哭)。最後貼上我們的成績。
最後更新:2017-07-21 17:32:40