特徵工程自動化如何爲機器學習帶來重大變化

摘要: 機器學習中最重要的領域之一是特徵工程,卻被嚴重地忽視了。這個重要領域中最成熟的工具就是Featuretools,一個開源的Python庫。在本文中,我們將使用這個庫來了解一下特徵工程自動化將如何改變你進行機器學習的方式。

隨着技術的快速發展,在數據科學領域中,包括庫、工具和算法等總會不斷地變化的。然而,一直都有這麼一個趨勢,那就是自動化水平不斷地提高。

近些年來,在模型的自動化選擇和超參數調整方面取得了一些進展,但是機器學習中最重要的領域 — 特徵工程,卻被嚴重地忽視了。這個重要領域中最成熟的工具就是Featuretools,一個開源的Python庫。在本文中,我們將使用這個庫來了解一下特徵工程自動化將如何改變你更好地進行機器學習的方式。

特徵工程自動化是一種相對較新的技術,但是,它解決了許多實際數據集的使用問題。在這裏,我們將用GitHub上的Jupyter Notebooks提供的代碼來看看其中兩個項目的結果和最終結論。

每個項目都強調了特徵工程自動化的一些好處:

  • 貸款償還能力預測:與人工特徵工程相比,自動化的特徵工程可以將機器學習開發的時間縮短10倍,同時提供更好的建模性能表現;(筆記
  • 消費支出預測:自動化的特徵工程通過內部的處理時間序列過濾器來創建有實際意義的特徵,同時防止數據泄漏,從而實現成功的模型部署;(筆記

特徵工程:人工與自動

特徵工程是獲取數據集並構造可解釋的變量—特徵的過程,用於訓練預測問題的機器學習模型。通常,數據分佈在多個表中,並且必須彙集到一個表之中,其中的行包含觀察結果和列中的特徵。

傳統的特徵工程方法是使用相關領域知識創建一個特徵,這是一個冗長、耗時且容易出錯的過程,稱爲人工特徵工程。人工特徵工程是依賴於具體問題的,必須爲每個新數據集重新編寫代碼。

特徵工程自動化通過自動從一組相關的數據表中提取有用且有意義的特徵,並使用一個可應用於任何問題的框架,來改進這個標準工作流。它不僅減少了在特徵工程上花費的時間,而且還創建了可解釋的特徵,並通過過濾具有時間依賴性的數據來防止數據泄漏。

貸款償還:建立更快更好的模型

當數據科學家在處理家庭信貸貸款問題的時候,所面臨的主要難題是數據的大小和分佈。看看完整的數據集,你會發現面對的是分佈在7個表中的5800萬行數據。

特徵工程需要將一組相關表中的所有信息放到一個表中

我曾經使用傳統的人工特徵工程花了10個小時創建了一組特徵。首先,我查閱了其他數據科學家的成果,還查看了相關的數據,並研究了問題域,以獲得必要的相關領域知識。然後我將這些知識翻譯成代碼,一次創建一個特徵。作爲單一的人工特徵的一個例子,我找到了客戶以前貸款的逾期還款總數,這一操作需要用到3個不同的表。

最終人工設計的特徵表現的相當好,比基線特徵提高了65%,表明了正確特徵設計的重要性

然而,效率卻非常低下。對於人工特徵工程,我最終花了超過15分鐘來完成每個特徵,因爲我使用傳統的方法一次生成一個特性。

人工特徵工程過程

除了單調乏味和耗時之外,人工特徵工程還有以下問題:

  • 用於特定問題:我花費了很長時間編寫的代碼並不能應用於任何其它的問題;
  • 易錯:每一行代碼都會有可能導致其它的錯誤;

另外,最終的人工設計的特徵受到了人類創造力和耐心方面的限制:我們只能考慮創建這麼多的特徵,並且只能花費這麼多的時間。

特徵工程自動化的承諾是通過獲取一組相關的表,並使用可以應用於所有問題的代碼,來自動創建數以百計有用的特徵,進而跨越這些限制。

從人工到自動化特徵工程

特徵工程自動化甚至允許像我這樣的新手,在一組相關的數據表中可以創建數以千計的相關特徵。我們只需要知道表的基本結構以及它們之間的關係,我們在一個稱爲實體集的單一數據結構中來跟蹤它們。一旦我們有了一個實體集,使用一個稱爲深度特徵合成(Deep Feature Synthesis,DFS)的方法,我們就能夠在一個函數調用中創建數以千計的特徵了。

使用FeatureTools的特徵工程自動化過程

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個特徵中的一部分:

  • 客戶以前貸款的最高總額。這是在3個表中使用1個MAX 和1個SUM 的primitive得來的;
  • 客戶以前的信用卡平均債務的百分比排名,這在兩個表中使用了百分比(PERCENTILE)和平均值(MEAN)的primitive;
  • 在申請過程中,客戶是否提交了兩份文件,這將使用1個AND 轉換primitive和1個表;

這些特徵中的任何一個都是用簡單的聚合創建的。FeatureTools創建了許多與我手工創建的相同的特徵,但也有數千個是我從未考慮過的。並不是每一個特徵都與問題相關,有些特徵是高度相關的,然而,擁有太多的特徵是一個比擁有太少的特徵更好解決的問題。

在進行了一些功能選擇和模型優化之後,與人工特徵相比,預測模型中的這些特徵要稍好一些,總體開發時間爲1小時,與人工的過程相比減少了10倍。FeatureTools速度更快,這是因爲它需要的領域知識更少,而且要編寫的代碼行也少的相當多。

我承認學習Featuretools需要一點時間成本,但這是一項有回報的投資。在花了一個小時左右的時間學習Featuretools之後,你就可以將其應用於任何機器學習問題了。

以下的圖表總結了我在貸款償還問題上的經驗:

自動和人工特徵工程按時間、特徵的數量和性能之間的比較

  • 開發時間:10小時人工與1小時自動;
  • 該方法創建的特徵數量: 30個人工特徵與1820個自動特徵;
  • 相對於基線提高了的百分比是:65% 人工 vs 66% 自動

我的結論是,特徵工程自動化不會取代數據科學家,而是通過顯著地提高效率,使他們在機器學習的其它方面可以花費更多的時間。

另外,我爲第一個項目編寫的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個最重要的特徵:

15個來自隨機森林模型的最重要的特徵

特徵的重要性告訴我們,預測客戶將在下個月花多少錢的最重要素是他們之前花了多少錢SUM,以及購物的數量SUM。這些是可以手工創建的特徵,但是我們不得不擔心數據泄漏的問題,並創建在開發中比部署中效果要好的模型。

如果可以創建有意義的特徵工具已經存在了,而無需擔心任何特徵的有效性,那麼爲什麼要人工實現呢?另外,自動化特徵在問題的上下文中是完全明確的,並且可以爲我們的實際推理提供信息。

自動化特徵工程識別出最重要的信號,實現了數據科學的主要目標:揭示隱藏在海量數據中的規律。

即使在人工特徵工程上花費的時間比我用FeatureTools花的時間多得多,那麼我也無法開發出一組性能表現接近的特徵。下圖顯示了使用在兩個數據集上訓練的模型對未來一個月的客戶銷售情況進行分類的ROC曲線。左上方的曲線表示更準確的預測:

比較自動的和人工的特徵工程結果的ROC曲線,左側和頂部的曲線表示其性能表現更好。

我甚至不能完全確定人工特徵是否使用了有效的數據,但是通過FeatureTools我不必擔心時間依賴性問題中的數據泄漏。

我們在日常生活中使用自動安全系統,Featuretools中的特徵工程自動化是在時間序列問題中創建有意義的機器學習特徵的安全方法,同時提供了卓越的預測性能表現。

結論

我經過了這些項目之後,確信特徵工程自動化應該是機器學習工作流程中不可或缺的一部分。這項技術並不完美,但依舊能顯著地提高效率。

主要的結論就是特徵工程自動化:

  • 將執行時間縮短了10倍;
  • 在同一級別或更高級別上實現的建模性能;
  • 交付的具有實際意義的可解釋性特徵;
  • 防止使用不正確的數據而導致的模型無效;
  • 適應現有的工作流程和機器學習模型;



本文作者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章