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):特征提取
Tips:
在使用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)when abs(prediction_b-power_mean)when abs(prediction_c-power_mean)when abs(prediction_d-power_mean)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下有更好的可视化效果,可根据自己的喜好自行选择。
致谢
作为一名天池新手,第一次参加阿里云的天池竞赛,成功的被比赛给吸引了,在比赛的这一个月的时间里收获颇多,认识了好多大神,还有阿里云的师兄们感谢你们的帮助。本想最后一天放大杀器,没想到大家都提高了那么多,感觉像是参加了假比赛,遇到了假数据(笑哭)。最后贴上我们的成绩。