他用飛槳,「畫」出了一座智慧城市應有的模樣

  • 2020 年 2 月 12 日
  • 筆記

隨著近年來互聯網技術的不斷成熟,城市產業轉型和升級不斷加速,一場智慧化變革正悄然發生。那麼,未來城市會以怎樣的方式進行劃分呢?不同的城市區域又將承擔怎樣的角色?城市精細化治理不僅關乎城市的發展速度,也關乎每個城市居民的生活品質。

好在AI技術的不斷成熟,想要構築一個城市的功能分類模型已非天方夜譚。尤其是飛槳開源深度學習平台的逐步成長,也讓開發者有了更多的選擇。針對上述問題,2019年9月至12月,飛槳舉辦了首期基準線挑戰賽,參賽選手使用飛槳構建一個城市區域功能分類模型:對給定的地理區域,輸入該區域的遙感影像和用戶到訪數據,最終預測10萬個測試集樣本的區域功能類別。

經過3月的激烈競爭,最終Expelliarmus以0.88767的成績獲得冠軍,也就是說該團隊訓練的飛槳模型成功預測了近8.9萬個城市區域功能的類別,哪裡是學校、居民區、飛機場,只需要一個模型便可準確分類。該成績也逼近了2019國際大數據競賽複賽第一名成績0.90468。

01

賽題分析:基於遙感影像和用戶行為的城市區域功能分類

此前,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方式訓練多個模型,即每次訓練前都對樣本和特徵進行取樣,保證模型訓練結果的多樣性,提高模型融合效果。

02

比賽思路:特徵提取及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)。

03

程式碼目錄及說明

那麼以上兩種辦法具體是如何操作的呢?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. 修改自官方基準線模型:

workdata_processingget_npyget_npy.py

worktrain_multimodelmultimodel.py

worktrain_multimodeltrain_utils.py

B. 來自GitHub開源程式碼:

(網址:https://github.com/zhuqunxi/Urban-Region-Function-Classification

workdata_processingget_basic_file**

workfeature_extractingBasic_featureCode_Basic_feature_1Config.py

workfeature_extractingBasic_featureCode_Basic_feature_1feature.py

workfeature_extractingBasic_featureCode_Basic_feature_1main.py

workfeature_extractingBasic_featureCode_Basic_feature_2Config.py

workfeature_extractingBasic_featureCode_Basic_feature_2feature.py

workfeature_extractingBasic_featureCode_Basic_feature_2main.py

workfeature_extractingUserID_feature_globalConfig.py

workfeature_extractingUserID_feature_globalfunction_global_feature.py

workfeature_extractingUserID_feature_globalfunction.py

workfeature_extractingUserID_feature_globalmain.py

workfeature_extractingUserID_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數組

進入workfeature_extractingBasic_featureCode_Basic_feature_1

(1) python main.py: 生成第一組basic特徵

(2) python merge20.py: 將該組一半的basic特徵合併,用於特徵篩選

(3) python train_select.py: 利用MLP篩選特徵,生成select_index.npy

進入workfeature_extractingBasic_featureCode_Basic_feature_2

(1) python main.py: 生成第一組basic特徵

(2) python merge20.py: 將該組一半的basic特徵合併,用於特徵篩選

(3) python train_select.py: 利用MLP篩選特徵,生成select_index.npy

進入workfeature_extractingBasic_feature

(1) python train_select.py: 利用MLP篩選前面兩組特徵

(2) python merge.py: 合併篩選後的特徵,生成最終的basic特徵

進入workfeature_extractingUserID_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

進入workfeature_extractingUserID_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特徵

進入worktrain_multimodel

(1) sh download_pretrain.sh: 下載SE_ResNeXt50預訓練模型

(2) python train.py:k折交叉訓練官方基準線模型,預測概率值作為特徵

進入worktrain_all

(1) python train4fold.py: 利用MLP模型和前面生成的所有特徵,四折交叉訓練,預測結果線上得分為:0.885+

進入worktrain_bagging

(1) python train.py: 利用bagging的策略訓練50個MLP模型

(2) python infer.py: 利用前46個模型預測測試集,概率值平均求和,結果線上得分為:0.887+

04

寫在最後

通過以上方法,由華南理工大學CChan帶領的Expelliarmus最終成績定格在了0.88767,而這一成績也幫助他們成功登頂,獲得了本次比賽的冠軍。由此可見,無論是初出茅廬的學生還是已經工作許久的職場高手,只要善於把握機會,那麼自身的光芒就一定能夠閃耀出來。首期飛槳基準線挑戰賽顯然是一個嶄露頭角的機會,但卻並不是唯一機會,因為中國人工智慧大賽·語言與知識技術競賽也在火熱報名中!

中國人工智慧大賽·語言與知識技術競賽由國家三部委指導,屬於國家級AI競賽。本次比賽設置了機器閱讀理解方向賽題,參賽者可免費獲得專家級AI培訓以及長期技術支援,廈門政府為參賽者提供大力扶持政策,百度也為個人參賽者設立12萬總獎池加碼競賽,更有AI Studio免費GPU算力助力選手參賽。

不要遺憾錯失的機會,不必艷羨他人的光彩,每個活動都會為有準備的人敞開大門,點擊左下角【閱讀原文】即可報名,如果你也想賽場爭鋒,那麼這次機會還請抓住呀!

參賽指南:https://ai.ixm.gov.cn/detail/intro-detail.html?id=a2b85a10d2d34ed7b70ad309c6881599