隨着近年來互聯網技術的不斷成熟,城市產業轉型和升級不斷加速,一場智慧化變革正悄然發生。那麼,將來城市會以怎樣的方式進行劃分呢?不一樣的城市區域又將承擔怎樣的角色?城市精細化治理不只關乎城市的發展速度,也關乎每一個城市居民的生活品質。html
好在AI技術的不斷成熟,想要構築一個城市的功能分類模型已非天方夜譚。尤爲是飛槳開源深度學習平臺的逐步成長,也讓開發者有了更多的選擇。針對上述問題,2019年9月至12月,飛槳舉辦了首期基線挑戰賽,參賽選手使用飛槳構建一個城市區域功能分類模型:對給定的地理區域,輸入該區域的遙感影像和用戶到訪數據,最終預測10萬個測試集樣本的區域功能類別。python
通過3月的激烈競爭,最終Expelliarmus以0.88767的成績得到冠軍,也就是說該團隊訓練的飛槳模型成功預測了近8.9萬個城市區域功能的類別,哪裏是學校、居民區、飛機場,只須要一個模型即可準確分類。該成績也逼近了2019國際大數據競賽複賽第一名成績0.90468。git
01github
賽題分析:基於遙感影像和用戶行爲的城市區域功能分類數組
此前,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. 修改自官方基線模型:
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+
04
寫在最後
經過以上方法,由華南理工大學CChan帶領的Expelliarmus最終成績定格在了0.88767,而這一成績也幫助他們成功登頂,得到了本次比賽的冠軍。因而可知,不管是初出茅廬的學生仍是已經工做許久的職場高手,只要善於把握機會,那麼自身的光芒就必定可以閃耀出來。首期飛槳基線挑戰賽顯然是一個嶄露頭角的機會,但卻並非惟一機會,由於中國人工智能大賽·語言與知識技術競賽也在火熱報名中!
中國人工智能大賽·語言與知識技術競賽由國家三部委指導,屬於國家級AI競賽。本次比賽設置了機器閱讀理解方向賽題,參賽者可免費得到專家級AI培訓以及長期技術支持,廈門政府爲參賽者提供大力扶持政策,百度也爲我的參賽者設立12萬總獎池加碼競賽,更有AI Studio免費GPU算力助力選手參賽。
不要遺憾錯失的機會,沒必要豔羨他人的光彩,每一個活動都會爲有準備的人敞開大門,若是你也想賽場爭鋒,那麼此次機會還請抓住呀!
參賽指南:https://ai.ixm.gov.cn/detail/intro-detail.html?id=a2b85a10d2d34ed7b70ad309c6881599
>> 訪問 PaddlePaddle 官網,瞭解更多相關內容。