還在苦惱特征工程?不妨試試這個庫
導(dǎo)讀
從事機(jī)器學(xué)習(xí)相關(guān)崗位的同學(xué)都知道這樣一句話:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限。在數(shù)據(jù)確定的情況下,那么特征工程就成了唯一可供發(fā)揮的關(guān)鍵步驟。廣義來講,特征工程包括特征提取、特征衍生以及特征選擇等等,今天本文就來分享Python中的一個特征工程相關(guān)的庫——featuretools,可自動化快速實現(xiàn)特征提取和特征衍生的工作,對加速機(jī)器學(xué)習(xí)建模和保證特征工程效果都非常有幫助。

featuretools是一個python的開源庫(https://www.featuretools.com/),從其名字就可看出,這是一個用于特征相關(guān)的工具,是由featurelab團(tuán)隊最早提出設(shè)計(featurelab是美國的一家初創(chuàng)公司,目前已被Alteryx收購),發(fā)表于論文《Deep Feature Synthesis: Towards Automating Data Science Endeavors》中,想要詳細(xì)了解其設(shè)計思想和算法原理的可參考這篇文章。今天,本文主要是介紹下它的應(yīng)用和測試效果。
featuretools的安裝和基本使用
featuretools的安裝過程非常簡單,和其他python庫可直接使用pip工具完成安裝一樣,featuretools也可以這樣安裝。
pip install featuretools安裝完成后,調(diào)包的過程一般只需要如下一句,這就像import numpy as np一樣,而后續(xù)的所有操作都是基于ft這個主入口的:
import featuretools as ft當(dāng)然,在具體使用之前,這里還是要先簡單介紹下featuretools的基本設(shè)計和原理。簡單來說,featuretools是用于從若干原始數(shù)據(jù)表中自動化提取特征的一個工具,以論文中的電商訂單的例子為例:需要統(tǒng)計對各客戶構(gòu)建特征,所使用的數(shù)據(jù)表有兩張,一個是客戶基本信息表,例如年齡、性別、工資收入等;另一個是訂單信息表,其中包含了每筆訂單的金額、產(chǎn)生訂單的客戶等。顯然,這里客戶信息表和訂單信息表之間的關(guān)聯(lián)關(guān)系是客戶ID,且一個客戶ID可對應(yīng)多筆訂單。

同樣的特征構(gòu)建思想,featuretools羅列了這期間的所有可能需要的特征構(gòu)建算子,并設(shè)置了迭代構(gòu)建的深度:max_depth。

特征構(gòu)建算子在featuretools中稱作primitive——基于
其次介紹特征構(gòu)建深度的問題:max_depth。例如對于客戶基本信息表中有A、B、C、D四個特征,那么A+B和C-D都是depth=1的衍生特征,而(A+B)*(C-D)則是depth=2的衍生特征,以此類推。正因如此,featuretools中的特征構(gòu)建算法叫做Deep Feature Synthesis,即深度特征合成。
如上就是一些關(guān)于featuretools的基本設(shè)計的簡要介紹,更為詳盡的理論和使用還需查閱論文或其他資料。下面給出一個簡單的demo,同時測試其效果情況,這里以sklearn中的breast_cancer數(shù)據(jù)集為例:
1.導(dǎo)入數(shù)據(jù),構(gòu)建DataFrame格式的數(shù)據(jù)集
dataset = load_breast_cancer()X = dataset.datay = dataset.targetfeature_names = dataset.feature_namesdf = pd.DataFrame(X, columns=feature_names)
2.調(diào)用featuretools,構(gòu)建數(shù)據(jù)集實體,并設(shè)置特征構(gòu)建基元,調(diào)用dfs方法(深度特征合成):
es = ft.EntitySet(id='breast_cancer') # 用id標(biāo)識實體集# 增加一個數(shù)據(jù)框,命名為irises.entity_from_dataframe(entity_id='breast_cancer',dataframe=df,index='idx',make_index=True)trans_primitives=['add_numeric', 'multiply_numeric'] # 取任意兩列組合的相加和相乘,衍生新的特征XNew, new_names = ft.dfs(entityset=es,target_entity='breast_cancer',max_depth=1, # max_depth=1,只在原特征上進(jìn)行運算產(chǎn)生新特征verbose=1,trans_primitives=trans_primitives)
X_train, X_test, XNew_train, XNew_test, y_train, y_test = train_test_split(X, XNew, y)np.mean([DecisionTreeClassifier().fit(X_train, y_train).score(X_test, y_test) for _ in range(10)])# 0.9342657342657343np.mean([DecisionTreeClassifier().fit(XNew_train, y_train).score(XNew_test, y_test) for _ in range(10)])# 0.9468531468531468

相關(guān)閱讀:
