沒有什麼是一成不變的,尤其是在資料科學領域。畢竟,一些庫、演算法、工具一直在更新迭代。
然而,一個永遠不會消失的趨勢就是提高自動化水平。
近年來在自動化模型選擇和超引數調整方面已經取得了進展,但機器學習流程中最重要的一點,特徵工程,在很大程度上卻被忽略了。這個關鍵領域中最好的入口是Featuretools(一個開源Python庫)。在本文中,我們將使用此庫來了解自動化特徵工程如何改變機器學習的方式。
Featuretools:https://docs.featuretools.com/#minute-quick-start
自動化特徵工程是一種相對較新的技術,但在應用它來解決大量的基於真實資料集的資料科學問題後,我們確信它應該是任何機器學習工作的標準流程的一部分。在本文,我們將說說其中兩個專案的結果和結論,並在GitHub上以Jupyter Notebooks格式提供完整程式碼。
程式碼連結:https://github.com/Featuretools/Automated-Manual-Comparison
每個專案都強調了自動化特徵工程的一些優點:
貸款還款預測:與手動特徵工程相比,自動化特徵工程可將機器學習的開發時間縮短10倍,同時提供更好的建模效能。
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Loan%20Repayment
零售支出預測:自動化特徵工程通過內部處理時間序列篩選器來建立有意義的特徵並防止資料洩漏,從而成功部署模型。
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Retail%20Spending
特徵工程:手動與自動化
特徵工程是獲取資料集和構建解釋變數,即,那些可以用來訓練預測問題中的機器學習模型的“特徵”的過程。通常,資料分佈在多個表中,我們須要將它們整合到一個表中,並將各個特徵作為列標題,將相應的觀察值填充到各行。
傳統的特徵工程方法使用領域知識一次僅構建一個特徵,這是一個繁瑣、耗時且容易出錯的過程,我們稱為手動特徵工程。手動特徵工程的程式碼與問題有關,必須為每個新資料集重寫。
自動化特徵工程使用一種適用於任何問題的框架,從一組相關資料表中自動提取有用且有意義的特徵,改進了傳統手工特徵工程的標準流程。它不僅減少了特徵工程所花費的時間,還建立了可解釋的特徵,並通過過濾與時間相關的資料來防止資料洩漏。
自動化特徵工程比手動特徵工程更高效,可重複性更高,使你能夠更快地構建更好的預測模型。
貸款還款:更快地建立更好的模型
資料科學家面臨的家庭信貸貸款問題的主要困難(目前在Kaggle上執行的機器學習競賽,目標是預測客戶是否能夠償還貸款)是資料的大小和傳播。全部資料分散在七個表中的5800萬行中。 機器學習需要一個單獨的表進行訓練,因此特徵工程意味著在一個表中合併每個客戶的所有資訊。
我們首先嚐試了使用傳統的手動特徵工程解決這個問題:總共花了10個小時,手工建立了一組特徵。 首先,閱讀了其他資料科學家的文章,探索資料,並研究問題所在的領域,以獲得必要的領域知識。 然後將知識翻譯成程式碼,一次構建一個特徵。 作為單個手動特徵的一個示例,找到了客戶對之前貸款的出現延遲付款的總次數,這項操作需要使用3個不同的表格。
最終的手工設計的特徵工程表現相當不錯,比基線特徵(相對於最高排行榜得分)提高了65%,表明了正確的特徵工程的重要性。
然而,“效率低下”都不足以形容這個過程的低效。 對於手動特徵工程,我最終每個特徵花費超過15分鐘,因為我使用的是傳統方法,一次只能建立一個特徵。
除了繁瑣耗時外,手動特徵工程還包括:
特定問題:我寫了幾個小時的所有程式碼都不能應用於任何其他問題
容易出錯:每行程式碼都有犯錯誤的可能
此外,最終的手工設計特徵受到人類創造力和耐心的限制:我們只能建立能想到的特徵,而且能用來建立特徵的時間也是有限的。
自動化特徵工程的意義是通過在一組相關表中使用可應用於所有問題的程式碼,自動構建數百個有用特徵,來超越這些限制。
從手動到自動特徵工程
正如Featuretools中實現的那樣,自動化特徵工程讓新手都可以從一組相關資料表中建立數千個相關特徵。我們只需要知道我們表的基本結構以及它們之間的關係,我們在稱為實體集的單個資料結構中跟蹤它們。一旦我們有一個實體集,便使用一個名為深度特徵合成(DFS)的方法,我們就能夠在一次函式呼叫中構建數千個特徵。
DFS使用被稱為“基元(primitives)”的函式來聚合和轉換我們的資料。這些基元(primitives)可以像獲取列的平均值或最大值一樣簡單,或者它們可以是複雜的並且基於專業知識的,因為Featuretools允許我們定義我們自己的自定義基元。
特徵基元(primitives)包括我們已經手動完成的許多操作,但是使用Featuretools,我們可以在任何關聯式資料庫中使用相同的確切語法,而不是重寫程式碼以將這些操作應用於不同的資料集。此外,當我們將基元堆疊在一起以建立深層特徵時,DFS的強大更加得以顯現。
有關DFS技術發明人之一的部落格文章:https://blog.featurelabs.com/deep-feature-synthesis/
深度特徵合成是靈活的(這也是它在資料科學問題領域被廣泛使用的主要原因)、功能強大的(通過建立深層特徵來揭示我們資料的見解)。
我將為你提供設定所需的幾行程式碼,但DFS的操作只需一行。在這裡,我們使用資料集中的所有7個表為每個客戶端建立數千個特徵(ft是匯入的featuretools庫):
# Deep feature synthesis
feature_matrix, features = ft.dfs(entityset=es,target_entity='clients',agg_primitives = agg_primitives,trans_primitives = trans_primitives)
以下是我們從Featuretools自動獲得的1820個特徵中的一些:
客戶以前支付的最高貸款總額。這是在3個表中使用MAX和SUM基元(primitives)建立的。
客戶先前信用卡債務平均數的百分位排名。這是在2個表中使用PERCENTILE和MEAN基元(primitives)建立的。
客戶是否在申請過程中提交了兩份檔案。 這使用AND轉換基元(primitives)和1個表。
這些特徵中的每一個都是使用簡單的聚合構建的,因此是可解釋的。Featuretools建立了許多與我手動構建的相同的特徵,但也有成千上萬的我從未想過或沒有時間完成的特徵。並非每一個特徵都與問題相關,而且某些特徵之間相似度很高,但是特徵太多總位元徵太少要好!
經過一些特徵選擇和模型優化後,與手動特徵相比,這些特徵在預測模型中略勝一籌,整個模型開發時間為1小時,與手動過程相比減少了10倍。Featuretools要快得多,因為它需要更少的領域知識和明顯更少的程式碼。
我承認學習Featuretools需要花費一些時間,但這是一項可以帶來回報的投資。花了一個小時左右來學習Featuretools後,你可以將其應用於任何機器學習問題。
以下圖表總結了我對貸款償還問題的經驗:
自動和手動進行特徵工程的耗時、特徵數量和效能之間的比較。
開發時間:完成特徵工程程式碼耗時:手動10小時,自動1小時
該方法生成的特徵數量:30個手動特徵與1820個自動特徵
相對於基線的改善,即,使用受過特徵訓練的模型與公共排行榜最高得分相比的增益百分比:65%(手動結果)v.s.66%(自動化結果)
我的想法是,自動化特徵工程不會取代資料科學家,而是通過顯著提高效率,使資料科學家們可以將更多時間花在機器學習流程的其它方面。
此外,我為第一個專案編寫的Featuretools程式碼可以應用於任何資料集,而手動的特徵程式碼必須被丟棄,併為下一個資料集完全重寫!
零售支出:構建有意義的特徵並防止資料洩漏
對於第二個資料集,即線上時間戳客戶交易的記錄,預測任務是將客戶分為兩個部分,即下個月花費超過500美元的人和不會花費超過500美元的人。
但是,相對於僅使用所有客戶一個月的資料,我們的做法是將每個客戶多次標記。我們可以將他們在5月份的支出用作一個標籤,然後是6月份支出,依此類推。
多次使用每個客戶作為觀察變數會給建立訓練集造成困難:在為特定月份的客戶製作特徵時,即使我們可以訪問這些資料,我們也不能使用未來幾個月的任何資訊。
在實際中,我們永遠不會有未來的資料,因此不能用它來訓練模型。很多公司都在這個問題上掙扎,因為部署的模型是使用無效資料訓練的,所以在現實世界中的表現要比在開發中糟糕很多。
幸運的是,如果使用Featuretools,那麼確保時間序列問題中的資料有效性將變得很簡單。在深度特徵合成功能中,我們設定了一個如上所示的資料框,其中中止時間表示我們不能使用任何資料作為標籤的點,並且Featuretools在構建特徵時自動將時間考慮在內。
指定月份的客戶特徵是利用指定月份之前的資料構建的。請注意,除了新增了中止時間,這個建立特徵集的過程與貸款還款問題的過程相同。
# Deep feature synthesis
feature_matrix, features = ft.dfs(entityset=es, target_entity='customers',agg_primitives = agg_primitives,trans_primitives = trans_primitives,cutoff_time = cutoff_times)
執行DFS的結果是一個特徵表,每個客戶每月有一個特徵。我們可以使用這些特徵來訓練帶有我們標籤的模型,然後對任何月份進行預測。此外,我們可以放心,我們模型中的特徵不會使用未來的資訊,否則會導致不公平的優勢併產生誤導性的訓練分數。
使用自動化特徵,在預測客戶月支出類別時,我能夠建立一個機器學習模型,與已知的基線0.69(猜測與上個月相同的支出水平)相比,它可以達到UOC (Roc曲線下的面積)= 0.90。
除了提供令人印象深刻的預測效能之外,Featuretools的實現還給了我同樣有價值的東西:可解釋的特徵。看看隨機森林模型中15個最重要的特徵:
特徵重要性告訴我們,客戶之前花費了多少SUM(purchases.total),以及購買數量SUM(purchases.quantity)是預測他們將在下個月花多少錢的最重要的預測因素。這些是我們可以手工構建的特徵,但是我們將不得不擔心洩漏資料並建立一個在開發方面比在部署方面做得更好的模型。
如果已經有了為建立有意義的特徵而存在的工具而且無需擔心這些特徵的有效性,那麼為什麼要手動?此外,自動化特徵是簡明易懂的,並且可以告訴我們實際中的推理過程。
自動化特徵工程確定了最重要的訊號,實現了資料科學的主要目標:揭示隱藏在大量資料中的真理。
即使花在手動特徵工程上的時間比使用Featuretools花費的時間多得多,我也無法開發出一組效能接近的特徵。下圖顯示了在兩個資料集上訓練的模型對未來一個月的客戶銷售進行分類的ROC曲線。曲線越往左上偏說明預測能力越好:
甚至不確定手動特徵是否是使用有效資料製作的,但是使用Featuretools,不必擔心時間依賴問題中的資料洩漏。也許在手動設計有效特徵方面的無能說明我作為資料科學家挺失敗的,但如果有工具能夠安全地為我們做到這一點,何樂而不為呢?
我們在日常生活中使用自動安全系統,Featuretools中的自動化特徵工程是在時間序列問題中構建有意義的機器學習特徵同時提供卓越預測效能的安全保障方法。
結論
這些專案讓我確信自動化特徵工程應該是機器學習工作流程中不可或缺的一部分。該技術並不完美,但仍可顯著提高效率。
自動化特徵工程的主要結論:
實施時間縮短10倍
實現相同水平或更好地建模表現
交付具有現實意義的可解釋特徵
防止資料使用不當,使模型失效
適應現有的工作流和機器學習模型
“工作更聰明,而不是更努力”可能是陳詞濫調,但有時候陳詞濫調有道理:如果有一種方法可以在較小的時間投入中以相同的表現完成相同的工作,那麼顯然這是一種值得學習的方法。
相關報導: