1. 说明
美年健康AI大赛的复赛是线上赛,只能使用数加平台。第一次用数加,也遇到一些问题,在此总结一下。
2. 问题及解答
(1) 如何登录?
得到复赛资格之后,天池赛题网页左侧的列表中就会多出一项“数加”,点击进入后,按提示得到RAM帐号,即可以登录“数据开发平台”和“机器学习平台”,注意登录帐号是用户名和企业别名的组合。
网页上提供的Demo有点旧了,是2015年的,那时候好像还叫“御膳房”。建议官方及时更新,这样大家可以节约点时间,技术支持人员也没那么累。
(2) 如何访问数据?
进入“数据开发平台”,点击上方的“数据管理”,即可进入数据界面,左侧的查找数据,可以通过关键字查找该项目下的表,像本题查找meinian就可以看到很多表,其中包括管理员建立的和其他参赛者建立的。 具体的项目名和表名见“赛题与数据”中复赛的说明。需要注意的是一般先要把项目数据用SQL复制到自己的空间中,然后再进行下一步操作。详见“代码分享”部分。 复制到自己空间后,就可以在“数据管理”->“个人帐号的表”中查看表信息了。
(3) 如何写程序和运行?
进入“数据开发平台”,点击上方的“数据开发”,在左侧的任务开发树中可以创建程序。这里提供了SQL,Shell,Python等工具。并支持目录结构。
(4) 数加平台能否使用Python?
能否使用pandas的DataFrame? 之前听说数加平台只能用SQL+Java,于是很多人都重新学习工具,占用了大部分时间,美年初赛时大多数人使用的都是Python,也希望在复赛中使用初赛代码。那么数加平台能否使用Python呢?
不同比赛提供的工具不同,美年复赛可以使用Python,具体方法是右键点“任务开发”,“新建任务”,在类型中选择PYODPS即可编写Python程序。 PYODPS帮助文档见:http://pyodps.readthedocs.io/zh_CN/latest/index.html
(5) ODPS是什么?
ODPS(Open Data Processing Service),是阿里巴巴通用计算平台提供数据仓库解决方案.
(6) 线上Python如何访问数据表
从PYODPS帮助文档中看到,可以通过o访问数据表,而o通过以下方式获得:
from odps import ODPS
o=ODPS('**your-access-id**', '**your-secret-access-key**', '**your-default-project**', endpoint='**your-end-point**')
大家花了很多时间找access-key, access-secret,在个人信息中看到access-key不对子用户开放,然后我们就以为python不能用了,悲剧了。
其实在数加线上,o不用赋值就可以直接使用,access-key和access-secret是针对离线运行PYODPS的。希望官方在文档或者赛题中明确写一下(真心地没想到o可以直接使用)。
读写数据及odps与dataframe转换,详见“代码分享”部分。
(7) 在何处提交结果
题目提供的表中有测试集a:meinian_round2_submit_a,把答案写入用户空间的该表中,系统则会在评测时间自动对该表内容评测。因此,复制库成功后,表的内容为全0,评测时就有了成绩,得分约为9.1781,很低的分数。
3. 代码分享
(功能基本实现,代码还待优化,仅供参考)
(1) 把数据复制到本地
数据开发->任务开发->新建任务->ODPS SQL 写以下SQL语句,并运行(一共5个表,都用此方法复制)
create table if not exists meinian_round2_data_part1 as select * from odps_tc_257100_f673506e024.meinian_round2_data_part1;
(2) 其它常用SQL语句
查看已有的表
show tables;
查看表内容
select * from meinian_round2_data_part1;
看表中有多少条数据
select count(*) from meinian_round2_data_part1;
(3) 将ODPS转成pandas的DataFrame
from odps import ODPS
from odps.df import DataFrame
submit_basedata = DataFrame(o.get_table('meinian_round2_submit_a'))
submit_data = submit_basedata.to_pandas()
print("total", len(submit_data))
(4) 存储ODPS数据
这个我写了还没等到评测,不一定对,仅供参考。 具体功能是把训练集的均值作为预测值,因为不太会用writer,直接调用总是追加数据,只好在每次添加之前删表又重建,此处有待优化。
import numpy as np
from odps import ODPS
from odps.df import DataFrame
from odps.models import Schema
train_basedata = DataFrame(o.get_table('meinian_round2_train'))
train_data = train_basedata.to_pandas()
submit_basedata = DataFrame(o.get_table('meinian_round2_submit_a'))
submit_data = submit_basedata.to_pandas()
submit_data['sys'] = train_data['sys'].mean()
submit_data['dia'] = train_data['dia'].mean()
submit_data['tl'] = train_data['tl'].mean()
submit_data['hdl'] = train_data['hdl'].mean()
submit_data['ldl'] = train_data['ldl'].mean()
table_name = 'test'
odps.delete_table(table_name, if_exists=True)
odps.create_table(table_name,
'vid string, sys bigint, dia bigint, tl double, hdl double, ldl double')
t = odps.get_table(table_name)
with t.open_writer() as writer:
outdata = np.array(submit_data).tolist()
writer.write(outdata)
print("outdata length", len(outdata))
writer.close()
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
print(train_data.mean())
print(submit_data.mean())
4. 基本步骤
(1) 把数据表复制到自己的用空间
(2) 将pyodps转成pandas的dataframe
(3) 数据处理和挖掘
(4) 将dataframe结果转回pyodps能识别的格式存盘。
我也刚开始做,觉得来好像这样转换一下,初赛的代码大部分就可用了。其它还没试,先这样吧,有空再写,祝师兄们马到成功 !!!
网友评论