7月22日,万众瞩目的第二届 Apache Flink 极客挑战赛正式发布。在疫情防控的背景下,第二届 Flink 极客挑战赛要求参赛队伍利用大数据技术 + AI 算法技术来帮助解决防控遇到的挑战。为了能更好地让选手理解赛题以及提高成绩,本文主要从以下几个方面来对赛题进行解读:
赛题数据
赛题任务
赛题技术
赛题 demo 解析
赛题优化点
赛题评分指标
赛题数据
选手在本地会有四份数据集,分别是用于训练的历史行动数据集和标签数据集,以及用于评测的确诊病例数据集和实时行动数据集。
历史行动数据集代表在一片区域内的历史数据,包括有已确诊病例和未确诊数据,该数据集中可能有多条不同的数据都代表用例。
备注:该数据为模拟数据。
其格式为:
uuid
face_id
device_id
feature_data
1
face_id_1
device_id_1
1 2 3 4…
2
face_id_2
device_id_2
2 3 4 5…
…
…
…
…
n
face_id_n
device_id_n
face_id_n
其中每行包括 uuid,face_id,device_id 和 feature_data,分别代表自增 id,人脸 id,摄像头 id,和人脸特征向量。列之间以";"分隔,人脸特征向量中的元素之间以空格分割,维度为 512 维。
标签数据集反映了在历史行动数据集中,不同的 face_id 与其所属类别(人)之间的关系。
其格式为:
face_id
p_id
face_id_1
0
face_id_2
0
…
…
face_id_n
n
其中每行包括 face_id 和 p_id,face_id 可以在历史行动数据集中查到相应记录,p_id 代表该条 face_id 对应数据所属于的类别(人),列之间以";"分隔。
确诊病例数据集代表该小区住户中已经被确诊患病的病例,该数据集中可能有多条数据都代表同一个人,而且该数据集中的每个确诊病例住户在历史行动数据集中都出现过一次或者多次;
确诊病例数据集的格式为:
face_id
feature_data
face_id_1
1 2 3 4…
face_id_2
2 3 4 5…
…
…
face_id_n
n1 n2 n3 n4…
实时行动数据集代表小区中不同摄像头实时拍摄到的住户,该数据集中可能多条数据都代表同一个人,而且该数据集中出现的每一个人都在历史行动数据集中出现过一次或者多次;
实时行动数据集的格式为:
face_id
device_id
feature_data
face_id_1
device_id_1
1 2 3 4…
face_id_2
device_id_2
2 3 4 5…
…
…
face_id_n
device_id_n
n1 n2 n3 n4…
评测机上的数据集均存放在环境变量 ENV_HOME 的下级目录 data_set 中,可通过如下 Python 代码获取:
历史行动数据集:os["ENV_HOME"] + /data_set/training_data.csv
确诊病例数据集:os["ENV_HOME"] + /data_set/first_test_file.csv
实时数据集:存放在 Kafka 的 tianchi_read_example 的 topic 中。
选手在本地开发的时候,可以通过自行设置环境变量 ENV_HOME 进行调试。
赛题任务
选手需要完成的任务有两个,按顺序进行。
1.对确诊病例数据集中的每一条数据,选手需要从历史行动数据集中找出与该条数据同属于一个类(人)所对应的所有记录,并输出找到的每条记录对应的 face_id。
要求输出的 CSV 文件格式为:
face_id
near_face_id
face_id_1
face_id_1’
face_id_1
face_id_2’
face_id_1
face_id_3’
…...
…...
face_id_n
face_id_n1’
face_id_n
face_id_n2’
face_id_n
face_id_n3’
如上图所示,假设 face_id_1 为确诊病例数据集中的某一条数据的 face_id,则face_id_1’,face_id_2’,face_id_3’为历史行动数据集中与 face_id_1 同属于一个类(人)的 face_id;列之间以”;”分隔。
要求在评测机上输出的文件路径为:
TASK_ID = os.environ["TASK_ID"]
os["ENV_HOME"] + /output/{}/first_result.csv.format(TASK_ID)
选手在本地开发的时候,可以通过自行设置环境变量 TASK_ID 进行调试。
2.对实时行动数据集的每一条数据,选手要判断该条数据的类别(人),并输出该条数据的 device_id 和类别。
要求输出的格式为:
face_id
device_id
p_id
face_id_1
device_id_1
1
face_id_2
device_id_2
1
face_id_3
device_id_3
2
…...
…...
face_id_n
device_id_n
m
如上图所示,face_id 和 device_id 为实时行动数据集中的数据,pid 为经过算法逻辑后判断该条数据所属的类别,要求选手从 Kafka 读取实时数据并输出到 Kafka 的 TIANCHI_WRITE_EXAMPLE topic 中。
赛题技术
在解题的时候,选手需要使用到的技术有 Cluster Serving,Proxima,Flink AI Flow。Cluster Serving 提供了模型预测的功能,相关文档请查阅:
https://github.com/Litchilitchy/analytics-zoo/blob/state/docs/docs/ClusterServingGuide/QuickStart_CN.md?spm=5176.12281978.0.0.239550c1i2aQVD&file=QuickStart_CN.md
Proxima 提供了向量快速检索的功能,有内置高性能的聚类算法,相关文档请查阅:
https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531800/proxima-doc0814.pdf?spm=5176.12281978.0.0.239550c1i2aQVD&file=proxima-doc0814.pdf
Flink AI Flow 提供了实现端到端的工作流功能,相关 API 说明请查阅:
https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531800/ai_flow/api.md?spm=5176.12281978.0.0.239550c1i2aQVD&file=api.md
大赛更多赛题解读及相关技术应用直播请见【Flink 大赛特辑】系列直播:
https://flink-learning.org.cn/developers/flink-training-course3/
赛题 demo 解析
本次赛题注重算法和工程的结合,解答赛题大概要经过以下几个阶段:模型训练,模型预测,构建索引,离线检索相似向量,在线检索相似向量并判定类别。
模型训练:训练数据集中的向量数据都是 512 维的,可以考虑对向量数据做一个降维映射,选出有用 feature,去除噪音 feature,提高后续相似度匹配的准确率。在 demo 里,在模型训练阶段,训练了一个 autoencoder 模型,用以将向量数据从 512 维提取成 128 维。
模型预测:为了最大化利用 Flink 处理数据的速度,demo 中设置了 100 个并行度进行模型的预测,并由此生成了 100 个预测结果文件。为了全量的构建索引,需将 100 个预测结果文件合并成一个文件进行索引文件的构建。
构建索引:基于合并后的预测结果文件,利用 proxima 构建索引,可以得到索引文件。
离线检索相似向量:利用 proxima 和构建好的索引文件可以快速检索确诊病例数据集中的每条数据的最相似的 k 个向量。在 demo 中,选取的 k 值为 20。
在线检索相似向量并判定类别:利用 proxima 和构建好的索引文件,基于实时行动数据集,选手要判断该数据集中每条数据所属的类别(人)。
赛题优化点
模型训练:业界存在较多的向量数据预处理方法,demo 中选取了 autoencoder 作为模型来进行数据预处理。选手可以考虑其他方法或者继续优化 autoencoder 来提高模型的性能。注意,这里的模型训练指的是非监督的模型训练,标签文件只提供了 20 个类别(人)的数据,实际上并不止 20 个类别,选手可以基于提供的标签文件来进行模型性能的检测。
离线检索相似向量:proxima 有多种内置的聚类算法和检索算法,也可以开发自定义的插件,选手可以结合不同场景更换聚类算法或者检索算法;此外,demo 中 k 的选值为 20,选手可以设定不同的 k 值并编写自己的逻辑来确定每条确诊病例数据的相似向量。
在线分类:同样,选手可以考虑不同的聚类算法和检索算法以及开发自定义的插件;demo 中在线分类逻辑里,选取的 k 值是 1。选手可以设置不同的 k 值,并且基于不同的 k 值重新编写在线分类的逻辑;此外,实效性也是考察的一个因素,选手在实现高质量的分类逻辑时,也要避免耗时的操作。
赛题评分指标
评测指标由两个部分组成。
对于第一个任务,我们会计算选手输出的每条确诊病例的相似 face_id 与真实的face_id 之间的相似度:
accuary =∑((common-num)/(user-answer-list) ⋅(common-num)/(real-answer-list))
假设有标准答案:
face_id;face_id1
face_id;face_id2
face_id;face_id3
face_id;face_id4
face_id;face_id5
face_id;face_id6
face_id;face_id7
face_id;face_id8
face_id;face_id9
face_id;face_id10
….
….
假设有选手答案:
face_id;face_id1’
face_id;face_id2’
face_id;face_id3’
face_id;face_id4’
face_id;face_id5’
….
….
假设同一个 face_id 下,选手答案中的 face_id2’= 标准答案中的 face_id2,face_id4’ = 标准答案中的 face_id4,则选手正确输出了 2 个答案,则对于该 face_id,分数为 = (2 / 10) * (2 / 5) = 0.08,最后会对所有的 face_id 做加权平均;
对于第二个任务,选手会输出 500 毫秒时间处理范围内每条实时数据对应的 device_id 和其所属类别,测评程序会将选手输出为同一个类别的数据组合在一起构建成同一个类别的组合,并与真实属于同一个类别进行对比。
以上是对此次 Apache Flink 极客挑战赛赛题突破与优化角度的分享,希望有助于解决大家在参赛过程中遇到的难题。更多大赛详情及报名请点击「阅读原文」,30W奖金等你们拿!
万众瞩目的第二届 Apache Flink 极客挑战赛来啦!本次大赛全面升级,重量级助阵嘉宾专业指导,强大的资源配置供你发挥创意,还有 30w 丰厚奖金等你带走~聚焦 Flink 与 AI 技术的应用实践,挑战疫情防控的世界级难题,你准备好了么?
(点击图片可了解更多大赛信息)
戳我报名!