簡介
在機器學習黑客馬拉松和競賽中,特徵工程的質量通常是進入排行榜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/