當前位置:
首頁 > 知識 > 深蘭科技:我們是如何拿下今年 KDD CUP AutoML 賽道冠軍的?

深蘭科技:我們是如何拿下今年 KDD CUP AutoML 賽道冠軍的?

素有數據挖掘「奧運會」之稱的 KDD CUP ,其頒獎儀式於 2019 年 8 月 7 號在美國安克雷奇市落下帷幕。今年的 KDD CUP 共設有三個賽道,分別為 Regular ML、AutoML 與 Humanity RL ,最終結果顯示,三個賽道的冠軍皆由華人隊伍奪得。作為 AutoML 賽道的冠軍隊伍,深蘭科技在儀式結束後接受了AI 開發者專訪,不嗇分享其在賽事中奪魁的點滴。

賽事獎狀

答:時序關係型數據在在線廣告、推薦系統、金融市場分析、醫療等應用場景中非常常見,人們往往需要利用這樣的數據去構建機器學習模型,並應用機器學習模型提升對應業務的效果。以在線廣告點擊率預測問題為例,每個樣本就是向用戶展示廣告,樣本標記為用戶是否點擊廣告。因為是實際的服務系統,所有樣本都是時序產生。

在傳統的機器學習應用中,需要經驗豐富的專家才能從時序關係型數據中挖掘出有效的時序信息,並加以利用來提升機器學習模型的效果。即使具備較深的知識儲備,專家也需要通過不斷的嘗試和試錯,才能構建出有價值的時序特徵,並且利用好多個相關聯表來提升機器學習模型的性能。此外,選擇合適的機器學習模型和超參數也需要強大的機器學習專業知識作為支撐。

此次競賽針對時序關係型數據的 AutoML 挑戰賽,希望讓更多的數據科學家和開發者加入其中,集思廣益,從而讓 AutoML 更好地利用時序關係型數據,提升模型的預測性能,讓 AutoML 解決方案能夠更加符合實際應用的需求。

賽題的難點主要有5個方面:

賽題數據來自於多個實際業務場景,參賽者設計的自動化機器學習演算法將會在未知的五個數據集中進行學習和評估,根據五個數據集的評估結果進行綜合排名。

比賽中每個數據集只給出數據類型不給出數據含義,自動根據特徵類型挖掘出有效特徵是一個難點。

賽題數據是時序相關的,相比較無時序的數據需要模型具備更好的泛化能力。

賽題的數據由多表給出,這就要求參賽選手能夠構建一個處理多表之間多樣的連接關係的自動化機器學習系統。多表數據無疑提升了對系統的穩定性的要求。

時間和內存限制嚴格。

本次AutoML競賽一方面展示出了我們團隊在這個領域的充分積累,另一方面我們自研的AutoML系統可以在工程項目中完美落地,為客戶提供頂級的機器學習解決方案。

問:能否向我們詳盡解讀你們的解決方案?

答:如上圖所示,我們團隊基於所給數據實現了一套支持多表的AutoML框架,包括自動表連接、自動特徵工程、自動特徵選擇、自動模型調參、自動模型融合等步驟,在時間和內存的控制上我們也做了很多優化工作。

註:深蘭科技已開源相關解決方案,感興趣者可訪問 https://github.com/DeepBlueAI/AutoSmart 進行查看

數據預處理

我們通過對錶結構及其屬性的分析,針對不同類型的數據制定不同的數據預處理方案。如上圖所示,我們去除了方差極小的數值特徵,也去除了所有值都不同的類別特徵。同時,在多表間的多個連接key中,我們在主表中種類最多的一個key識別為user。基於識別出的user,可以嘗試在主表的category中識別出session。另外,我們嘗試在category數據中識別出只有兩類有效值的binary數據。我們對category、user、session、key進行重新編碼,對numerical數據嘗試將其轉換為佔用內存更少的類型,將time數據轉換為容易操作的datetime類型。

多表連接

