大家好,我们是内部赛冠军混沌队,下面是关于第二赛季平台使用的攻略。希望能够帮助大家快速上手,熟悉环境,尤其是对于以前木有接触过御膳房的同学们。
1、登录参赛环境:御膳房,http://yushanfang.com/ (左上角请登录)
2、点击“我的资源”下对应的project,进入环境。
3、本次比赛中主要使用的有两部分:数据开发和算法平台。 点击“数据开发”进入,左侧分为:数据开发、模型设计、临时查询、手动任务、找数据、函数列表、数据服务、表管理、回收站。 其中,数据开发、临时查询、手动任务中均可写ODPS SQL,但数据开发主要用于线上任务提交、手动任务主要用于一次性线上任务提交无需调度,临时查询用于开发环境,好吧忘记上面的,同学们用在临时查询中新建查询选ODPS SQL就好,接下来就可以用SQL对数据进行各种处理,构建自己的特征体系了。(除此之外,找数据模块可以方便的查询表,函数列表模块有函数的介绍以及简单示例,类似Hive SQL)
4、下面简单列举几个常用语句吧
show tables;--查看project中的表
desc table_name;--查看table_name表的表结构
show partitions table_name;--查看当前表table_name的分区情况。
其他更详细的SQL使用方法参见数据开发工作台文档:http://ide.de.yushanfang.com/document.html#ide_doc
5、 从2中点击“算法平台”进入,然后点击加号新建实验。我认为本次比赛的题目可以看做一个回归问题或者时间序列问题,所以对于算法平台模型主要可以考虑使用GBDT回归和R脚本,其中GBDT回归注意设置:DminLeafSampleCount,并且控制DmaxDepth、DtreeCount,防止过拟合,本身GBDT更适合于大数据量的情况。此外R脚本中提供很多R的相关包可以使用:包的引入方式:library("包名"),内部赛复赛时提供的R包主要有:
特别提醒:R脚本必须至少有一个数据源(OPDS表),并且ODPS表在R脚本中是data.frame的形式。算法平台的详细使用手册见:http://yushanfang.com/portal/help/doc.html?spm=0.0.0.0.K2Nrc6&file=SuanFaPingTai
二、攻略之BaseLine代码
有了上面对御膳房平台的简单认识,接下来就开始构建你们的BaseLine吧,下面代码是从回归问题的角度去解,主要是为了引导同学们快速进入状态:1、算法平台,上传要预测的9月份30天的日期数据:可以通过R脚本以data.frame的形式写入到ODPS表中。(PS:test=c(20140901,20140902)默认元素类型是double而非int,所以需要在R中做as.integer(20140901)转换,此外必须制定一个ODPS源)PS:当然不能使用9 月份以及以后的数据,要符合当前的业务场景,不忘初心、方得始终!
R脚本代码:
2、开发平台,使用ODPS SQL构建特征(初级特征仅供参考):
3、
算法平台,训练模型并预测:这里使用R脚本的lm做线性回归模型。
R 脚本训练并预测申购:
R 脚本训练并预测赎回:
4、
合并申购、赎回结果并提交
三、攻略之总结体会
1、本次比赛还是很有价值的,体现了一个真实的业务场景。
2、我们更倾向于把赛题定义为一个回归问题或者时间序列分析问题。这两类方法做到极致都能取得不错的成绩。当然也鼓励同学们有更多的尝试。
3、注意大单的处理,注意特征的标准化,注意特殊日期的预测。
4、相信能进入复赛的同学对赛题已经有了较为深刻的理解,我们建议同学们要尽量尝试多种方法,然后选一个最有潜力的进行优化。
最后预祝同学们能取得更高的成绩,提出更多可以解当前业务问题的方法。Fighting!!
一、攻略之平台环境:
1、登录参赛环境:御膳房,http://yushanfang.com/ (左上角请登录)
2、点击“我的资源”下对应的project,进入环境。
3、本次比赛中主要使用的有两部分:数据开发和算法平台。 点击“数据开发”进入,左侧分为:数据开发、模型设计、临时查询、手动任务、找数据、函数列表、数据服务、表管理、回收站。 其中,数据开发、临时查询、手动任务中均可写ODPS SQL,但数据开发主要用于线上任务提交、手动任务主要用于一次性线上任务提交无需调度,临时查询用于开发环境,好吧忘记上面的,同学们用在临时查询中新建查询选ODPS SQL就好,接下来就可以用SQL对数据进行各种处理,构建自己的特征体系了。(除此之外,找数据模块可以方便的查询表,函数列表模块有函数的介绍以及简单示例,类似Hive SQL)
4、下面简单列举几个常用语句吧
show tables;--查看project中的表
desc table_name;--查看table_name表的表结构
show partitions table_name;--查看当前表table_name的分区情况。
其他更详细的SQL使用方法参见数据开发工作台文档:http://ide.de.yushanfang.com/document.html#ide_doc
5、 从2中点击“算法平台”进入,然后点击加号新建实验。我认为本次比赛的题目可以看做一个回归问题或者时间序列问题,所以对于算法平台模型主要可以考虑使用GBDT回归和R脚本,其中GBDT回归注意设置:DminLeafSampleCount,并且控制DmaxDepth、DtreeCount,防止过拟合,本身GBDT更适合于大数据量的情况。此外R脚本中提供很多R的相关包可以使用:包的引入方式:library("包名"),内部赛复赛时提供的R包主要有:
- ISOweek :日期处理
- timeDate:时间处理
- forecast :时间预测
- RandomForest:随机森林
- rpart:决策树
- e1071:svm算法
- tseries:时间序列
- glmnet:线性回归
- discretization:离散化
- cluster:聚类
- entropy:信息熵、互信息,用于特征选择。
- reshape:数据矩阵整形
- nnet:神经网络
二、攻略之BaseLine代码
有了上面对御膳房平台的简单认识,接下来就开始构建你们的BaseLine吧,下面代码是从回归问题的角度去解,主要是为了引导同学们快速进入状态:1、算法平台,上传要预测的9月份30天的日期数据:可以通过R脚本以data.frame的形式写入到ODPS表中。(PS:test=c(20140901,20140902)默认元素类型是double而非int,所以需要在R中做as.integer(20140901)转换,此外必须制定一个ODPS源)PS:当然不能使用9 月份以及以后的数据,要符合当前的业务场景,不忘初心、方得始终!
R脚本代码:
- # 请链接输入数据
- # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
- # 切记不可修改系统生成代码,否则运行将报错
- #端口1的表数据映射成dataset1
- dataset1 <- pai.inputPort(1) # class: data.frame
- report_date = c(
- as.integer(20140901)
- , as.integer(20140902)
- , as.integer(20140903)
- , as.integer(20140904)
- , as.integer(20140905)
- , as.integer(20140906)
- , as.integer(20140907)
- , as.integer(20140908)
- , as.integer(20140909)
- , as.integer(20140910)
- , as.integer(20140911)
- , as.integer(20140912)
- , as.integer(20140913)
- , as.integer(20140914)
- , as.integer(20140915)
- , as.integer(20140916)
- , as.integer(20140917)
- , as.integer(20140918)
- , as.integer(20140919)
- , as.integer(20140920)
- , as.integer(20140921)
- , as.integer(20140922)
- , as.integer(20140923)
- , as.integer(20140924)
- , as.integer(20140925)
- , as.integer(20140926)
- , as.integer(20140927)
- , as.integer(20140928)
- , as.integer(20140929)
- , as.integer(20140930)
- )
- dataname = data.frame(report_date)
- # 用户指定数据变量dataname(class:data.frame)到输出端口
- # 平台会将该数据生成ODPS表
- # dataname务必修改成自己的变量名称
- pai.outputPort(1, dataname)
- --日申购赎回汇总表
- create table if not exists lt_user_balance_table_sum_baseline(
- report_date string comment '日期'
- ,total_purchase_amt bigint comment '日申购总额'
- ,total_redeem_amt bigint comment '日赎回总额'
- ) comment '日申购赎回汇总表' partitioned by (ds string);--ds:不同的分区,不同的时间区间。
- insert overwrite table lt_user_balance_table_sum_baseline partition(ds='all')
- select report_date
- ,sum(total_purchase_amt) total_purchase_amt
- ,sum(total_redeem_amt) total_redeem_amt
- from tianchi_test.user_balance_table --内部赛主办方提供的申购赎回记录表。
- group by report_date;
- --例如要用4-8月数据作为训练集
- insert overwrite table lt_user_balance_table_sum_baseline partition(ds='45678month')
- select report_date
- ,total_purchase_amt
- ,total_redeem_amt
- from lt_user_balance_table_sum_baseline
- where ds = 'all' and report_date >='20140401' and report_date < '20140901';
- --构建训练集基础特征:
- create table if not exists lt_basic_feature4to8_baseline as
- select t1.report_date
- ,case when t1.dayOfWeek=0 then 1 else 0 end as monday
- ,case when t1.dayOfWeek=1 then 1 else 0 end as tuesday
- ,case when t1.dayOfWeek=2 then 1 else 0 end as wednesday
- ,case when t1.dayOfWeek=3 then 1 else 0 end as thursday
- ,case when t1.dayOfWeek=4 then 1 else 0 end as friday
- ,case when t1.dayOfWeek=5 then 1 else 0 end as saturday
- ,case when t1.dayOfWeek=6 then 1 else 0 end as sunday
- ,total_purchase_amt
- ,total_redeem_amt
- from (
- select report_date
- ,weekday(to_date(report_date,"yyyyMMdd")) dayOfWeek
- ,total_purchase_amt
- ,total_redeem_amt
- from lt_user_balance_table_sum_baseline
- where ds = '45678month'
- ) t1;
- --构建线上基础特征:
- create table if not exists lt_basic_feature9_baseline as
- select t1.report_date
- ,case when t1.dayOfWeek=0 then 1 else 0 end as monday
- ,case when t1.dayOfWeek=1 then 1 else 0 end as tuesday
- ,case when t1.dayOfWeek=2 then 1 else 0 end as wednesday
- ,case when t1.dayOfWeek=3 then 1 else 0 end as thursday
- ,case when t1.dayOfWeek=4 then 1 else 0 end as friday
- ,case when t1.dayOfWeek=5 then 1 else 0 end as saturday
- ,case when t1.dayOfWeek=6 then 1 else 0 end as sunday
- from (
- select report_date
- ,weekday(to_date(report_date,"yyyyMMdd")) dayOfWeek
- from lt_predict_day9month_baseline --9月份日期数据可以通过R脚本上传。
- ) t1;
R 脚本训练并预测申购:
- # 请链接输入数据
- # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
- # 切记不可修改系统生成代码,否则运行将报错
- #端口2的表数据映射成dataset2
- dataset2 <- pai.inputPort(2) # class: data.frame
- #端口1的表数据映射成dataset1
- dataset1 <- pai.inputPort(1) # class: data.frame
- formulaStr = "total_purchase_amt~ monday+tuesday +wednesday + thursday+friday+saturday+sunday"
- model = lm(as.formula(formulaStr),dataset1,interval="prediction")
- dataname <-data.frame( predict(model,dataset2,interval = "prediction",level=0.95,se.fit=FALSE))
- dataname$report_date = dataset2$report_date
- # 用户指定数据变量dataname(class:data.frame)到输出端口
- # 平台会将该数据生成ODPS表
- # dataname务必修改成自己的变量名称
- pai.outputPort(1, dataname)
R 脚本训练并预测赎回:
- # 请链接输入数据
- # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
- # 切记不可修改系统生成代码,否则运行将报错
- #端口2的表数据映射成dataset2
- dataset2 <- pai.inputPort(2) # class: data.frame
- #端口1的表数据映射成dataset1
- dataset1 <- pai.inputPort(1) # class: data.frame
- formulaStr = "total_redeem_amt~ monday+tuesday +wednesday + thursday+friday+saturday+sunday"
- model = lm(as.formula(formulaStr),dataset1,interval="prediction")
- dataname <-data.frame( predict(model,dataset2,interval = "prediction",level=0.95,se.fit=FALSE))
- dataname$report_date = dataset2$report_date
- # 用户指定数据变量dataname(class:data.frame)到输出端口
- # 平台会将该数据生成ODPS表
- # dataname务必修改成自己的变量名称
- pai.outputPort(1, dataname)
- --合并申购赎回结果并提交:
- create table lt_baseline_commit as
- select t1.report_date
- ,cast(round(t1.fit,0) as bigint) purchase
- ,t2.redeem
- from lt_basic_feature9_predict_purchase t1
- join(
- select report_date
- ,cast(round(fit,0) as bigint) redeem
- from lt_basic_feature9_predict_redeem
- ) t2
- on t1.report_date = t2.report_date;
- --提交结果到官方评测表:
- insert overwrite table tc_comp_predict_table
- select * from lt_baseline_commit;
- --查看提交结果是否正确
- select * from tc_comp_predict_table;
- desc tc_comp_predict_table;
三、攻略之总结体会
1、本次比赛还是很有价值的,体现了一个真实的业务场景。
2、我们更倾向于把赛题定义为一个回归问题或者时间序列分析问题。这两类方法做到极致都能取得不错的成绩。当然也鼓励同学们有更多的尝试。
3、注意大单的处理,注意特征的标准化,注意特殊日期的预测。
4、相信能进入复赛的同学对赛题已经有了较为深刻的理解,我们建议同学们要尽量尝试多种方法,然后选一个最有潜力的进行优化。
最后预祝同学们能取得更高的成绩,提出更多可以解当前业务问题的方法。Fighting!!