平台使用

来源:互联网 发布:java文件下载原理 编辑:程序博客网 时间:2024/04/28 13:22
 大家好,我们是内部赛冠军混沌队,下面是关于第二赛季平台使用的攻略。希望能够帮助大家快速上手,熟悉环境,尤其是对于以前木有接触过御膳房的同学们。
 
一、攻略之平台环境:


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包主要有:
复制代码
  1. ISOweek :日期处理
  2. timeDate:时间处理
  3. forecast :时间预测
  4. RandomForest:随机森林
  5. rpart:决策树
  6. e1071:svm算法
  7. tseries:时间序列
  8. glmnet:线性回归
  9. discretization:离散化
  10. cluster:聚类
  11. entropy:信息熵、互信息,用于特征选择。
  12. reshape:数据矩阵整形
  13. nnet:神经网络
特别提醒: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脚本代码:
复制代码
  1. # 请链接输入数据
  2. # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
  3. # 切记不可修改系统生成代码,否则运行将报错
  4. #端口1的表数据映射成dataset1
  5. dataset1 <- pai.inputPort(1) # class: data.frame
  6. report_date = c(  
  7.     as.integer(20140901)
  8. , as.integer(20140902)
  9. , as.integer(20140903)
  10. , as.integer(20140904)
  11. , as.integer(20140905)
  12. , as.integer(20140906)
  13. , as.integer(20140907)
  14. , as.integer(20140908)
  15. , as.integer(20140909)
  16. , as.integer(20140910)
  17. , as.integer(20140911)
  18. , as.integer(20140912)
  19. , as.integer(20140913)
  20. , as.integer(20140914)
  21. , as.integer(20140915)
  22. , as.integer(20140916)
  23. , as.integer(20140917)
  24. , as.integer(20140918)
  25. , as.integer(20140919)
  26. , as.integer(20140920)
  27. , as.integer(20140921)
  28. , as.integer(20140922)
  29. , as.integer(20140923)
  30. , as.integer(20140924)
  31. , as.integer(20140925)
  32. , as.integer(20140926)
  33. , as.integer(20140927)
  34. , as.integer(20140928)
  35. , as.integer(20140929)
  36. , as.integer(20140930)
  37.                                   )
  38. dataname = data.frame(report_date)
  39. # 用户指定数据变量dataname(class:data.frame)到输出端口
  40. # 平台会将该数据生成ODPS表
  41. # dataname务必修改成自己的变量名称
  42. pai.outputPort(1, dataname)
2、开发平台,使用ODPS SQL构建特征(初级特征仅供参考):
复制代码
  1. --日申购赎回汇总表
  2. create table if not exists lt_user_balance_table_sum_baseline(
  3.      report_date string comment '日期'
  4.     ,total_purchase_amt bigint comment '日申购总额'
  5.     ,total_redeem_amt bigint comment '日赎回总额'
  6. ) comment '日申购赎回汇总表' partitioned by (ds string);--ds:不同的分区,不同的时间区间。
  7. insert overwrite table lt_user_balance_table_sum_baseline partition(ds='all')
  8. select   report_date
  9.         ,sum(total_purchase_amt) total_purchase_amt
  10.         ,sum(total_redeem_amt) total_redeem_amt
  11. from tianchi_test.user_balance_table --内部赛主办方提供的申购赎回记录表。
  12. group by report_date;
  13. --例如要用4-8月数据作为训练集
  14. insert overwrite table  lt_user_balance_table_sum_baseline partition(ds='45678month')
  15. select   report_date
  16.         ,total_purchase_amt
  17.         ,total_redeem_amt
  18. from lt_user_balance_table_sum_baseline
  19. where ds = 'all' and report_date >='20140401' and report_date < '20140901';
  20. --构建训练集基础特征:
  21. create table if not exists  lt_basic_feature4to8_baseline as
  22. select   t1.report_date
  23.         ,case when t1.dayOfWeek=0 then  1 else 0 end as monday
  24.         ,case when t1.dayOfWeek=1 then  1 else 0 end as tuesday
  25.         ,case when t1.dayOfWeek=2 then  1 else 0 end as wednesday
  26.         ,case when t1.dayOfWeek=3 then  1 else 0 end as thursday
  27.         ,case when t1.dayOfWeek=4 then  1 else 0 end as friday
  28.         ,case when t1.dayOfWeek=5 then  1 else 0 end as saturday
  29.         ,case when t1.dayOfWeek=6 then  1 else 0 end as sunday
  30.         ,total_purchase_amt
  31.         ,total_redeem_amt
  32. from (
  33.     select report_date
  34.          ,weekday(to_date(report_date,"yyyyMMdd")) dayOfWeek
  35.          ,total_purchase_amt
  36.          ,total_redeem_amt
  37.     from lt_user_balance_table_sum_baseline
  38.     where ds = '45678month'
  39. ) t1;
  40. --构建线上基础特征:
  41. create table if not exists  lt_basic_feature9_baseline as
  42. select   t1.report_date
  43.         ,case when t1.dayOfWeek=0 then  1 else 0 end as monday
  44.         ,case when t1.dayOfWeek=1 then  1 else 0 end as tuesday
  45.         ,case when t1.dayOfWeek=2 then  1 else 0 end as wednesday
  46.         ,case when t1.dayOfWeek=3 then  1 else 0 end as thursday
  47.         ,case when t1.dayOfWeek=4 then  1 else 0 end as friday
  48.         ,case when t1.dayOfWeek=5 then  1 else 0 end as saturday
  49.         ,case when t1.dayOfWeek=6 then  1 else 0 end as sunday
  50. from (
  51.     select report_date
  52.          ,weekday(to_date(report_date,"yyyyMMdd")) dayOfWeek
  53.     from lt_predict_day9month_baseline --9月份日期数据可以通过R脚本上传。
  54. ) t1;
