featuretools 研究記錄
最近 survey 到了一個很方便的特徵工程工具,叫 featuretools,其特色是專門針對關聯式資料庫的資料表做自動特徵生成,其強大之處在於可以一次關聯到好幾張表,並且可指定多種特徵公式來自動產生特徵,以下來介紹我的學習心得。
首先一樣透過 pip 來安裝如下:
1 | pip install featuretools |
featuretools 裡面有個非常重要的概念叫 **DFS (Deep Feature Synthesis)**,中文叫深度特徵生成,一個很潮的名詞。其實概念很簡單,就是藉由著資料表間的主鍵與外鍵的關聯去自動產生關聯的特徵。看看下圖的官方例子 Customers
這張表就是透過 Customer id
與 Purchases
產生關聯,並且利用 primitive
去產生特徵,所謂的 primitive
就好像各種不同的特徵產生公式,featuretools 已內建很多種可供選擇。這裏選用 Max
這一個 primitive
,對 Purchase Amount
這個欄位計算其最大值,如此就產生以下結果了。
再來是簡單的程式使用例子,首先載入需要用到的程式模組,featuretools 也內建了方便的 demo 用資料集可以用來快速展現 DFS 的功能。
1 | import featuretools as ft |
sessions、customers、transactions 分別代表彼此有關聯的資料表,這裏皆以 pandas dataframe 的形式儲存。在 featuretools 定義裡這些表就是所謂的 entity,可以作為 DFS 的執行目標單位。以下為這三張表的部分記錄。
1 | customers_df.head() |
1 | sessions_df.head() |
1 | transactions_df.head() |
可以發現這些表彼此間有主鍵外鍵的關係,也因此我們也必須明確定義給 featuretools 知道,如以下所示。
1 | # 定義 relationship |
也別忘了定義 entity,除了要指名 entity 的 dataframe 之外,也要指定欄位做為主鍵。
1 | # 定義 entity |
當 entity 與 relationships 都指定好了話,就可以執行看看 DFS 了,程式碼如下,第 4 行表示要被作用的目標 entity,第 5 行 agg_primitives
這裡我採用了內建的 Max
primitive,第 6 行 max_depth
表示 DFS 要關聯的深度,即表示從當前的表中依照外鍵往回追朔到其他表的深度,例如 customers
要接到 transactions
要接續關聯 2 次,就像 customers -> sessions -> transaction
。
1 | feature_matrix_customers, features_defs = ft.dfs( |
最後的結果如下,可以看到新的特徵欄位成功的出現在原來 customers
表上了,多了 Max
以及還有其他的時間欄位,時間欄位像是 MONTH, DAY, YEAR
是預設從 join_date
出來的,也是一種 primitive。總之,featuretools 還有非常多種參數可以調校,用得好的話真的事可以加快分析流程啊。
reference: