实战美年健康 AI 大赛之四 _ 复赛使用数加平台

#算法实战

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 帮助文档见:index.html

(5) ODPS 是什么?

 ODPS(Open Data Processing Service),是阿里巴巴通用计算平台提供数据仓库解决方案.

(6) 线上 Python 如何访问数据表

  从 PYODPS 帮助文档中看到,可以通过 o 访问数据表,而 o 通过以下方式获得:

1
2
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 个表,都用此方法复制)

1
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

1
2
3
4
5
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,直接调用总是追加数据,只好在每次添加之前删表又重建,此处有待优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 能识别的格式存盘。

  我也刚开始做,觉得来好像这样转换一下,初赛的代码大部分就可用了。其它还没试,先这样吧,有空再写,祝师兄们马到成功!!!