3、算法平台,训练模型并预测:这里使用R脚本的lm做线性回归模型。


R脚本训练并预测申购:
复制代码
  1. # 请链接输入数据
  2. # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
  3. # 切记不可修改系统生成代码,否则运行将报错
  4. #端口2的表数据映射成dataset2
  5. dataset2 <- pai.inputPort(2) # class: data.frame
  6. #端口1的表数据映射成dataset1
  7. dataset1 <- pai.inputPort(1) # class: data.frame
  8. formulaStr = "total_purchase_amt~ monday+tuesday +wednesday + thursday+friday+saturday+sunday"
  9. model = lm(as.formula(formulaStr),dataset1,interval="prediction")
  10. dataname <-data.frame( predict(model,dataset2,interval = "prediction",level=0.95,se.fit=FALSE))
  11. dataname$report_date = dataset2$report_date
  12. # 用户指定数据变量dataname(class:data.frame)到输出端口
  13. # 平台会将该数据生成ODPS表
  14. # dataname务必修改成自己的变量名称
  15. pai.outputPort(1, dataname)

R脚本训练并预测赎回:
复制代码
  1. # 请链接输入数据
  2. # 链接完成后,系统会自动生成映射代码,将输入数据映射成变量参数,用户可直接使用
  3. # 切记不可修改系统生成代码,否则运行将报错
  4. #端口2的表数据映射成dataset2
  5. dataset2 <- pai.inputPort(2) # class: data.frame
  6. #端口1的表数据映射成dataset1
  7. dataset1 <- pai.inputPort(1) # class: data.frame
  8. formulaStr = "total_redeem_amt~ monday+tuesday +wednesday + thursday+friday+saturday+sunday"
  9. model = lm(as.formula(formulaStr),dataset1,interval="prediction")
  10. dataname <-data.frame( predict(model,dataset2,interval = "prediction",level=0.95,se.fit=FALSE))
  11. dataname$report_date = dataset2$report_date
  12. # 用户指定数据变量dataname(class:data.frame)到输出端口
  13. # 平台会将该数据生成ODPS表
  14. # dataname务必修改成自己的变量名称
  15. pai.outputPort(1, dataname)
4、合并申购、赎回结果并提交
复制代码
  1. --合并申购赎回结果并提交:
  2. create table lt_baseline_commit as
  3. select   t1.report_date
  4.         ,cast(round(t1.fit,0) as bigint) purchase
  5.         ,t2.redeem
  6. from lt_basic_feature9_predict_purchase t1
  7. join(
  8.      select   report_date
  9.             ,cast(round(fit,0) as bigint) redeem
  10.     from lt_basic_feature9_predict_redeem
  11. ) t2
  12. on t1.report_date = t2.report_date;
  13. --提交结果到官方评测表:
  14. insert overwrite table tc_comp_predict_table
  15. select * from lt_baseline_commit;
  16. --查看提交结果是否正确
  17. select * from tc_comp_predict_table;
  18. desc tc_comp_predict_table;


三、攻略之总结体会
1、本次比赛还是很有价值的,体现了一个真实的业务场景。
2、我们更倾向于把赛题定义为一个回归问题或者时间序列分析问题。这两类方法做到极致都能取得不错的成绩。当然也鼓励同学们有更多的尝试。
3、注意大单的处理,注意特征的标准化,注意特殊日期的预测。
4、相信能进入复赛的同学对赛题已经有了较为深刻的理解,我们建议同学们要尽量尝试多种方法,然后选一个最有潜力的进行优化。

最后预祝同学们能取得更高的成绩,提出更多可以解当前业务问题的方法。Fighting!!

0 0
原创粉丝点击