摘要: 機器學習中最重要的領域之一是特徵工程,卻被嚴重地忽視了。這個重要領域中最成熟的工具就是Featuretools,一個開源的Python庫。在本文中,咱們將使用這個庫來了解一下特徵工程自動化將如何改變你進行機器學習的方式。
隨着技術的快速發展,在數據科學領域中,包括庫、工具和算法等總會不斷地變化的。然而,一直都有這麼一個趨勢,那就是自動化水平不斷地提升。html
近些年來,在模型的自動化選擇和超參數調整方面取得了一些進展,可是機器學習中最重要的領域 — 特徵工程,卻被嚴重地忽視了。這個重要領域中最成熟的工具就是Featuretools,一個開源的Python庫。在本文中,咱們將使用這個庫來了解一下特徵工程自動化將如何改變你更好地進行機器學習的方式。git
特徵工程自動化是一種相對較新的技術,可是,它解決了許多實際數據集的使用問題。在這裏,咱們將用GitHub上的Jupyter Notebooks提供的代碼來看看其中兩個項目的結果和最終結論。github
每一個項目都強調了特徵工程自動化的一些好處:算法
特徵工程是獲取數據集並構造可解釋的變量—特徵的過程,用於訓練預測問題的機器學習模型。一般,數據分佈在多個表中,而且必須聚集到一個表之中,其中的行包含觀察結果和列中的特徵。數據庫
傳統的特徵工程方法是使用相關領域知識建立一個特徵,這是一個冗長、耗時且容易出錯的過程,稱爲人工特徵工程。人工特徵工程是依賴於具體問題的,必須爲每一個新數據集從新編寫代碼。安全
特徵工程自動化經過自動從一組相關的數據表中提取有用且有意義的特徵,並使用一個可應用於任何問題的框架,來改進這個標準工做流。它不只減小了在特徵工程上花費的時間,並且還建立了可解釋的特徵,並經過過濾具備時間依賴性的數據來防止數據泄漏。數據結構
當數據科學家在處理家庭信貸貸款問題的時候,所面臨的主要難題是數據的大小和分佈。看看完整的數據集,你會發現面對的是分佈在7個表中的5800萬行數據。框架
我曾經使用傳統的人工特徵工程花了10個小時建立了一組特徵。首先,我查閱了其餘數據科學家的成果,還查看了相關的數據,並研究了問題域,以得到必要的相關領域知識。而後我將這些知識翻譯成代碼,一次建立一個特徵。做爲單一的人工特徵的一個例子,我找到了客戶之前貸款的逾期還款總數,這一操做須要用到3個不一樣的表。機器學習
最終人工設計的特徵表現的至關好,比基線特徵提升了65%,代表了正確特徵設計的重要性。ide
然而,效率卻很是低下。對於人工特徵工程,我最終花了超過15分鐘來完成每一個特徵,由於我使用傳統的方法一次生成一個特性。
除了單調乏味和耗時以外,人工特徵工程還有如下問題:
另外,最終的人工設計的特徵受到了人類創造力和耐心方面的限制:咱們只能考慮建立這麼多的特徵,而且只能花費這麼多的時間。
特徵工程自動化的承諾是經過獲取一組相關的表,並使用能夠應用於全部問題的代碼,來自動建立數以百計有用的特徵,進而跨越這些限制。
特徵工程自動化甚至容許像我這樣的新手,在一組相關的數據表中能夠建立數以千計的相關特徵。咱們只須要知道表的基本結構以及它們之間的關係,咱們在一個稱爲實體集的單一數據結構中來跟蹤它們。一旦咱們有了一個實體集,使用一個稱爲深度特徵合成(Deep Feature Synthesis,DFS)的方法,咱們就可以在一個函數調用中建立數以千計的特徵了。
DFS使用稱爲「primitives」的函數來進行聚合和轉換數據。這些primitives能夠簡單到僅獲取一個平均值或列的最大值,也能夠複雜到基於主題的專業知識,由於FeatureTools容許咱們定義本身的primitives。
特徵primitives包括許多人工操做,可是經過使用FeatureTools,咱們能夠在任何關係數據庫中使用相同準確的語法,而不是再從新編寫代碼並在不一樣的數據集中使用相同的操做。此外,當咱們將primitives相互堆疊在一塊兒來建立深層次的特徵時,DFS的威力就來了。
深度特徵合成是靈活的,它被容許應用於任何數據科學領域的問題。它同時也是很強大的,經過建立深度特徵來揭示咱們對數據的推斷。
我會爲你省去環境設置所需的幾行代碼,但DFS只在一行中運行。在這裏,咱們使用數據集中的全部7個表爲每一個客戶生成數千個特徵:
# Deep feature synthesis feature_matrix, features = ft.dfs(entityset=es, target_entity='clients', agg_primitives = agg_primitives, trans_primitives = trans_primitives)
下面是咱們自動從FeatureTools得到的1820個特徵中的一部分:
這些特徵中的任何一個都是用簡單的聚合建立的。FeatureTools建立了許多與我手工建立的相同的特徵,但也有數千個是我從未考慮過的。並非每個特徵都與問題相關,有些特徵是高度相關的,然而,擁有太多的特徵是一個比擁有太少的特徵更好解決的問題。
在進行了一些功能選擇和模型優化以後,與人工特徵相比,預測模型中的這些特徵要稍好一些,整體開發時間爲1小時,與人工的過程相比減小了10倍。FeatureTools速度更快,這是由於它須要的領域知識更少,並且要編寫的代碼行也少的至關多。
我認可學習Featuretools須要一點時間成本,但這是一項有回報的投資。在花了一個小時左右的時間學習Featuretools以後,你就能夠將其應用於任何機器學習問題了。
如下的圖表總結了我在貸款償還問題上的經驗:
個人結論是,特徵工程自動化不會取代數據科學家,而是經過顯著地提升效率,使他們在機器學習的其它方面能夠花費更多的時間。
另外,我爲第一個項目編寫的Featuretools代碼能夠應用於任何數據集,而人工工程的代碼則無法再利用。
第二個數據集,在線時間戳的客戶交易記錄,預測問題是將客戶分爲兩個部分,消費超過500美圓的客戶和消費不會超過500美圓的客戶。可是,不是對全部標籤使用一個月,而是每一個客戶屢次使用一個標籤。咱們能夠把他們5月份的消費支出做爲一個標籤,而後6月份的,等等。
在部署中,咱們永遠不會有將來的數據,所以沒法將其用於訓練模型。企業一般會遇到這個問題,而且常常部署一個在實際應用中比在開發中更糟糕的模型,由於這是使用無效的數據來進行訓練的。
幸運的是,要確保咱們的數據在時間序列問題中是有效的,這在FeatureTools中很簡單。在深度特徵合成函數中,咱們傳遞一個如上圖所示的dataframe,其中截止時間表示咱們不能使用任何標籤數據中過去的時間點,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)
執行深度特徵合成的結果是一個特徵表,每一個客戶一個月一個。咱們可使用這些特徵來訓練一個帶有標籤的模型,而後能夠對任何月份進行預測。此外,咱們能夠放心,模型中的特徵不會使用致使不公平優點的將來信息,併產生誤導訓練的分數。
有了自動化特徵,我可以建立一個機器學習模型,在預測一個月內客戶消費支出類別的時候,與已知爲0.69的基線相比,ROC AUC達到0.90。
除了提供使人印象深入的預測能力以外,FeatureTools的實現還爲我提供了一些一樣有價值的東西:可解釋的特徵。看一下隨機森林模型中的15個最重要的特徵:
特徵的重要性告訴咱們,預測客戶將在下個月花多少錢的最重要素是他們以前花了多少錢SUM,以及購物的數量SUM。這些是能夠手工建立的特徵,可是咱們不得不擔憂數據泄漏的問題,並建立在開發中比部署中效果要好的模型。
若是能夠建立有意義的特徵工具已經存在了,而無需擔憂任何特徵的有效性,那麼爲何要人工實現呢?另外,自動化特徵在問題的上下文中是徹底明確的,而且能夠爲咱們的實際推理提供信息。
自動化特徵工程識別出最重要的信號,實現了數據科學的主要目標:揭示隱藏在海量數據中的規律。
即便在人工特徵工程上花費的時間比我用FeatureTools花的時間多得多,那麼我也沒法開發出一組性能表現接近的特徵。下圖顯示了使用在兩個數據集上訓練的模型對將來一個月的客戶銷售狀況進行分類的ROC曲線。左上方的曲線表示更準確的預測:
我甚至不能徹底肯定人工特徵是否使用了有效的數據,可是經過FeatureTools我沒必要擔憂時間依賴性問題中的數據泄漏。
咱們在平常生活中使用自動安全系統,Featuretools中的特徵工程自動化是在時間序列問題中建立有意義的機器學習特徵的安全方法,同時提供了卓越的預測性能表現。
我通過了這些項目以後,確信特徵工程自動化應該是機器學習工做流程中不可或缺的一部分。這項技術並不完美,但依舊能顯著地提升效率。
主要的結論就是特徵工程自動化:
本文爲雲棲社區原創內容,未經容許不得轉載。