比賽給的數據結構如上圖所示,表和表之間的連接關係可以分為四種,分別是1-1、1-M、M-1、M-M。因為時間和內存的限制,所以我們需要在儘可能保留信息的同時,讓最後生成的表的數據規模不至於過大。而處理多表連接的方式,直接影響到後面的結果。我們針對不同的連接方式採用了不同的方法。首先將四種連接方式分成了兩種類型:類型1包含了1-1、M-1,類型2包含了1-M、M-M。對於類型1,我們可以直接將副表的數據通過key合併到主表上。對於類型2,我們首先對副表做一些聚集操作,生成聚集的結果,而這些聚集的結果可以理解為和主表是類型1的關係。接下來,我們只要對生成聚集的結果做類型1的操作,直接將其合併到主表上即可。並且,對於主表和副表都有時間戳的情況下,我們將副表上離主表當前數據早且最近並且為相同key值的數據合併到主表上。

採樣

因為AutoML比賽方給定的數據集大小未知,在對其進行操作處理之前首先要判斷當前環境是否能夠支持整個數據集共同參與特徵工程及模型訓練過程。我們在讀入數據進入預處理之前做了一次判斷,即要求訓練集與測試集的總樣本數不超過某一個可以接受的閾值。如訓練集與測試集的總樣本數過多,我們就考慮對其進行採樣。

此外,在特徵工程的組合特徵模塊中,同樣用到了採樣的思想。組合特徵的特點是產生的特徵數量多、特徵工程的時間長、內存峰值高、起作用的特徵數量少。因此,為了避免內存溢出,我們在做組合特徵之前,在小數據集上進行特徵工程,經過篩選後得到真正起作用的特徵,再在整個數據集上僅做出這些有效的特徵這樣不僅可以減少系統運行時間也能避免內存溢出的風險。

自動特徵工程

特徵工程部分往往是數據挖掘競賽的關鍵核心內容,也是我們團隊在比賽中取得顯著優勢的重要因素。我們通過LightGBM模型來驗證特徵效果和進行自動化特徵選擇,如上圖所示,在自動特徵工程階段,我們將特徵工程根據特徵組合的階段分為多個階段,在每一個階段結束後,我們都會做一次特徵選擇來篩掉那些在這一階段做出而不起作用的特徵,來避免內存溢出並且加速最終的模型訓練。為了在更短的時間內得到更有效的組合,我們先進行數據的採樣,根據不同數據集的數據量大小以及特徵重要性篩選出適量的不同類型的特徵兩兩組合形成新的特徵,然後在全量數據上重現有用的特徵 ,在希望挖掘到有用的特徵的同時,盡量減小內存溢出的風險。我們通過結合特徵重要性及序列後向選擇演算法,設置一個閾值,將在參與模型訓練中,篩出重要性較低的特徵而儘可能小地損失模型精度。我們還嘗試了基於特徵的信息增益來對特徵進行篩選,亦或是對兩種篩選方法進行結合,但因為沒能找到更好的切分點,最終還是使用了基於特徵重要性的方法。

我們將特徵分成幾個模塊。第一個模塊是分類特徵,我們對分類特徵進行了均值編碼,頻率編碼等,更充分地提取類別信息。第二個模塊是實體特徵,我們對每個表中的主鍵進行識別,將其區分出user、key、session等時序場景常見的實體(key是某種未知的實體),我們通過特徵工程對這些實體進行建模,對實體的歷史信息(數值特徵、分類特徵、時間特徵等)進行不同方式的聚合。第三個模塊是時序特徵,我們根據時間將數據劃分為多塊,將上一個時間塊的特徵通過實體聯結到下一個時間塊的相同實體作為特徵,這樣使得模型可以有更好的時序預測能力以及泛化能力。第四個模塊是組合特徵,我們基於前面模塊所產生的一階特徵(包括時間、類別、數值、多值類別等特徵)進行多種不同組合。

同時,因為本次競賽的時間和內存的控制比較嚴格,在面對百萬級的數據量上,每個特徵生成幾乎都要控制在幾秒內生成,為了滿足這一要求,我們的代碼加入了許多優化。比如對於類別數據在多類別數據中的位置這一特徵,如果用傳統的Pandas實現,時間會達到幾個小時,而加入多線程之後,情況會有所改善,但是仍舊要消耗大量的時間。我們退而求其次,使用numpy來實現該特徵,特徵的生成時間直接到達了幾十秒的級別,但是這仍舊不能滿足我們的要求。最後我們對這塊代碼使用cython去優化,並且對cython代碼進行精雕細琢,最後該特徵的生成只需要幾秒。

類別不平衡問題處理

我們對類別不平衡的數據在訓練時做了處理。正負樣本比例超過1:3時,我們採用欠採樣的方式,緩和正負樣本不平衡。此外,我們還嘗試通過增加正樣本的權重等方式來優化類別不平衡帶來的問題。在模型融合的部分,我們在保留原始較少的正樣本的同時,換一批負樣本來進行訓練,這樣能夠儘可能保留更多的原始數據的信息,同時緩解類別不平衡的問題。

建模

由於LightGBM在訓練速度和性能都表現得很不錯,我們使用LightGBM作為我們的模型。

對於參數調優,我們加入了先驗知識,設置了多組不同的學習率,通過early-stopping來選擇合適的學習率保證模型能訓練一定的輪數,並且通過驗證集選擇最好的學習率。如上圖所示,我們通過學習率衰減來使得LightGBM更快地收斂。由於時間的限制,我們對數據進行採樣,通過對採樣後的數據進行參數搜索,加快了參數調優速度,對性能只有很小的損失。

由於比賽環境對時間和內存做了嚴格的限制,我們在模型融合方面考慮了bagging、blending、stacking等方案,最終選用了使用bagging的方法。如上圖所示,我們模擬一次簡單的訓練來預估真實數據集所需要的訓練和預測時間,如時間不足則選擇在訓練時early-stopping,允許精度上的損失來保證代碼能夠在規定時間內運行完畢。如時間充裕,則通過當前剩餘時間計算允許多少個模型進行融合。

運行時間優化

我們的時間控制在各個過程中都有體現。在自動化數據處理和自動化特徵工程的過程中,我們使用Cython對編碼以及一些生成效率較慢的特徵進行加速。這裡舉一個特徵為例,對於兩列數據,一列為category類型的數據,一列為multi-category類型的數據,我們提前判斷了兩列數據的數據項集具有交集,我們要計算這一category列中的數據項在multi-category列對應的數據項集中的位置信息。比如說有有一條數據。data : [ 2137 , (134,2137,576,816) ] ,前者2137在後者的第2個位置上。所以這條數據該特徵為2。如果沒有出現的話,規定為0。對於這一特徵,如果我們使用pandas提供的apply介面來實現,在本次競賽的環境下,該類特徵的生成需要大約幾個小時的時間。考慮到DataFrame不適合做遍歷,以及介面泛化性帶來的性能上的損失。我們使用Numpy,做遍歷來實現該特徵,能夠讓特徵的生成達到分鐘級。而本次競賽的時間和內存有嚴格的控制,像那些需要超過10秒才能生成的一類特徵就算非常耗時的了。之後我們採用Cython,應用Cython提前編譯,靜態類型等機制我們將該特徵的生成時間控制在了10秒內。其中生成該特徵的過程中有一些細節。比如如果在Cython中繼續使用Python原生類型,那麼遍歷的效率還是比較緩慢。但是multi-category類型的數據存儲又不好離開Python原生類型的支持。考慮我們在生成特徵的過程中,主要是對multi-category類型做遍歷操作,所以可以使用一個數組去存儲multi-category的每個數據項,並且用額外一個數組去保存每個multi-category的數據項集的長度。這樣根據其長度數組和數據數組,我們就能做一個高效的遍歷。在測試這段優化的過程中,純粹的Python代碼經過Cython優化,效率大概能到60秒。而經過這段優化,很輕鬆就能到達10秒內(測試環境就是以我們的本地計算機為主,線上環境會多一些時間)。

在模型集成部分,我們會做提前計算,記錄到當前用時,通過訓練模型幾個輪次來計算出模型啟動的時間以及模型訓練每一輪數據所消耗的時間,通過這兩個時間,我們能夠預估出後續的參數調優,模型訓練的時間。從而決定最後模型融合的數量。

時間優化前後對比

運行內存優化

在內存控制方面,我們首先實現了一個內存的監聽器。我們首先完整運行一輪我們的系統,記錄下內存情況,對不同數據集的內存峰值進行分析。可以發現的是,內存峰值往往就出現在幾個典型的地方。比如:數據合成時、在模型開始訓練時、某些特徵生成時。經過分析,可以概括為幾個點,其中比較典型的是數據合成時,如果使用pandas的介面pandas.concat進行數據合併,其合併過程中,會生成大約兩倍當前數據內存的量。這個是顯然的,因為其合併返回的結果不是就地的,而是創建出第三塊內存。因此,我們將合成的過程改為按列賦值,這樣合併時就幾乎不存在內存峰值了。但是這麼做,同時會帶來較差的時間效率。所以在系統的早期,內存比較寬鬆的情況下,我們仍舊採用pandas的介面來進行對數據的合併。

另外,我們同樣對訓練預測時內存的情況進行了提前計算,在最後的特徵篩選的過程中,我們會計算模擬出在生成多大的數據量下,能夠完整進行系統後續的過程。從而來控制最後篩選出來的數據量。並且在最後一次特徵篩選前,生成特徵時,我們也會先時候小數據集進行一個模擬過程,來計算出整個過程中的內存情況,來對生成期生成的特徵數量進行一個控制。

最後,我們會做一些比較精細的內存管理,在變數生命周期結束的時候,我們都會對其進行內存回收。以下是我們內存優化前後的一個對比。裡面包含了比賽中給的5個數據集的運行過程中的內存情況。

內存優化前後對比

系統測試

對於系統的測試,我們分為了兩個方面進行。第一個方面是測試系統的擴展性,第二個方面是測試系統的性能。

對於系統的擴展性,我們測試過如下:

對於不同的數據類型缺失的情況。

對於不同數據類型數值全為空的情況。

對於表的結構為單表、複雜多表的情況。

以及其他一系列的極限狀態。而對於系統的性能方面,我們測試過如下:

擴大數據的條目,就本次競賽的5個數據集而言,我們擴展每個數據集數據條目2倍,3倍,6倍都能夠在規定的時間和內存下順利運行。

擴大數據的欄位數量,同樣,我們擴展5個數據集的欄位數量2倍也能夠順利運行。

構造特定的數據集,觀察是否會因為某些組合特徵而系統崩潰。最後測試了大約數十個構造的極端數據集都能夠運行成功。

限制數據集允許運行時間,我們通過調整數據集允許運行時間,觀察我們的系統是否能夠自適應調整自身的運行時間。我們調整本次競賽中原本時間就比較緊張的A數據集以及數據量較大的B數據集,將其允許的運行時間變為原來的1/2,1/3,甚至是1/4。我們的系統都能夠順利運行。

問:您認為該模型得以奪魁的原因是什麼?

答:在這次競賽中我們的工作圍繞著競賽的挑戰而進行,主要有幾個比較重要的過程:自動化多表數據處理、自動多表連接、自動化特徵工程、自動化模型構建、選擇和融合。同時為了滿足競賽的時間和內存的需求,我們在代碼上做了非常多的優化工作,比如使用了多線程、Cython、預處理、提前估算等方法。最後我們的成績相當不錯,A,B榜單上均在多個任務集上有比較大的優勢。

問:AutoML競賽和其他機器學習競賽有哪些不同?

答:與傳統數據挖掘競賽不同的是,AutoML競賽中,參賽選手只知道數據的類型(數值變數、分類變數、時間變數、多值分類變數等),而不知道數據的含義,這毫無疑問會增加特徵工程的難度,如何挖掘到有效的通用特徵成為一個難點。

AutoML競賽主要包含兩個階段,Feedback階段和AutoML階段,這兩個階段所使用的任務數據集是不一樣的,而傳統數據挖掘競賽的A/B榜階段都是在同一個任務不同數據集上進行測試,因此AutoML競賽更要求參賽選手構建一套通用的AutoML系統,在不同任務上都能夠取得很好效果。

AutoML競賽嚴格限制運行時間和內存,如果未能在規定時間和內存內完成系統建模則無法參與最終排名,因此在系統運行過程中需要精確預估時間和內存,對耗時耗內存的部分代碼需要進行深入優化。

問:當初選擇參加這個比賽的原因是什麼?與深蘭科技的業務有哪些結合之處?

答:傳統機器學習極為耗費人力、技術門檻高,也讓沒有機器學習背景的人無法高效利用時序關係型數據。AutoML 近年來成為了機器學習重要的研究方向。該技術在模型選擇、神經架構搜索、特徵工程等方面取得了較大的成功,大幅降低了機器學習的應用門檻,讓沒有機器學習背景的人同樣可以輕鬆使用。這次AutoML競賽針對時序關係型數據的 AutoML 挑戰賽,希望讓更多的數據科學家和開發者加入其中,集思廣益,從而讓 AutoML 更好的利用時序關係型數據,提升模型的預測性能,讓 AutoML 解決方案能夠更加符合實際應用的需求。因此,我們認為這次AutoML競賽對推動AutoML的發展具有重要意義。

深蘭科技在自身產品的開發中也已使用了自研AutoML系統,以深蘭科技應用於建青實驗學校的AI教育「一手通」為例,通過這款系統設備採集的數據,再經過AutoML系統自動建模可以分析出學生的興趣愛好,隨後進行個性化教學。在堅持加強基礎研究的道路上,深蘭科技披荊斬棘、不忘初心,將繼續把更多搭載先進技術的產品推向市場,真正實現服務民生。

問:據了解,除了 KDD CUP,深蘭科技近期還斬獲了多個比賽的冠軍(如 IEEE ISI 、CVPR FGVC 等),能向我們介紹一下深蘭科技在這方面的投入情況嗎?

答:深蘭科技成立之初即完整地規划了深蘭科學院的架構,並陸續成立了五大研究院,致力於人工智慧基礎研究和應用開發。在核心技術的基礎研究方面,包括計算機視覺、自動駕駛、生物識別和認知智能等四大領域。每次國際會議競賽都是驗證深蘭科技基礎演算法和技術實力的機會,我們同時也希望這些方案能為更多行業提供借鑒。尤其本屆KDD Cup AutoML競賽開源了解決方案,其中有許多優秀的思路和方法在競賽中得以驗證,不但共同推進了AutoML的發展,也提供了交流學習的機會。深蘭科技矢志不渝,不但為自身的商業化應用落地持續注入強勁能量,更希望賦能更多行業,將「人工智慧,服務民生」的理念落實到底。

問:對於有興趣參賽的青年 AI 開發人員,深蘭科技有何建議給到他們?

答:有興趣參加機器學習競賽的AI開發人員主要分為兩種,一種是在校學生,另一種是在職的。對於在校的同學來說,參加機器學習競賽可以快速提升自己的專業技能,也能積累實戰經驗,對找實習和找工作都有很大幫助;對於在職的同學來說,希望在業餘競賽的同時能把競賽中學習到的東西應用到當前工作中來,由於競賽需要花費不少時間,也建議隊伍中有時間相對比較多的在校學生,這樣能夠更好的平衡工作和競賽的時間。

多學習一些競賽的Top隊伍的分享,從這些分享中多總結多思考,對於特定任務可以結合實際業務場景深入探索。

在機器學習競賽中取得 top 的成績不僅要實力也需要一定的運氣,放鬆心態,帶著學習的態度去玩比賽,在玩的過程中,不僅能接觸各種AI應用場景,也能提升自己的能力並認識更多相同興趣的朋友,這就是最大的收穫。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

如何使用 Google的AutoAugment 改進圖像分類器

TAG:AI研習社 |