随着近年来互联网技术的不断成熟,城市产业转型和升级不断加速,一场智慧化变革正悄然发生。那么,未来城市会以怎样的方式进行划分呢?不同的城市区域又将承担怎样的角色?城市精细化治理不仅关乎城市的发展速度,也关乎每个城市居民的生活品质。
好在AI技术的不断成熟,想要构筑一个城市的功能分类模型已非天方夜谭。尤其是飞桨开源深度学习平台的逐步成长,也让开发者有了更多的选择。针对上述问题,2019年9月至12月,飞桨举办了首期基线挑战赛,参赛选手使用飞桨构建一个城市区域功能分类模型:对给定的地理区域,输入该区域的遥感影像和用户到访数据,最终预测10万个测试集样本的区域功能类别。
经过3月的激烈竞争,最终Expelliarmus以0.88767的成绩获得冠军,也就是说该团队训练的飞桨模型成功预测了近8.9万个城市区域功能的类别,哪里是学校、居民区、飞机场,只需要一个模型便可准确分类。该成绩也逼近了2019国际大数据竞赛复赛第一名成绩0.90468。
赛题分析:基于遥感影像和用户行为的城市区域功能分类
此前,2019百度&西交大大数据竞赛已举办过Urban Region Function Classification 比赛,要求选手构建一个城市区域功能分类模型(居住区、学校 、工业园区 、火车站 、飞机场 、公园 、商业区 、政务区、医院等),对给定的地理区域、输入区域的遥感影像和用户的到访数据,并预测区域的功能类别。
此次飞桨基线挑战赛沿用了上述赛题,要求选手基于遥感影像和互联网用户行为,使用飞桨设计一个城市区域功能的分类模型。
因为有迹可循,这就让选手能够减少很多重复性工作。在本次比赛中,获得冠军的参赛队伍Expelliarmus就分享了他们的参赛历程。他们认为,本次参赛可以沿用先前比赛开源代码中可以利用的部分,减少重复工作,并使用基于飞桨开发的模型,替换掉先前比赛方案中不符合本次规则的模型。
也就是说,Expelliarmus在本次比赛中主要对官方基线模型、先前比赛中top2队伍海疯习习在GitHub上开源的特征提取代码,并结合自身使用飞桨搭建的MLP模型对上述提取的特征进行训练。
在本次比赛中,Expelliarmus所做的工作主要包含了以下四个方面:
1. 基于飞桨框架搭建了MLP模型,并封装了MLPClassifier。提供了fit()、predict_prob()、score()、save_model()、load_model()接口,方便模型训练预测调用。具体参见代码中的models.py文件。
2. 对官方基线模型进行如下修改:
a. 修改npy生成文件代码,使用multiprocessing多进程处理,加快处理速度;
b. 修改reader函数和infer函数,使其可以batch预测,加快预测速度;
c. 添加了k折交叉验证代码,及stacking方式生成基线模型特征代码。
3. 使用MLP模型进行特征筛选,具体做法是:
a. 划分训练验证集,并使用全部特征训练MLP模型;
b. 按顺序依次shuffle验证集的每一列特征,并在前面训练的模型上进行预测,如果预测分数不变或者升高,则说明这一列特征并未起到作用,则可以将该特征剔除。具体参见代码中的train_select.py文件。
4. 后期使用bagging方式训练多个模型,即每次训练前都对样本和特征进行采样,保证模型训练结果的多样性,提高模型融合效果。
比赛思路:特征提取及MLP模型训练
Expelliarmus贡献了本次比赛的参赛思路,详情可参考:
https://github.com/cchan19/region_classification
比赛过程中也沿用了top队伍海疯习习的比赛思路,具体内容可以参考:
https://www.cnblogs.com/skykill/p/11273640.html
而特征提取则主要包含了两个方面:
1. 使用官方基线模型提取特征。具体代码参见文件夹train_multimodel;
2. 使用海疯习习队伍开源代码提取特征,其中包括三类特征:
第一类:basic 特征
给定一个地区的访问数据,我们提取该地区不同时间段的统计特征(包括 sum, mean, std, max, min, 分 位数25,50, 75这8个统计量)。不区分用户的特征:24小时,24小时相邻小时人数比值,节假日,工作日,休息日,等等。区分用户的特征:
1) 一天中,最早几点出现,最晚几点出现,最晚减去最早, 一天中相邻的最大间隔小时数。
2)沿着天数的,每个小时的统计特征。等等
—— 引用自海疯习习博客。
第二类:local 特征
“用户的时间轴上的天数,小时数,一天中最早出现和最晚消失的时间以及其时间差,一天中相邻时间的最大间隔小时数;以及节假日的相应特征(由于内存限制,我们对于节假日的特征,只提取了部分特征,天数,小时数), 这边我们节假日分的稍微粗糙点。”—— 引用自海疯习习博客。
第三类:global特征
在提取local特征的方法下,使用部分basic特征替换掉local特征变量(具体方法参见海疯习习博客),并使用前文提到的特征筛选方法从basic特征中筛选部分特征。在提取global特征前,继续从basic特征中筛选出50个特征,用于构造global特征。
特征提取完毕后,可以用官方基线模型特征和的海疯习习队伍的三类特征共同训练MLP模型,使用4折交叉验证,最终得分为0.885+。而如果使用前文提到的bagging训练方法,训练50个MLP模型进行融合,最终得分为0.887+。需要注意的是,以上MLP模型层设置均为(256,128,64)。
代码目录及说明
那么以上两种办法具体是如何操作的呢?Expelliarmus提供了代码目录以及说明。
code
├─data:数据存放目录
│ ├─test_image:测试图片
│ ├─test_visit:测试文本
│ ├─train_image:训练图片
│ └─train_visit:训练文本
└─work
├─data_processing:数据预处理
│ ├─get_basic_file:记录训练测试文件及训练标签
│ └─get_npy:生成npy文件
├─feature_extracting:特征提取及筛选
│ ├─Basic_feature:basic特征
│ │ ├─Code_Basic_feature_1
│ │ └─Code_Basic_feature_2
│ ├─UserID_feature_global:global特征
│ └─UserID_feature_local:local特征
├─train_all:使用4折交叉训练模型(score:0.885)
├─train_bagging:使用bagging的方式训练模型(score:0.887)
└─train_multimodel:官方基线模型特征
注:属于已有开源代码的包括:
A. 修改自官方基线模型:
work\data_processing\get_npy\get_npy.py
work\train_multimodel\multimodel.py
work\train_multimodel\train_utils.py
B. 来自GitHub开源代码:
(网址:https://github.com/zhuqunxi/Urban-Region-Function-Classification)
work\data_processing\get_basic_file\**
work\feature_extracting\Basic_feature\Code_Basic_feature_1\Config.py
work\feature_extracting\Basic_feature\Code_Basic_feature_1\feature.py
work\feature_extracting\Basic_feature\Code_Basic_feature_1\main.py
work\feature_extracting\Basic_feature\Code_Basic_feature_2\Config.py
work\feature_extracting\Basic_feature\Code_Basic_feature_2\feature.py
work\feature_extracting\Basic_feature\Code_Basic_feature_2\main.py
work\feature_extracting\UserID_feature_global\Config.py
work\feature_extracting\UserID_feature_global\function_global_feature.py
work\feature_extracting\UserID_feature_global\function.py
work\feature_extracting\UserID_feature_global\main.py
work\feature_extracting\UserID_feature_local\**
代码运行顺序如下:
进入data_processing/get_basic_file
(1) python get_label.py: 生成训练标签
(2) python get_train_test_csv.py:记录训练visit文件(csv)
(3) python get_train_test_txt.py:记录训练visit、测试image文件(txt)
进入data_processing/get_basic_file
(1) python get_npy.py: 生成官方基线用到的npy数组
进入work\feature_extracting\Basic_feature\Code_Basic_feature_1
(1) python main.py: 生成第一组basic特征
(2) python merge20.py: 将该组一半的basic特征合并,用于特征筛选
(3) python train_select.py: 利用MLP筛选特征,生成select_index.npy
进入work\feature_extracting\Basic_feature\Code_Basic_feature_2
(1) python main.py: 生成第一组basic特征
(2) python merge20.py: 将该组一半的basic特征合并,用于特征筛选
(3) python train_select.py: 利用MLP筛选特征,生成select_index.npy
进入work\feature_extracting\Basic_feature
(1) python train_select.py: 利用MLP筛选前面两组特征
(2) python merge.py: 合并筛选后的特征,生成最终的basic特征
进入work\feature_extracting\UserID_feature_local
(依次运行生成八组local特征)
(1) python normal_local.py
(2) python normal_hour_local.py
(3) python normal_hour_local_std.py
(4) python normal_work_rest_fangjia_hour_local.py
(5) python normal_work_rest_fangjia_hour_local_std.py
(6) python normal_work_rest_fangjia_local.py
(7) pythondata_precessing_user_id_number_holiday.py
(8) python data_precessing_user_id_number_hour.py
进入work\feature_extracting\UserID_feature_global
(1) python train_select.py: 在basic特征上继续筛选出50个特征
(2) python user_place_visit_num.py: 用户访问地点计数
(3) python main.py: 利用筛选的50个特征生成global特征
(4) python merge.py: 合并,得到最终的global特征
进入work\train_multimodel
(1) sh download_pretrain.sh: 下载SE_ResNeXt50预训练模型
(2) python train.py:k折交叉训练官方基线模型,预测概率值作为特征
进入work\train_all
(1) python train4fold.py: 利用MLP模型和前面生成的所有特征,四折交叉训练,预测结果线上得分为:0.885+
进入work\train_bagging
(1) python train.py: 利用bagging的策略训练50个MLP模型
(2) python infer.py: 利用前46个模型预测测试集,概率值平均求和,结果线上得分为:0.887+
写在最后
通过以上方法,由华南理工大学CChan带领的Expelliarmus最终成绩定格在了0.88767,而这一成绩也帮助他们成功登顶,获得了本次比赛的冠军。由此可见,无论是初出茅庐的学生还是已经工作许久的职场高手,只要善于把握机会,那么自身的光芒就一定能够闪耀出来。首期飞桨基线挑战赛显然是一个崭露头角的机会,但却并不是唯一机会,因为中国人工智能大赛·语言与知识技术竞赛也在火热报名中!
中国人工智能大赛·语言与知识技术竞赛由国家三部委指导,属于国家级AI竞赛。本次比赛设置了机器阅读理解方向赛题,参赛者可免费获得专家级AI培训以及长期技术支持,厦门政府为参赛者提供大力扶持政策,百度也为个人参赛者设立12万总奖池加码竞赛,更有AI Studio免费GPU算力助力选手参赛。
不要遗憾错失的机会,不必艳羡他人的光彩,每个活动都会为有准备的人敞开大门,点击参赛指南:https://ai.ixm.gov.cn/detail/intro-detail.html?id=a2b85a10d2d34ed7b70ad309c6881599
来源:oschina
链接:https://my.oschina.net/u/4067628/blog/3189171