近年來,我們在自動模型選擇和超參數(shù)調(diào)優(yōu)方面取得了進(jìn)展,但機器學(xué)習(xí)流程中最重要的方面--特征工程,在很大程度上被我們所忽略。在本文中,我們將使用Featuretools庫來了解自動化特征工程如何改變并優(yōu)化機器學(xué)習(xí)的工作方式。
Featuretools是一個開源的Python庫,用于自動化特征工程
自動化特征工程是一種相對較新的技術(shù),用于解決真實世界數(shù)據(jù)集所面臨的一系列科學(xué)問題。自動特征工程能夠縮減時間成本,構(gòu)建更優(yōu)秀的預(yù)測模型,生成更有意義的特征,還能防止數(shù)據(jù)泄漏(data leakage)。它具有強大的功能,以至于我相信它將是任何機器學(xué)習(xí)工作流程的標(biāo)準(zhǔn)部分。
接下來,我們將通過以下兩個項目來進(jìn)一步了解它的強大之處,這兩個項目都能體現(xiàn)自動化特征工程的一些優(yōu)點:
貸款還款預(yù)測(Loan Repayment Prediction):相比于手動特征工程,自動化特征工程能夠?qū)C器學(xué)習(xí)開發(fā)時間縮短10倍,同時還能提供更好的模型表現(xiàn)。
項目的Notebooks地址:
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Loan%20Repayment
零售支出預(yù)測(Retail Spending Prediction):自動化特征工程能夠通過內(nèi)部時間序列過濾器的處理,創(chuàng)造更有意義的特征,同時還能防止數(shù)據(jù)泄漏,從而成功實現(xiàn)模型的部署。
項目的Notebooks地址:
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Retail%20Spending
手動特征工程 vs自動特征工程
特征工程是指獲取數(shù)據(jù)集并構(gòu)建解釋的特征變量的過程,而特征變量能夠用于訓(xùn)練機器學(xué)習(xí)模型并用于預(yù)測。通常,分布于多張表中的數(shù)據(jù)需要匯集到一張表中,其中行代表觀察量,而列代表特征。
手動特征工程是一種傳統(tǒng)的特征工程方法,它主要是利用領(lǐng)域知識來構(gòu)建特征,一次只能產(chǎn)生一個特征,這是一個繁瑣,費時又易出錯的過程。此外,每次進(jìn)行手動特征工程的代碼是針對特定的問題,當(dāng)我們要解決一個新問題、新數(shù)據(jù)集時,我們需要重寫相關(guān)代碼。
自動化特征工程是通過從一組相關(guān)的數(shù)據(jù)表中自動提取有用且有意義的特征,這種方法能夠改變標(biāo)準(zhǔn)的工作流程,并適用于任務(wù)數(shù)據(jù)集的有關(guān)問題。此外,它不僅減少了特征工程所需的時間,還創(chuàng)建了可解釋性的特征,并通過過濾與時間相關(guān)的數(shù)據(jù)來防止數(shù)據(jù)泄漏。
貸款還款項目
更快更好地構(gòu)建模型
Home Credit Loan 問題是于今日在 Kaggle上結(jié)束的一項機器學(xué)習(xí)競賽項目,其目標(biāo)是預(yù)測客戶是否能夠償還貸款。對于數(shù)據(jù)科學(xué)家而言,這個問題的挑戰(zhàn)在于其數(shù)據(jù)的大小及所分布的范圍。我們來看下完整的數(shù)據(jù)集,可以看到分布在七張表中有5800萬行數(shù)據(jù),而機器學(xué)習(xí)方法需要針對一張表進(jìn)行模型訓(xùn)練。此時,特征工程就需要將每個客戶的所有信息提取并融合到一個表中。
特征工程需要從數(shù)據(jù)表格集中獲取所有的數(shù)據(jù)信息并整合到一張表中
對于這個問題,我先是嘗試用傳統(tǒng)的手動特征工程來解決,共花了10個小時手動地創(chuàng)建一組特征。首先,我研究了其他數(shù)據(jù)科學(xué)家的工作,探索數(shù)據(jù)與研究,以便獲得必要的領(lǐng)域知識。然后我通過編程將所需的知識寫成代碼,每次構(gòu)建一個特征。對于一個手動特征,我使用 3 個不同的表格,找到了客戶在之前貸款中延遲付款的總數(shù)。
最終,手動特征工程取得了相當(dāng)不錯的表現(xiàn):相比于基線特征,手動特征工程取得了 65% 的性能改進(jìn),表明了特征工程的適用性和重要性。
然而,由于這種方法的效率很低,我無法在這里展開描述整個過程。對于手動特征工程,每個特征花費超過 15 分鐘的時間,因為我用的這種方法一次只能創(chuàng)建一個特征。
手動特征工程流程
除了繁瑣性和耗時等缺點外,手動特征工程還有如下弊端:
只針對特定問題:對于這個項目,我寫了幾個小時的代碼不能應(yīng)用于其他任何問題
容易出錯:每行代碼都有可能產(chǎn)生錯誤
此外,手動特征工程所提取的特征還會受到人類創(chuàng)造力和耐心的限制:對于一個問題,我們需要考慮大量的特征,而每個特征的構(gòu)建又需要大量的時間。
從手動到自動的特征工程
像 Featuretools 可以實現(xiàn)的功能那樣,自動化特征工程能夠從一組相關(guān)的數(shù)據(jù)表中創(chuàng)建數(shù)千個特征,我們所需要知道的就是數(shù)據(jù)表的基本結(jié)構(gòu)以及它們之間的關(guān)系。我們將單個數(shù)據(jù)結(jié)構(gòu)稱為實體集(entity set),一旦擁有一個實體集,我們將在數(shù)據(jù)集中采用深度特征合成方法(DFS),通過調(diào)用一個函數(shù)來構(gòu)建數(shù)千個特征。
使用 Featuretools進(jìn)行自動化特征工程
DFS 使用稱為“基元 primitives”的函數(shù)來聚合并轉(zhuǎn)換我們的數(shù)據(jù)。這些primitives的獲取可以跟獲取列的平均值或最大值一樣得簡單,也可以通過基于主體的專業(yè)知識那樣相對復(fù)雜的方式來獲取,因為Featuretools允許我們針對任務(wù)自定義我們的 primitives。
特征基元(feature primitives)包括許多需要手動完成的操作,但通過 Featuretools,我們可以在任何關(guān)系數(shù)據(jù)庫中使用相同的確切語法,也就是說在不同的數(shù)據(jù)集上我們也不需要重寫代碼就能夠使用這些操作。此外,當(dāng)我們將 primitives堆疊在一起以創(chuàng)建深層特征時,DFS的強大之處就盡顯無疑了。
有關(guān) DFS的更多信息,可以參閱:
https://www.featurelabs.com/blog/deep-feature-synthesis/
下面,我將演示如何構(gòu)建這個過程。這里,我只需要一行的代碼就能使用DFS 操作,并使用7張表格數(shù)據(jù)為每個客戶創(chuàng)建數(shù)千個功能,如下所示,其中 ft代表導(dǎo)入的 featuretools庫:
1#Deepfeaturesynthesis2feature_matrix,features=ft.dfs(entityset=es,3target_entity='clients',4agg_primitives=agg_primitives,5trans_primitives=trans_primitives)
以下是我們從 Featuretools自動獲得的 1820 個功能中的一部分,包括:
客戶以前貸款所支付的最高總額。這是使用 3 個表中的 MAX和 SUM值創(chuàng)建的。
客戶信用卡的平均債務(wù)排名。這是使用 2 個表中的 PERCENTILE和MEAN值創(chuàng)建的。
客戶是否在申請過程中提交了兩份文件。這是使用 AND轉(zhuǎn)換和 1 個表創(chuàng)建的。
每一個特征都是使用簡單的聚合構(gòu)建的,因此它也是可解釋的。 Featuretools不僅能夠創(chuàng)建許多我們手動也能完成的相同特征,還有大量手動無法創(chuàng)建的特征。這些特征要么是我們所無法考慮到,要么是需要昂貴的時間成本構(gòu)建。雖然并非每個特征都與我們的問題相關(guān),而某些功能間還具有高相關(guān)性,所以相比于特征量不足而言,更多的特征可能會更有助于我們解決問題。
經(jīng)過一些特征選擇和模型優(yōu)化后,這些特征在預(yù)測模型中的性能表現(xiàn)也更好,而整個模型的運行時間為1小時,與手動過程相比縮減了 10 倍。Featuretools是個高??焖俚淖詣犹卣鞴こ處?,它需要較少的領(lǐng)域?qū)I(yè)知識,因此所需編寫的代碼行數(shù)也比手動特征工程要少得多。
學(xué)習(xí) Featuretools需要花費一些時間,但我認(rèn)為這是一項值得、能夠帶來回報的投資。花了一小時時間學(xué)會 Featuretools,你可以將其應(yīng)用于任何機器學(xué)習(xí)的特征工程問題。
以下圖表是我對貸款償還項目的一些總結(jié):
自動化特征工程vs手動特征工程:開發(fā)時間、特征數(shù)以及性能對比
開發(fā)時間:考慮到最終的特征工程代碼所需的每一個特征時間--手動特征工程需要10小時,而自動化特征工程只需要 1 小時。
生成的特征數(shù)量:手動特征工程生成 30 個特征,而自動化特征工程創(chuàng)建了 1820 個特征。
使用提取的特征訓(xùn)練模型所取得的相對于基線的性能改進(jìn):手動特征工程性能改進(jìn)65%,而自動化特征工程取得了 66% 的提升。
此外,我為第一個項目編寫的 Featuretools代碼還可以應(yīng)用于任何數(shù)據(jù)集,而手動工程代碼則需要為了一個新的數(shù)據(jù)集重寫代碼。
零售支出項目
構(gòu)建有意義的功能并防止數(shù)據(jù)泄漏
第二個項目是客戶的零售支出預(yù)測,所使用的數(shù)據(jù)集是在線的客戶交易記錄。該預(yù)測問題是將客戶分為兩個部分,即下個月花費超過 500 美元的人和花費不超過 500 美元的人。每個客戶對應(yīng)多個標(biāo)簽,即將客戶在上個月的標(biāo)簽作為下個月的預(yù)測使用。例如,我們可以將客戶在 5 月份的支出作為標(biāo)簽,然后在 6 月份中使用,依此類推。
每個客戶都是多次使用的訓(xùn)練樣本
多次使用客戶標(biāo)簽會給創(chuàng)建訓(xùn)練數(shù)據(jù)帶來困難:給定某個月份,當(dāng)為客戶提取對應(yīng)特征時,即便我們可以訪問這些數(shù)據(jù),也無法從這個月中獲取未來幾個月的任何信息。在部署中,我們并沒有未來的數(shù)據(jù),因此無法使用它來訓(xùn)練模型。這也是我們經(jīng)常在現(xiàn)實世界數(shù)據(jù)集上所面臨的的挑戰(zhàn):由于模型無法在有效的數(shù)據(jù)集上進(jìn)行訓(xùn)練,因此在現(xiàn)實世界應(yīng)用中,這種模型的性能通常都很糟糕。
幸運的是,這個問題在 Featuretools中能夠很容易地解決。在深度特征合成(DFS)函數(shù)中,如上所示,其中截止時間表示我們不能使用任何數(shù)據(jù)作為標(biāo)簽的點,而 Featuretools在構(gòu)建特征時會自動地將時間考慮在內(nèi)。
給定某一月份,我們可以使用之前月份過濾掉的數(shù)據(jù)來構(gòu)建客戶的特征。請注意,調(diào)用我們創(chuàng)建的特征集的過程與貸款還款項目中的調(diào)用相同,只是多了一個 cutoff_time參數(shù)。
1#Deepfeaturesynthesis2feature_matrix,features=ft.dfs(entityset=es,3target_entity='customers',4agg_primitives=agg_primitives,5trans_primitives=trans_primitives,6cutoff_time=cutoff_times)
運行Deep Feature Synthesis得到的結(jié)果是一個特征表,即每個客戶在每個月對應(yīng)一個特征。我們可以使用這些特征和標(biāo)簽來訓(xùn)練我們的模型,然后對往后的任何月份進(jìn)行預(yù)測。此外,我們不用擔(dān)心構(gòu)建模型所使用的特征會包含未來的信息,也不用擔(dān)心由此導(dǎo)致不公平性及錯誤的訓(xùn)練得分。
利用自動化特征,我能夠構(gòu)建一個機器學(xué)習(xí)模型并用于預(yù)測模型某月的支出。結(jié)果表明,相比于基線模型取得的0.69 ROC AUC表現(xiàn),我們的模型明顯更優(yōu),能夠達(dá)到0.90 ROC AUC。
除了預(yù)測性能外,F(xiàn)eaturetools實現(xiàn)還能提供一個很有價值的東西:可解釋性功能。下面,我們來看看隨機森林模型中 15 個最重要的特征:
利用Featuretools,隨機森林模型所獲取的15個最重要特征
特征重要性告訴我們,影響客戶下個月支出預(yù)測的最重要因素。在這里,我們可以知道,用戶上月支出總和 SUM(purchases.total)和購買數(shù)量 SUM(purchases.quantity)是影響下月支出預(yù)測的關(guān)鍵因素。雖然這些特征我們可以通過手動構(gòu)建,但是我們擔(dān)心數(shù)據(jù)的泄漏,因此我們需要創(chuàng)建一個開發(fā)階段性能更好的模型。
如果該工具已經(jīng)能夠自動創(chuàng)建一些有意義的特征而無需擔(dān)心其有效性,那么我們?yōu)槭裁催€要手動實現(xiàn)呢?此外,對于這個問題,自動化特征是完全清晰的,也能夠向我們解釋現(xiàn)實世界的推理過程。
即使手動特征工程需要花費比 Featuretools多得多的時間,但我也無法創(chuàng)建出一組性能接近相同的特征。下圖顯示了使用在兩個數(shù)據(jù)集上使用訓(xùn)練的模型對未來月客戶支出預(yù)測的 ROC 曲線,其中越靠近左上角的曲線代表更好的性能:
自動特征工程 vs手動特征工程的 ROC曲線
其中越靠近左上部分的曲線表示越好的性能
我甚至不確定手動特征是否是通過有效的數(shù)據(jù)創(chuàng)建的,但起碼 Featuretools是這樣實現(xiàn)的,因此我也不需要擔(dān)心時間相關(guān)問題中的數(shù)據(jù)泄漏問題。也許,無法通過手動設(shè)計一組有用的特征可以表明數(shù)據(jù)科學(xué)家的失敗,但是如果自動化工具能夠安全地我們實現(xiàn),那為什么我們不使用呢?
結(jié)論
拋開以上這些項目,我相信自動化特征工程將會是機器學(xué)習(xí)工作流程中不可或缺的一部分。雖然該技術(shù)目前還不完美,但仍能顯著地提高我們的工作效率。
下面我總結(jié)了自動化特征工程的一些要點:
能將開發(fā)時間縮短 10 倍
能夠構(gòu)建相同甚至更好性能的模型
提供具有現(xiàn)實意義的可解釋功能
防止模型使用無效的、不正確的數(shù)據(jù)特征
適合現(xiàn)有的工作流程和機器學(xué)習(xí)模型
通過自動化特征工程可以使這些工作變得更加簡單,我們之前為大家介紹的基于 Python 的自動特征工程可以教大家如何快速開始自動創(chuàng)建機器學(xué)習(xí)特征。
-
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68625 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132655
原文標(biāo)題:手動特征工程已經(jīng)OUT了!自動特征工程才是改進(jìn)機器學(xué)習(xí)的方式
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論