他用飛槳,「畫」出了一座智慧城市應有的模樣
- 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