python特征工程插件_手把手教你用Python实现自动特征工程
任何參與過機(jī)器學(xué)習(xí)比賽的人,都能深深體會(huì)特征工程在構(gòu)建機(jī)器學(xué)習(xí)模型中的重要性,它決定了你在比賽排行榜中的位置。
特征工程具有強(qiáng)大的潛力,但是手動(dòng)操作是個(gè)緩慢且艱巨的過程。Prateek Joshi,是一名數(shù)據(jù)科學(xué)家,花了不少時(shí)間研究多種特征,并從不同角度分析其可行性。
現(xiàn)在,整個(gè)特征工程過程可實(shí)現(xiàn)自動(dòng)化,他將通過這篇文章進(jìn)行詳細(xì)介紹。
下面會(huì)使用Python特征工程庫Featuretools來實(shí)現(xiàn)這個(gè)任務(wù)。在討論之前,我們先介紹特征工程的基本組成,再用直觀例子來理解它們,最后把自動(dòng)特征工程應(yīng)用到BigMart Sales數(shù)據(jù)集中驗(yàn)證實(shí)際效果。
本文目錄
1. 特征是什么
2. 特征工程
3. 特征工程必要性
4. 自動(dòng)特征工程
5. Featuretools簡(jiǎn)介
6. Featuretools實(shí)現(xiàn)
7. Featuretools可解釋性
1 特征
在機(jī)器學(xué)習(xí)中,特征可以描述為解釋現(xiàn)象發(fā)生的一組特點(diǎn)。當(dāng)這些特點(diǎn)轉(zhuǎn)換為一些可測(cè)量的形式時(shí),它們就稱作特征。
例如,在一個(gè)學(xué)生列表中,包含每個(gè)學(xué)生的姓名name、學(xué)習(xí)小時(shí)數(shù)study_hours、智商IQ和先前考試的總分?jǐn)?shù)marks。現(xiàn)在給你一個(gè)新學(xué)生,他的信息只有學(xué)習(xí)小時(shí)數(shù)和智商,他的總分?jǐn)?shù)缺失,你需要來估計(jì)他可能的分?jǐn)?shù)值。
在這里,你要使用智商值和學(xué)習(xí)小時(shí)數(shù)構(gòu)建預(yù)測(cè)模型來估計(jì)這些缺失值。因此,智商值和學(xué)習(xí)小時(shí)數(shù)稱作這個(gè)模型的特征。
2 特征工程
特征工程可以簡(jiǎn)單定義為從數(shù)據(jù)集的已有特征創(chuàng)建新特征的過程。
下面是一個(gè)樣本數(shù)據(jù),包括每個(gè)項(xiàng)目的詳細(xì)信息,如它們的重量Item_Weight和價(jià)格Item_Price。
現(xiàn)在,我們可以使用重量和價(jià)格創(chuàng)建新特征,于是創(chuàng)建了一個(gè)名為Price_per_Weight的特征,它指的是物品的單位質(zhì)量?jī)r(jià)格。這個(gè)過程叫做特征工程。
這只是利用已有特征創(chuàng)建新特征的一個(gè)簡(jiǎn)單示例,而在實(shí)際應(yīng)用中,當(dāng)特征數(shù)量較多時(shí),特征工程可能會(huì)變得相當(dāng)復(fù)雜和繁瑣。
下面是另一個(gè)例子。在經(jīng)典的Titanic數(shù)據(jù)集中,有個(gè)特征為乘客姓名,下面是這個(gè)數(shù)據(jù)集中的一些名字:
Montvila, Rev. Juozas
Graham, Miss. Margaret Edith
Johnston, Miss. Catherine Helen “Carrie”
Behr, Mr. Karl Howell
Dooley, Mr. Patrick
實(shí)際上,這些姓名可以分解為其他有意義的特征。比如,我們把相似稱號(hào)提取并分到單個(gè)類別。下面是乘客姓名中各個(gè)稱號(hào)的對(duì)應(yīng)頻率。
事實(shí)上,有些稱號(hào),如’Dona’, ‘Lady’, ‘Countess’, ‘Capt’, ‘Col’, ‘Don’, ‘Dr’, ‘Major’, ‘Rev’, ‘Sir’和’Jonkheer ‘,出現(xiàn)頻率很低,可以劃為同一類,作為rare_title類。此外,稱號(hào)’Mlle’和’Ms’可以放在’Miss’中,’Mme’可以用’Mrs’替換。
新的稱號(hào)特征只有5個(gè)唯一值,如下所示:
因此,這就是我們借助特征工程來提取有用信息的過程,甚至能從最初看起來毫無意義的乘客名稱中提取特征。
3 特征工程必要性
一個(gè)預(yù)測(cè)模型的性能很大程度上取決于訓(xùn)練該模型的數(shù)據(jù)集的特征質(zhì)量。
如果能創(chuàng)建新特征來幫助向模型提供有關(guān)目標(biāo)變量的更多信息,那么它的性能將會(huì)提升。因此,當(dāng)數(shù)據(jù)集中沒有足夠有用特征時(shí),我們必須依靠特征工程。
在Kaggle競(jìng)賽“自行車共享需求預(yù)測(cè)(Bike Sharing Demand Prediction)”中,參與者被要求根據(jù)歷史模式(包括使用情況,及對(duì)應(yīng)的天氣、時(shí)間和其他數(shù)據(jù))來預(yù)測(cè)華盛頓地區(qū)的租賃需求。
在一篇獲勝者分享中也提到,智能特征工程有助于提高模型性能。他創(chuàng)建的一些特征如下:
1. Hour Bins:利用決策樹分箱小時(shí)級(jí)別特征來創(chuàng)建新特征;
2. Hour Bins:類似地,溫度變量的分箱特征;
3. Year Bins:為持續(xù)2年的數(shù)據(jù)創(chuàng)建了8個(gè)季度分箱;
4. Day Type:當(dāng)天類型,分為工作日、周末和假日。
分享全文見:https://www.analyticsvidhya.com/blog/2015/06/solution-kaggle-competition-bike-sharing-demand/
創(chuàng)建這樣特征并非一件容易的事,它需要大量的頭腦風(fēng)暴和廣泛的數(shù)據(jù)探索。但是,并非所有人都擅長(zhǎng)特征工程,因?yàn)闊o法通過閱讀書籍或觀看教程學(xué)到這些東西。這就是特征工程也被稱為藝術(shù)的原因。如果你擅長(zhǎng)它,那么你在競(jìng)賽中占據(jù)較大優(yōu)勢(shì)。
4 自動(dòng)特征工程
分析上面的兩張圖片,左圖展示了20世紀(jì)初一群人在組裝汽車,右圖展示了如今機(jī)器人在做著同樣工作。自動(dòng)化任何流程都有可能使其更加高效且節(jié)約成本。同樣地,特征工程可以并且已經(jīng)在機(jī)器學(xué)習(xí)中實(shí)現(xiàn)自動(dòng)化。
構(gòu)建機(jī)器學(xué)習(xí)模型通常是一個(gè)艱苦且乏味的過程。它涉及多個(gè)步驟,因此如果我們能夠自動(dòng)執(zhí)行一定比例的特征工程任務(wù),那么數(shù)據(jù)科學(xué)家或工程師可以專注于模型的其他方面。
我們已經(jīng)了解自動(dòng)特征工程十分有用,那你可能會(huì)問,該如何把它應(yīng)用到模型中?別擔(dān)心,已經(jīng)有一個(gè)很好的Python工具庫解決了這個(gè)問題,那就是Featuretools。
5 Featuretools簡(jiǎn)介
Featuretools是一個(gè)用于執(zhí)行自動(dòng)特征工程的開源庫,旨在快速推進(jìn)特征生成過程,從而有更多時(shí)間專注于機(jī)器學(xué)習(xí)模型構(gòu)建的其他方面。
在使用Featuretools之前,我們要了解這個(gè)庫的三個(gè)主要組件:
實(shí)體Entities
深度特征合成Deep Feature Synthesis
特征基元Feature primitives
實(shí)體可看作是Pandas中數(shù)據(jù)幀的表征,多個(gè)實(shí)體的集合稱為實(shí)體集Entityset。
深度特征合成(DFS)與深度學(xué)習(xí)無關(guān)。作為一種特征工程方法,它實(shí)際上是Featuretools庫的核心。它支持從單個(gè)數(shù)據(jù)幀和多個(gè)數(shù)據(jù)幀中創(chuàng)建新特征。
DFS通過把特征基元應(yīng)用于實(shí)體集中的實(shí)體關(guān)系來創(chuàng)建特征。這些基元經(jīng)常被用來手動(dòng)生成特征,比如,基元“mean”可在聚合級(jí)別找到變量均值。
千看不如一練,熟悉Featuretools的最佳方法是多在數(shù)據(jù)集中嘗試。因此,我們會(huì)在下部分使用BigMart Sales數(shù)據(jù)集來鞏固概念。
6 Featuretools實(shí)現(xiàn)
BigMart Sales數(shù)據(jù)集面臨的挑戰(zhàn)是建立一個(gè)預(yù)測(cè)模型來估算某個(gè)商店中每種產(chǎn)品的銷售額。這將有助于BigMart決策者尋找每個(gè)產(chǎn)品或商店的特性,這對(duì)提高整體銷售額起著關(guān)鍵作用。在給定數(shù)據(jù)集中,包括10個(gè)商店中的1559種產(chǎn)品。
下表給出了數(shù)據(jù)中提供的特征:
數(shù)據(jù)集下載地址:
https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/
6.1 安裝
Featuretools適用于Python 2.7、3.5和3.6,可使用pip命令快速安裝Featuretools。
pip install featurePython
6.2 加載外部庫和數(shù)據(jù)
import featuretools as ft
import numpy as np
import pandas as pd
train = pd.read_csv("Train_UWu5bXk.csv")
test = pd.read_csv("Test_u94Q5KV.csv")
6.3 準(zhǔn)備數(shù)據(jù)
首先,我們把目標(biāo)Item_Outlet_Sales存儲(chǔ)到sales變量,把test_Item_Identifier和test_Outlet_Identifier存儲(chǔ)到id變量。
# saving identifiers
test_Item_Identifier = test['Item_Identifier'] test_Outlet_Identifier = test['Outlet_Identifier']
sales = train['Item_Outlet_Sales']
train.drop(['Item_Outlet_Sales'], axis=1, inplace=True)
然后,組合訓(xùn)練集和測(cè)試集,這樣省去兩次執(zhí)行相同步驟的麻煩。
combi = train.append(test, ignore_index=True)
接著,檢查數(shù)據(jù)集中的缺失值。
combi.isnull().sum()
變量Item_Weight和Outlet_size中有相當(dāng)多缺失值,用下面方法快速處理:
# imputing missing data
combi['Item_Weight'].fillna(combi['Item_Weight'].mean(),
inplace = True)
combi['Outlet_Size'].fillna("missing", inplace = True)
6.4 數(shù)據(jù)預(yù)處理
這里不會(huì)涉及過多預(yù)處理操作,因?yàn)楸疚牡闹饕康氖墙榻BFeaturetools。
combi['Item_Fat_Content'].value_counts()
Item_Fat_Content似乎只包含兩個(gè)類別,即“低脂”和“常規(guī)”,未涉及到“冗余”類別,所以我們把它轉(zhuǎn)換成二進(jìn)制變量。
# dictionary to replace the categories
fat_content_dict = {'Low Fat':0, 'Regular':1, 'LF':0, 'reg':1,
'low fat':0}
combi['Item_Fat_Content'] = combi['Item_Fat_Content'].replace(
fat_content_dict, regex=True)
6.5 使用Featuretools執(zhí)行特征工程
在這節(jié),我們要使用Featuretools來執(zhí)行自動(dòng)特征工程。
對(duì)于數(shù)據(jù)集,必須具有唯一標(biāo)識(shí)符特征,但是我們的數(shù)據(jù)集目前還沒有。因此,我們要為這個(gè)組合數(shù)據(jù)集創(chuàng)建唯一ID。你可能會(huì)注意到,數(shù)據(jù)集中有兩個(gè)ID,一個(gè)用于item,另一個(gè)用于outlet。因此,對(duì)這兩者簡(jiǎn)單相加會(huì)得到一個(gè)唯一ID。
combi['id'] = combi['Item_Identifier'] + combi['Outlet_Identifier']
combi.drop(['Item_Identifier'], axis=1, inplace=True)
要注意,由于不再需要,我刪除了特征Item_Identifier。但是,我保留了特征Outlet_Identifier,因?yàn)槲疑院筮€要用到它。
接著,我們要?jiǎng)?chuàng)建一個(gè)實(shí)體集EntitySet。實(shí)體集是一種包含多個(gè)數(shù)據(jù)幀及其之間關(guān)系的結(jié)構(gòu)。那么,我們創(chuàng)建一個(gè)EntitySet并添加數(shù)據(jù)幀組合。
# creating and entity set 'es'
es = ft.EntitySet(id = 'sales')
# adding a dataframe
es.entity_from_dataframe(entity_id = 'bigmart',
dataframe = combi,
index = 'id')
我們數(shù)據(jù)中包含兩個(gè)級(jí)別的信息,即?item級(jí)別和?outlet級(jí)別。Featuretools能把一個(gè)數(shù)據(jù)集拆分成多個(gè)表格。我們根據(jù)outlet ID Outlet_Identifier從BigMart表中創(chuàng)建一個(gè)新表“outlet”。
es.normalize_entity(base_entity_id='bigmart',
new_entity_id='outlet',
index = 'Outlet_Identifier',
additional_variables =
['Outlet_Establishment_Year', 'Outlet_Size',
'Outlet_Location_Type', 'Outlet_Type'])
下面打印出實(shí)體集EntitySet的組成。
print(es)
如上所示,它包含兩個(gè)實(shí)體,為bigmart和outlet。這兩個(gè)表之間也形成了一種關(guān)系,用Outlet_Identifier連接。這種關(guān)系將在生成新特征中發(fā)揮關(guān)鍵作用。
現(xiàn)在我們要使用DFS來自動(dòng)創(chuàng)建新特征。上面提到,DFS使用特征基元和實(shí)體集中給出的多個(gè)表來創(chuàng)建特征。
feature_matrix, feature_names = ft.dfs(entityset=es,
target_entity = 'bigmart',
max_depth = 2,
verbose = 1,
n_jobs = 3)
target_entity只是創(chuàng)建新特征的實(shí)體ID,這種情況下為實(shí)體“bigmart”。參數(shù)max_depth控制著通過堆疊基元生成的要素復(fù)雜性。參數(shù)n_jobs通過使用多個(gè)內(nèi)核來輔助并行特征計(jì)算。
這就是使用Featuretools的過程,它已經(jīng)產(chǎn)生了許多新特征。
來看下這些新創(chuàng)建的特征。
feature_matrix.columns
DFS在這么短的時(shí)間內(nèi)創(chuàng)建了29個(gè)新特征,而手動(dòng)操作需要更長(zhǎng)時(shí)間。如果數(shù)據(jù)集包含多個(gè)相互關(guān)聯(lián)的表,Featuretools仍然有效。在這種情況下,你不必對(duì)表進(jìn)行標(biāo)準(zhǔn)化,因?yàn)槎鄠€(gè)表已經(jīng)可用。
下面打印出feature_matrix的前幾行。
feature_matrix.head()
這個(gè)數(shù)據(jù)幀存在一個(gè)問題,即未正確排序。我們必須根據(jù)combi數(shù)據(jù)幀中的id變量對(duì)其進(jìn)行排序。
feature_matrix = feature_matrix.reindex(index=combi['id']) feature_matrix = feature_matrix.reset_index()
現(xiàn)在,數(shù)據(jù)幀feature_matrix已正確排序。
6.6 構(gòu)建模型
現(xiàn)在該驗(yàn)證這些生成特征的效果了。我們將使用它們來構(gòu)建模型并預(yù)測(cè)Item_Outlet_Sales值。由于最終數(shù)據(jù)feature_matrix具有多個(gè)分類特征,因此我決定使用CatBoost算法。它可以直接使用分類特征,并且本質(zhì)上是可擴(kuò)展的。有關(guān)CatBoost的更多內(nèi)容可閱讀這篇文章:
https://www.analyticsvidhya.com/blog/2017/08/catboost-automated-categorical-data/。
from catboost import CatBoostRegressor
CatBoost要求所有分類變量都使用字符串格式。因此,我們首先將數(shù)據(jù)中的分類變量轉(zhuǎn)換為字符串:
categorical_features = np.where(feature_matrix.dtypes =='object')[0]
for i in categorical_features:
feature_matrix.iloc[:,i]=feature_matrix.iloc[:,i].astype('str')
接著把feature_matrix分解為訓(xùn)練集和測(cè)試集。
feature_matrix.drop(['id'], axis=1, inplace=True)
train = feature_matrix[:8523]
test = feature_matrix[8523:]
# removing uneccesary variables
train.drop(['Outlet_Identifier'], axis=1, inplace=True) test.drop(['Outlet_Identifier'], axis=1, inplace=True)
# identifying categorical features categorical_features = np.where(train.dtypes == 'object')[0]
然后把訓(xùn)練數(shù)據(jù)拆分為訓(xùn)練和驗(yàn)證集,并本地驗(yàn)證模型性能。
from sklearn.model_selection import train_test_split
# splitting train data into training and validation set
xtrain, xvalid, ytrain, yvalid = train_test_split(train, sales,
test_size=0.25,
random_state=11)
最后,訓(xùn)練模型時(shí),我們使用的評(píng)估指標(biāo)是RMSE(均方根誤差)。
model_cat = CatBoostRegressor(iterations=100, learning_rate=0.3,
depth=6, eval_metric='RMSE',
random_seed=7)
# training model
model_cat.fit(xtrain, ytrain, cat_features=categorical_features,
use_best_model=True)
# validation score
model_cat.score(xvalid, yvalid)
訓(xùn)練完成后,模型在驗(yàn)證集上的RMSE值大約為1092.24。
這個(gè)模型在公共排行榜上的得分為1155.12。在沒有任何特征工程的情況下,在驗(yàn)證集和公共排行榜上的得分大約分別為1103和1183。因此,Featuretools創(chuàng)建的特征不只是隨機(jī)特征,它們非常有價(jià)值和有效果。最重要的是,它在特征工程中節(jié)省的時(shí)間是令人難以置信的。
7 Featuretools可解釋性
讓數(shù)據(jù)科學(xué)模型具有可解釋性是執(zhí)行機(jī)器學(xué)習(xí)中一個(gè)很重要的方面。Featuretools生成的特征甚至能很容易地解釋給非技術(shù)人員,因?yàn)樗鼈兪腔谌菀桌斫獾幕獦?gòu)建的。
例如,特征outlet.SUM(bigmart.Item_Weight)和outlet.STD(bigmart.Item_MRP)分別表示items中權(quán)重的outlet級(jí)總和和items中成本的標(biāo)準(zhǔn)偏差。
這使得那些不是機(jī)器學(xué)習(xí)專家的使用者能夠在他們的專業(yè)領(lǐng)域中理解和應(yīng)用這個(gè)方法。
總結(jié)
Featuretools庫真正地改變了機(jī)器學(xué)習(xí)的游戲規(guī)則。雖然它在工業(yè)領(lǐng)域的應(yīng)用還十分有限,但是它在機(jī)器學(xué)習(xí)競(jìng)賽中很快地受到大家的歡迎。它能在構(gòu)建機(jī)器學(xué)習(xí)模型中節(jié)省很多時(shí)間,且產(chǎn)生的特征很有效果,這也是我想把Featuretools介紹給大家的原因。
歡迎大家在處理數(shù)據(jù)集時(shí)嘗試下這種方法!
原文:
https://medium.com/analytics-vidhya/a-hands-on-guide-to-automated-feature-engineering-in-python-13260eae9270
— 完 —
加入社群
量子位AI社群19群開始招募啦,歡迎對(duì)AI感興趣的同學(xué),在量子位公眾號(hào)(QbitAI)對(duì)話界面回復(fù)關(guān)鍵字“交流群”,獲取入群方式;
此外,量子位專業(yè)細(xì)分群(自動(dòng)駕駛、CV、NLP、機(jī)器學(xué)習(xí)等)正在招募,面向正在從事相關(guān)領(lǐng)域的工程師及研究人員。
進(jìn)專業(yè)群請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面回復(fù)關(guān)鍵字“專業(yè)群”,獲取入群方式。(專業(yè)群審核較嚴(yán),敬請(qǐng)諒解)
誠(chéng)摯招聘
量子位正在招募編輯/記者,工作地點(diǎn)在北京中關(guān)村。期待有才氣、有熱情的同學(xué)加入我們!相關(guān)細(xì)節(jié),請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面,回復(fù)“招聘”兩個(gè)字。
總結(jié)
以上是生活随笔為你收集整理的python特征工程插件_手把手教你用Python实现自动特征工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 获取bean_Sp
- 下一篇: 美国联邦航空局出现电脑故障,导致全美航班