當前位置:
首頁 > 知識 > 用 Python Featuretools 庫實現自動化特徵工程

用 Python Featuretools 庫實現自動化特徵工程

(給

Python開發者

加星標,提升Python技能




英文:Prateek Joshi,翻譯:數據派/張玲




簡介



在機器學習黑客馬拉松和競賽中,特徵工程的質量通常是進入排行榜10強和無緣50強的重要區別,因此,所有參賽過的人都可以證明特徵工程的重要性。




自從我意識到特徵工程具有巨大的潛力以來,我一直是它的大力倡導者。但當手動完成時,這可能是一個緩慢而艱難的過程。我必須絞盡腦汁來思考有哪些特徵存在,並從不同的角度分析它們的可用性。現在,整個FE(Feature Engineering,特徵工程)流程都可以實現自動化,我將在本文中向您展示。







我們將使用一個名為Featuretools的Python特徵工程庫,來實現這一流程。但是在深入研究之前,我們首先了解下FE的基本組成部分,並用直觀的示例理解它們,最後利用BigMart Sales數據集來深入了解自動化特徵工程這一精彩世界。




目錄




1.  什麼是特徵?

2. 什麼是特徵工程?


3. 為什麼需要特徵工程?


4. 自動化特徵工程


5. Featuretools簡介


6. Featuretools實踐

7. Featuretools的可解釋性




1. 什麼是特徵




在機器學習的背景下,特徵是用來解釋現象發生的單個特性或一組特性。 當這些特性轉換為某種可度量的形式時,它們被稱為特徵。



舉個例子,假設你有一個學生列表,這個列表裡包含每個學生的姓名、學習小時數、IQ和之前考試的總分數。現在,有一個新學生,你知道他/她的學習小時數和IQ,但他/她的考試分數缺失,你需要估算他/她可能獲得的考試分數。




在這裡,你需要用IQ和study_hours構建一個估算分數缺失值的預測模型。所以,IQ和study_hours就成了這個模型的特徵。






2. 什麼是特徵工程?




特徵工程可以簡單定義為從數據集現有特徵中構造新特徵的過程。假設我們有一個樣本數據,裡面含有一些商品的細節信息,例如重量和價格。






現在,我們可以用Item_Weight和Item_Price來構造名為Price_per_Weight的新特徵。它僅是用商品的價格除以商品的重量而已。這樣的過程稱為特徵工程。







這只是一個從現有特徵中構造一個新特徵的簡單示例,但實際上,當我們有相當多的特徵時,特徵工程可變得非常複雜和繁瑣。



再看另一個例子,在常用的Titanic數據集中,存在一個乘客名字的特徵,下面是這個數據集中的一些名字:






  • Montvila, Rev. Juozas



  • Graham, Miss. Margaret Edith



  • Johnston, Miss. Catherine Helen 「Carrie」



  • Behr, Mr. Karl Howell



  • Dooley, Mr. Patrick




這些名字實際上可以分解成另外幾個有意義的特徵。例如,將相似的稱謂提取出來,合併成一個類別。讓我們來看一看乘客姓名中這些稱謂的不同個數。







從上圖可以看出,「Dona」、「Lady」、「the Countess」、「Capt」、「Col」、 「Don」、「Dr」、「Major」、「Rev」、「Sir」和「Jonkheer」這些稱謂是十分少見的,可以將它們放在一個標籤下,即rare_title。除了這些,稱謂「Mlle」和「Ms」可歸到「Miss」下,而「Mme」可以用「Mrs」來代替。







因此,如下圖所示,這個新稱謂的特徵只有5個不同的值:







這就是我們藉助特徵工程從特徵中提取有用信息的過程,即使是像乘客名字這樣乍一看毫無意義的特徵。


 


3. 為什麼需要特徵工程?




預測模型的性能在很大程度上取決於用於訓練該模型的數據集特徵的質量。如果你能夠構造出可提供更多有關模型目標變數的信息的新特徵,那麼模型的性能將會提升。所以,當數據集中沒有足夠多的高質量特徵時,我們必須依靠特徵工程。




在Kaggle上最受歡迎的競賽之一,自行車租賃需求預測中,參賽者需要根據與天氣、時間和其他數據相關的歷史使用模式來預測華盛頓特區的租賃需求。




正如本文所述,智能化特徵工程有助於參賽者獲得排行榜前5%的排名。一些構造的特徵如下:






  • Hour Bins:藉助於決策樹,通過切分hour特徵構造的新特徵



  • Temp Bins:相似地,是temperature變數的切分特徵



  • Years Bins:通過8等分2年時間構造的新特徵



  • Day Type:Days分成「工作日」、「周末」和「節假日」




構造這樣的特徵並非易事,因為它需要大量的頭腦風暴和廣泛的數據探索。特徵


工程不能通過讀書和看視頻來學習,因此,不是所有的人都擅長它。這就是特徵工程也被稱為藝術的原因。如果擅長它,那麼你在競賽中就佔據優勢。就像羅傑·費德勒(Roger Federer),在網球得分上,他就是特徵工程的大師。







4. 自動化特徵工程







分析上面兩張圖片,左圖顯示了20世紀初一群人正在組裝汽車,右圖則顯示了當今一群機器人在做同樣的工作。自動化任何流程都可以使其變得更加高效和經濟。同樣,特徵工程也是如此。而且,在機器學習中,特徵工程已經實現自動化。




構建機器學習模型通常是一個艱苦而乏味的過程,涉及許多步驟。因此,如果我們能夠自動化執行一定比例的特徵工程任務,那麼數據科學家或領域專家就可以專註於模型的其他方面。聽起來簡直太棒了,但難以置信,對吧?




既然我們已經明白自動化特徵工程的發展亟需幫助,那麼下一個要問的問題就是,如何實現?嗯,我們有一個很好的工具可以用來解決這個問題,它叫Featuretools。




5. Featuretools簡介








Featuretools是一個開源庫,用來實現自動化特徵工程。它是一個很好的工具,旨在加快特徵生成的過程,從而讓大家有更多的時間專註於構建機器學習模型的其他方面。換句話說,它使你的數據處於「等待機器學習」的狀態。




在使用Featuretools之前,我們應該了解程序包中的三個主要組件:






  • 實體(Entities)



  • 深度特徵綜合(Deep Feature Synthesis ,DFS)



  • 特徵基元(Feature primitives)






  • 一個Entity可以視作是一個Pandas的數據框的表示,多個實體的集合稱為Entityset。



  • 深度特徵綜合(DFS)與深度學習無關,不用擔心。實際上,DFS是一種特徵工程方法,是Featuretools的主幹。它支持從單個或者多個數據框中構造新特徵。



  • DFS通過將特徵基元應用於Entityset的實體關係來構造新特徵。這些特徵基元是手動生成特徵時常用的方法。例如,基元「mean」將在聚合級別上找到變數的平均值。




了解、熟悉Featuretools的最佳方法就是將其應用於數據集。因此,在下一節中,我們將使用BigMart Sales實踐問題中的數據集來鞏固我們的概念。


 


6. Featuretools實踐




BigMart Sales面臨的挑戰是構建一個預測模型來估算特定門店中每種商品的銷售額,這將有助於BigMart的決策者找出每一個產品或門店的重要屬性,這對提高整體銷售起著關鍵性作用。請注意,在給定的數據集中,有跨10個門店的1559種商品。




下表給出了數據提供的特徵:













































變數


描述


Item_Identifier


商品編號


Item_Weight


商品重量


Item_Fat_Content


是否是低脂商品


Item_Visibility


該商品展示區域占門店中所有商品展示區域的比例


Item_Type


商品所屬分類


Item_MRP


商品最高售價


Outlet_Identifier


門店編號


Outlet_Establishment_Year


門店建立年份


Outlet_Size


門店佔地面積


Outlet_Location_Type


門店所在城市類型


Outlet_Type


門店類型(雜貨店或超市)


Item_Outlet_Sales


門店商品銷售額
(即需要預測的輸出變數)


 


你可以從這裡下載數據。




6.1 安裝




Featuretools適用於Python 2.7,3.5和3.6,可以使用pip輕鬆安裝Featuretools。







6.2 下載需要的庫和數據







6.3 數據準備




首先,我們將Item_Outlet_Sales存儲在變數sales中,id特徵存儲在test_Item_Identifier和test_Outlet_Identifier中。







接著,我們將訓練集和測試集組合起來,避免執行兩次相同步驟的麻煩。







檢查一下數據集中的缺失值。








變數Item_Weight 和 Outlet_size中有非常多的缺失值,我們快速處理一下:







6.4 數據預處理




我不會做大量的預處理操作,因為本文的目的是讓你開始使用Featuretools。







似乎Item_Fat_Content只包含兩個類別,即「低脂肪」和「常規」,其餘值被視為是多餘的。 所以,讓我們把它轉換成二元變數。







6.5 使用Featuretools實現特徵工程




現在,我們可以開始使用Featuretools來實現自動化特徵工程了! 數據集中必須具有唯一標識符的特徵(我們的數據集現在沒有任何這樣的特徵)。 因此,我們將為組合數據集創建一個唯一ID。 如果您注意到,數據中有兩個ID -一個用於商品,另一個用於門店。 因此,簡單地連接兩者就可以為我們提供唯一的ID。







請注意,由於不再需要特徵Item_Identifier,我刪除了這個特徵。但是,保留了特徵Outlet_Identifier,因為我打算稍後使用它。




在繼續之前,我們將創建一個特徵EntitySet,它是一種包含多個數據框及其之間關係的結構。那麼,讓我們創建一個EntitySet並將數據框組合添加進去。







數據中包含兩個級別的信息,即商品級別和門店級別的信息。而且,Featuretools提供了將數據集拆分為多個表的功能。所以,我們根據門店ID Outlet_Identifier從BigMart表創建了一個新表"outlet"。







讓我們檢查一下EntitySet的摘要。







如上所示,它包含兩個實體,bigmart和outlet。兩個表之間也形成了一種由Outlet_Identifier連接的關係。這種關係將在新特徵的生成中發揮關鍵作用。




現在我們將使用深度特徵綜合(Deep Feature Synthesis)自動創建新特徵。回想一下,DFS使用Feature Primitives和EntitySet中存在的多個表來構造新特徵。







target_entity是目標實體的ID,目標實體指的是我們希望為其構造新特徵的實體(在這種情況下,它是實體"bigmart")。參數max_depth控制由疊加特徵基元方式生成的特徵的複雜性。參數n_jobs則是通過使用多個核的方式來幫助進行並行特徵計算。




這就是你用Featuretools所做的一切,它自己構造了許多新特徵。




讓我們來看看這些新構造的特徵:








DFS在如此短的時間內構造了29個新特徵。這令人震驚,因為手動操作需要更長的時間。 如果你的數據集包含多個相互關聯的表,那麼Featuretools仍然有效。




在這種情況下,您不必對錶進行規範化,因為多個表已經可用。




讓我們看看feature_matrix的前幾行。







這個數據框存在一個問題,它並沒有進行恰當的排序。我們將根據combi數據框中的id變數對其進行排序。







現在,數據框feature_matrix的排序正確。




6.6 構建模型




現在是檢測這些生成特徵的有效性的時候了!我們將使用它們來構建模型,預測Item_Outlet_Sales。由於最終的數據(feature_matrix)里具有許多類別特徵,我決定使用CatBoost演算法。它可以直接使用類別特徵,並且本質上是可擴展的。




你可以參考這篇文章來閱讀有關CatBoost的更多信息。







CatBoost要求所有類別變數都採用字元串格式。因此,我們首先將數據中的類別變數轉換為字元串:







然後重新把feature_matrix拆回訓練集和測試集。







將訓練集拆成訓練和驗證兩部分,以便在本地測試演算法的性能。







最後,訓練模型。採用RMSE(Root Mean Squared Error,均方根誤差)作為衡量指標。








1091.244




驗證數據集的RMSE得分是~1092.24。




同一模型在公共排行榜上得分為1155.12。在沒有任何特徵工程的情況下,驗證集和公共排行榜的得分分別為~1103和~1183。 因此,Featuretools構造的特徵不僅僅是隨機特徵,而且還非常有價值的。最重要的是,它使特徵工程節省了大量時間。




7. Featuretools的可解釋性




使我們的數據科學解決方案通俗易懂是演示機器學習非常重要的一個方面。Featuretools生成的特徵可以很容易地解釋給非技術人員聽,原因是它們均基於易理解的特徵基元。




例如,特徵outlet.SUM(bigmart.Item_Weight)和outlet.STD(bigmart.Item_MRP)分別表示每家門店所有商品重量的總和以及商品成本的標準差。




這使得不是機器學習專家的人員同樣能夠在自己領域專業有所貢獻。




尾記




Featuretools包真正改變了機器學習的遊戲規則。雖然它在行業中的應用仍然受制,但是已經風靡於黑客馬拉松和ML競賽。它所節省的時間以及其生成特徵的實用性已經真正贏得了我的青睞。




下次處理任何數據集時請嘗試一下,並在評論部分告訴我這個過程是如何進行的!





原文標題:


A Hands-On Guide to Automated Feature Engineering using Featuretools in Python


原文鏈接:


https://www.analyticsvidhya.com/blog/2018/08/guide-automated-feature-engineering-featuretools-python/




推薦閱讀


(點擊標題可跳轉閱讀)


深入淺出+徹底理解 Python 編碼



簡化 Django 開個的八個 Python 包



wxPython:python 首選的 GUI 庫





覺得本文對你有幫助?請分享給更多人


關注「Python開發者」加星標,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

面向對象:找個人閑暇時間一起看街頭的繁花似錦,享受生活
面向對象:人生很短暫,希望在最美的年華遇見對的你

TAG:Python開發者 |