設計思路
ML之FE:基于load_mock_customer資料集(模拟客戶)利用featuretools工具實作自動特征生成/特征衍生

輸出結果
customer_id zip_code join_date date_of_birth
0 1 60091 2011-04-17 10:48:33 1994-07-18
1 2 13244 2012-04-15 23:31:04 1986-08-18
2 3 13244 2011-08-13 15:42:34 2003-11-21
3 4 60091 2011-04-08 20:08:14 2006-08-15
4 5 60091 2010-07-17 05:27:50 1984-07-28
session_id customer_id device session_start
13 14 1 tablet 2014-01-01 03:28:00
6 7 3 tablet 2014-01-01 01:39:40
1 2 5 mobile 2014-01-01 00:17:20
28 29 1 mobile 2014-01-01 07:10:05
24 25 3 desktop 2014-01-01 05:59:40
transaction_id session_id transaction_time product_id amount
74 232 5 2014-01-01 01:20:10 1 139.20
231 27 17 2014-01-01 04:10:15 2 90.79
434 36 31 2014-01-01 07:50:10 3 62.35
420 56 30 2014-01-01 07:35:00 3 72.70
54 444 4 2014-01-01 00:58:30 4 43.59
zip_code ... NUM_UNIQUE(transactions.sessions.device)
customer_id ...
1 60091 ... 3
2 13244 ... 3
3 13244 ... 3
4 60091 ... 3
5 60091 ... 3
[5 rows x 77 columns]
customer_id ... customers.YEAR(join_date)
session_id ...
1 2 ... 2012
2 5 ... 2010
3 4 ... 2011
4 1 ... 2011
5 4 ... 2011
[5 rows x 44 columns]
<Feature: MODE(transactions.WEEKDAY(transaction_time))>
The most frequently occurring value of the day of the week of the "transaction_time" of all instances of "transactions" for each "session_id" in "sessions".
實作代碼
import featuretools as ft
# 1、定義資料集
data = ft.demo.load_mock_customer()
'''
在這個玩具資料集中,有3個表。每個表在Featuretools中稱為一個實體。
customers:擁有會話的獨特客戶
sessions:唯一的會話和相關屬性
transactions:此會話中的事件清單
customers_df = data["customers"]
sessions_df = data["sessions"]
transactions_df = data["transactions"]
print(customers_df)
print(sessions_df.sample(5))
print(transactions_df.sample(5))
# 2、DFS設計
# (1)、指定一個包含資料集中所有實體的字典
entities = {"customers" : (customers_df, "customer_id"),
"sessions" : (sessions_df, "session_id", "session_start"),
"transactions" : (transactions_df, "transaction_id", "transaction_time")
}
# (2)、指定實體間如何關聯:當兩個實體有一對多關系時,我們稱之為“one”實體,即“parent entity”。
# 父類和子類之間的關系是這樣定義的:
# (parent_entity, parent_variable, child_entity, child_variable)
# 在這個資料集中,我們有兩個關系
relationships = [("sessions", "session_id", "transactions", "session_id"),
("customers", "customer_id", "sessions", "customer_id")]
# 為了管理實體和關系的設定,我們建議使用EntitySet類,它為管理這樣的資料提供了友善的api
# (3)、運作深度特征合成
DFS的最小輸入是一組實體、一組關系和計算特性的“target_entity”。DFS的輸出是一個特征矩陣和相應的特征定義清單。
讓我們首先為資料中的每個客戶建立一個特性矩陣,那麼現在有幾十個新特性來描述客戶的行為。
feature_matrix_customers, features_defs = ft.dfs(entities=entities,
relationships=relationships,
target_entity="customers")
print(feature_matrix_customers)
# (4)、改變目标的實體
# DFS如此強大的原因之一是它可以為我們的資料中的任何實體建立一個特征矩陣。例如,如果我們想為會話建構特性
feature_matrix_sessions, features_defs = ft.dfs(entities=entities,
relationships=relationships,
target_entity="sessions")
print(feature_matrix_sessions.head(5))
# (5)、了解特征輸出
一般來說,Featuretools通過特性名稱引用生成的特性。
為了讓特性更容易了解,Featuretools提供了兩個額外的工具,Featuretools .graph_feature()和Featuretools .describe_feature(),
來幫助解釋什麼是特性以及Featuretools生成特性的步驟。
feature = features_defs[18]
print(feature)
# (6)、特征譜系圖
#特征譜系圖可視地周遊功能生成過程。從基本資料開始,它們一步一步地展示應用的原語和生成的中間特征,以建立最終特征。
import matplotlib.pyplot as plt
ft.graph_feature(feature)
plt.show()
# (7)、特征描述
功能工具還可以自動生成功能的英文句子描述。特性描述有助于解釋什麼是特性,并且可以通過包含手動定義的自定義來進一步改進。
有關如何自定義自動生成的特性描述的詳細資訊,請參見生成特性描述。
print(ft.describe_feature(feature))