日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Feature Tools:可自动构造机器学习特征的Python库

發(fā)布時(shí)間:2024/1/17 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Feature Tools:可自动构造机器学习特征的Python库 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

選自Towards data science,作者:William Koehrsen,機(jī)器之心編譯。

目前,很多機(jī)器學(xué)習(xí)項(xiàng)目的模型選擇開(kāi)始轉(zhuǎn)向自動(dòng)化,而特征工程仍然主要以人工為主。這個(gè)過(guò)程的重要性可能比模型選擇更重要,人工得到的特征總帶有一定的局限性。在本文中作者將為我們介紹如何使用 Feature Tools Python 庫(kù)實(shí)現(xiàn)特征工程自動(dòng)化,項(xiàng)目已開(kāi)源。
  • 項(xiàng)目地址:docs.featuretools.com/
  • 代碼地址:github.com/WillKoehrsen

機(jī)器學(xué)習(xí)越來(lái)越多地從人工設(shè)計(jì)模型轉(zhuǎn)向使用 H20、TPOT 和 auto-sklearn 等工具自動(dòng)優(yōu)化的工具。這些庫(kù)以及隨機(jī)搜索(參見(jiàn)《Random Search for Hyper-Parameter Optimization》)等方法旨在通過(guò)尋找匹配數(shù)據(jù)集的最優(yōu)模型來(lái)簡(jiǎn)化模型選擇和機(jī)器學(xué)習(xí)調(diào)優(yōu)過(guò)程,而幾乎不需要任何人工干預(yù)。然而,特征工程作為機(jī)器學(xué)習(xí)流程中可能最有價(jià)值的一個(gè)方面,幾乎完全是人工的。

特征工程也被稱為特征構(gòu)造,是從現(xiàn)有數(shù)據(jù)中構(gòu)造新的特征從而訓(xùn)練機(jī)器學(xué)習(xí)模型的過(guò)程。這一步可能比實(shí)際上使用的模型更重要,因?yàn)橐粋€(gè)機(jī)器學(xué)習(xí)算法只能從我們給定的數(shù)據(jù)中學(xué)習(xí),所以構(gòu)造一個(gè)和任務(wù)相關(guān)的特征是至關(guān)重要的,參見(jiàn)優(yōu)質(zhì)論文《A Few Useful Things to Know about Machine Learning》。

通常,特征工程是一個(gè)冗長(zhǎng)的人工過(guò)程,依賴于領(lǐng)域知識(shí)、直覺(jué)和數(shù)據(jù)操作。這個(gè)過(guò)程可能是極其枯燥的,同時(shí)最終得到的特征將會(huì)受到人的主觀性和時(shí)間的限制。特征工程自動(dòng)化旨在通過(guò)從數(shù)據(jù)集中自動(dòng)構(gòu)造候選特征,并從中選擇最優(yōu)特征用于訓(xùn)練來(lái)幫助數(shù)據(jù)科學(xué)家。

在本文中,我們將介紹一個(gè)使用 Feature Tools Python 庫(kù)實(shí)現(xiàn)特征工程自動(dòng)化的例子。我們將使用一個(gè)示例數(shù)據(jù)集來(lái)說(shuō)明基本概念(繼續(xù)關(guān)注之后使用真實(shí)世界數(shù)據(jù)的例子)。本文完整代碼可在 Github 上找到。


特征工程基本概念

特征工程意味著從現(xiàn)有的數(shù)據(jù)中構(gòu)造額外特征,這些特征通常分布在多張相關(guān)的表中。特征工程需要從數(shù)據(jù)中提取相關(guān)信息并將其存入單張表格中,然后被用來(lái)訓(xùn)練機(jī)器學(xué)習(xí)模型。

構(gòu)造特征是一個(gè)非常耗時(shí)的過(guò)程,因?yàn)槊總€(gè)新的特征通常需要幾步才能構(gòu)造,特別是當(dāng)使用多張表的信息時(shí)。我們可以將特征構(gòu)造的操作分為兩類:「轉(zhuǎn)換」和「聚合」。以下通過(guò)幾個(gè)例子來(lái)看看這些概念的實(shí)際應(yīng)用。

通過(guò)從一或多列中構(gòu)造新的特征,「轉(zhuǎn)換」作用于單張表(在 Python 中,表是一個(gè) Pandas DataFrame)。舉個(gè)例子,若有如下的客戶表:

我們可以通過(guò)查找 joined 列中的月份或是自然對(duì)數(shù)化 income 列的數(shù)據(jù)來(lái)構(gòu)造新的特征。這些都是轉(zhuǎn)換操作,因?yàn)樗鼈冎挥玫搅艘粡埍淼男畔ⅰ?/p>

另一方面,「聚合」是跨表實(shí)現(xiàn)的,并使用一對(duì)多的關(guān)聯(lián)來(lái)對(duì)觀測(cè)值分組,然后計(jì)算統(tǒng)計(jì)量。例如,若我們有另外一張包含客戶貸款信息的表格,其中每個(gè)客戶可能有多項(xiàng)貸款,我們便可以計(jì)算每個(gè)客戶貸款的平均值、最大值和最小值等統(tǒng)計(jì)量。

這個(gè)過(guò)程包括根據(jù)不同客戶對(duì)貸款表進(jìn)行分組并計(jì)算聚合后的統(tǒng)計(jì)量,然后將結(jié)果整合到客戶數(shù)據(jù)中。以下是我們?cè)?Python 中使用 Pandas 庫(kù)執(zhí)行此操作。

import pandas as pd# Group loans by client id and calculate mean, max, min of loans stats = loans.groupby('client_id')['loan_amount'].agg(['mean', 'max', 'min']) stats.columns = ['mean_loan_amount', 'max_loan_amount', 'min_loan_amount']# Merge with the clients dataframe stats = clients.merge(stats, left_on = 'client_id', right_index=True, how = 'left')stats.head(10)

這些操作本身并不困難,但是如果有數(shù)百個(gè)變量分布在數(shù)十張表中,這個(gè)過(guò)程將無(wú)法通過(guò)人工完成。理想情況下,我們希望有一個(gè)解決方案能夠在不同表間自動(dòng)執(zhí)行轉(zhuǎn)換和聚合操作,并將結(jié)果整合到一張表中。盡管 Pandas 是一個(gè)很好的資源,但是仍然有許多數(shù)據(jù)操作需要我們?nèi)斯ね瓿?#xff01;有關(guān)人工特征工程的更多信息,請(qǐng)查閱《Python Data Science Handbook》。


特征工具

幸運(yùn)的是,Feature Tools 正是我們正在找尋的解決方案。這個(gè)開(kāi)源的 Python 庫(kù)可以從一組相關(guān)的表中自動(dòng)構(gòu)造特征。特征工具基于名為「深度特征合成」的方法(參見(jiàn)《Deep Feature Synthesis: Towards Automating Data Science Endeavors》),這個(gè)方法的名字聽(tīng)起來(lái)比其本身更高大上(這個(gè)名字源于疊加了多重特征,而不是因?yàn)槭褂昧松疃葘W(xué)習(xí)方法!)。

深度特征合成疊加多個(gè)轉(zhuǎn)換和聚合操作,這在特征工具的詞庫(kù)中被稱為特征基元,以便通過(guò)分布在多張表內(nèi)的數(shù)據(jù)來(lái)構(gòu)造新的特征。與機(jī)器學(xué)習(xí)中的大多數(shù)方法一樣,這是建立在簡(jiǎn)單概念基礎(chǔ)之上的復(fù)雜方法。通過(guò)一次學(xué)習(xí)一個(gè)構(gòu)造塊,我們可以很好地理解這個(gè)強(qiáng)大的方法。

首先,讓我們看一下示例數(shù)據(jù)。我們已經(jīng)看到了上面的一些數(shù)據(jù)集,并且完整的表組如下所示:

  • clients: 關(guān)于信用社客戶的基本信息。每個(gè)客戶只對(duì)應(yīng)數(shù)據(jù)框中的一行。
  • loans: 向用戶提供的貸款。每項(xiàng)貸款只對(duì)應(yīng)數(shù)據(jù)框中的一行,但是客戶可能有多項(xiàng)貸款。
  • payments:貸款還本的支付。每筆支付只對(duì)應(yīng)一行,但是每項(xiàng)貸款可以有多筆支付。

如果我們有一個(gè)機(jī)器學(xué)習(xí)任務(wù),例如預(yù)測(cè)客戶未來(lái)是否會(huì)償還一項(xiàng)貸款,我們希望將所有關(guān)于客戶的信息整合到一張表中。這些表是相關(guān)的(通過(guò) client_id 和 loan_id 變量),并且我們可以通過(guò)一系列轉(zhuǎn)換和聚合操作來(lái)人工實(shí)現(xiàn)這個(gè)過(guò)程。然而,我們很快就可以使用特征工具來(lái)自動(dòng)實(shí)現(xiàn)這個(gè)過(guò)程。


實(shí)體和實(shí)體集

特征工具的前兩個(gè)概念的是「實(shí)體」和「實(shí)體集」。一個(gè)實(shí)體就是一張表(或是 Pandas 中的一個(gè) DataFrame(數(shù)據(jù)框))。一個(gè)實(shí)體集是一組表以及它們之間的關(guān)聯(lián)。將一個(gè)實(shí)體集看成另一種 Python 數(shù)據(jù)結(jié)構(gòu),并帶有自己的方法和屬性。

我們可以通過(guò)以下操作在特征工具中創(chuàng)建一個(gè)空的實(shí)體集:

import featuretools as ft # Create new entityset es = ft.EntitySet(id = 'clients')

現(xiàn)在我們需要整合兩個(gè)實(shí)體。每個(gè)實(shí)體都必須帶有一個(gè)索引,它是一個(gè)包含所有唯一元素的列。就是說(shuō),索引中的每個(gè)值只能在表中出現(xiàn)一次。在 clients 數(shù)據(jù)框中的索引是 client_id,因?yàn)槊總€(gè)客戶在該數(shù)據(jù)框中只對(duì)應(yīng)一行。我們使用以下語(yǔ)法將一個(gè)帶有索引的實(shí)體添加一個(gè)實(shí)體集中:

# Create an entity from the client dataframe # This dataframe already has an index and a time index es = es.entity_from_dataframe(entity_id = 'clients', dataframe = clients, index = 'client_id', time_index = 'joined')

loans 數(shù)據(jù)框還有另外一個(gè)唯一的索引,loan_id,同時(shí)將其添加到實(shí)體集的語(yǔ)法與 clients 一樣。然而,payments 數(shù)據(jù)框不存在唯一索引。當(dāng)我們把 payments 數(shù)據(jù)框添加到實(shí)體集中時(shí),我們需要傳入?yún)?shù) make_index = True,同時(shí)指定索引的名字。另外,盡管特征工具能自動(dòng)推斷實(shí)體中每列的數(shù)據(jù)類型,但是我們可以通過(guò)將列數(shù)據(jù)類型的字典傳遞給參數(shù) variable_types 來(lái)覆蓋它。

# Create an entity from the payments dataframe # This does not yet have a unique index es = es.entity_from_dataframe(entity_id = 'payments', dataframe = payments,variable_types = {'missed': ft.variable_types.Categorical},make_index = True,index = 'payment_id',time_index = 'payment_date')

對(duì)于此數(shù)據(jù)框,盡管 missed 是一個(gè)整數(shù),但是它不是一個(gè)數(shù)值變量,因?yàn)樗荒苋?2 個(gè)離散的數(shù)值,所以在特征工具中,將其看成一個(gè)分類變量。在將該數(shù)據(jù)框添加到實(shí)體集中后,我們檢查整個(gè)實(shí)體集:

列的數(shù)據(jù)類型已根據(jù)我們指定的修正方案被正確推斷出來(lái)。接下來(lái),我們需要指定實(shí)體集中表是如何關(guān)聯(lián)的。


表的關(guān)聯(lián)

考慮兩張表之間「關(guān)聯(lián)」的最好方法是類比父子之間的關(guān)聯(lián)。這是一種一對(duì)多的關(guān)聯(lián):每個(gè)父親可以有多個(gè)兒子。對(duì)表來(lái)說(shuō),每個(gè)父親對(duì)應(yīng)一張父表中的一行,但是子表中可能有多行對(duì)應(yīng)于同一張父表中的多個(gè)兒子。

例如,在我們的數(shù)據(jù)集中,clients 數(shù)據(jù)框是 loans 數(shù)據(jù)框的一張父表。每個(gè)客戶只對(duì)應(yīng) clients 表中的一行,但是可能對(duì)應(yīng) loans 表中的多行。同樣,loans 表是 payments 表的一張父表,因?yàn)槊宽?xiàng)貸款可以有多項(xiàng)支付。父親通過(guò)共享變量與兒子相關(guān)聯(lián)。當(dāng)我們執(zhí)行聚合操作的時(shí)候,我們根據(jù)父變量對(duì)子表進(jìn)行分組,并計(jì)算每個(gè)父親的兒子的統(tǒng)計(jì)量。

為了形式化特征工具中的關(guān)聯(lián)規(guī)則,我們僅需指定連接兩張表的變量。clients 表和 loans 表通過(guò) client_id 變量連接,同時(shí) loans 表和 payments 表通過(guò) loan_id 變量連接。創(chuàng)建關(guān)聯(lián)并將其添加到實(shí)體集中的語(yǔ)法如下所示:

# Relationship between clients and previous loans r_client_previous = ft.Relationship(es['clients']['client_id'],es['loans']['client_id'])# Add the relationship to the entity set es = es.add_relationship(r_client_previous)# Relationship between previous loans and previous payments r_payments = ft.Relationship(es['loans']['loan_id'],es['payments']['loan_id'])# Add the relationship to the entity set es = es.add_relationship(r_payments)es

該實(shí)體集現(xiàn)在包含三個(gè)實(shí)體(表),以及將這些表連接在一起的關(guān)聯(lián)規(guī)則。在添加實(shí)體和形式化關(guān)聯(lián)規(guī)則之后,實(shí)體集就完整了并準(zhǔn)備好從中構(gòu)造新的特征。


特征基元

在我們深入了解深度特征合成之前,我們需要了解特征基元的概念。我們其實(shí)早就知道是什么了,只是我們剛剛用不同的名字來(lái)稱呼它們!它們只是我們用來(lái)構(gòu)造新特征的操作:

  • 聚合:根據(jù)父與子(一對(duì)多)的關(guān)聯(lián)完成的操作,也就是根據(jù)父親分組并計(jì)算兒子的統(tǒng)計(jì)量。一個(gè)例子就是根據(jù) client_id 對(duì) loan 表分組并找到每個(gè)客戶的最大貸款額。
  • 轉(zhuǎn)換:對(duì)一張表中一或多列完成的操作。一個(gè)例子就是取一張表中兩列之間的差值或者取一列的絕對(duì)值。

在特征工具中單獨(dú)使用這些基元或者疊加使用這些基元可以構(gòu)造新的特征。以下是特征工具中一些特征基元的列表,也可以自定義特征基元。

特征基元

這些基元可以單獨(dú)使用或是組合使用以構(gòu)造新的特征。為了使用特定的基元構(gòu)造新的特征,我們使用 ft.dfs 函數(shù)(代表深度特征合成)。我們傳入 entityset 和 target_entity,這是我們想要在其中添加特征的表,被選參數(shù) trans_primitives(轉(zhuǎn)換)和 agg_primitives(聚合)。

public class MyActivity extends AppCompatActivity { @Override //override the functionprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);try {OkhttpManager.getInstance().setTrustrCertificates(getAssets().open("mycer.cer");OkHttpClient mOkhttpClient= OkhttpManager.getInstance().build();} catch (IOException e) {e.printStackTrace();} }

返回的是包含每個(gè)客戶新特征的數(shù)據(jù)框(因?yàn)槲覀兌x客戶為 target_entity)。比如我們有每個(gè)客戶加入的月份,這是一個(gè)轉(zhuǎn)換操作的特征基元:

我們也有許多聚合操作的基元,比如每個(gè)客戶的平均支付總額:

盡管我們僅指定了一些特征基元,但是特征工具可以通過(guò)組合和疊加這些基元來(lái)構(gòu)造新的特征。

完整的數(shù)據(jù)框包含 793 列的新特征!


深度特征合成

我們現(xiàn)在具備理解深度特征合成(dfs)的一切條件。事實(shí)上,我們已經(jīng)在前面的函數(shù)調(diào)用中執(zhí)行了 dfs!深度特征只是疊加多個(gè)基元構(gòu)造的一個(gè)特征,而 dfs 只是構(gòu)造這些特征的過(guò)程的名稱。深度特征的深度是構(gòu)造這個(gè)特征所需的基元數(shù)量。

例如,MEAN(payments.payment_amount)列是深度為 1 的特征,因?yàn)樗鞘褂脝蝹€(gè)聚合操作構(gòu)造的。LAST(loans(MEAN(payments.payment_amount))是一個(gè)深度為 2 的特征,它是由兩個(gè)疊加的聚合操作構(gòu)造的:MEAN 列之上的 LAST(最近的)列。這表示每個(gè)客戶最近的貸款平均支付額。

我們可以疊加任意深度的特征,但在實(shí)踐中,我從沒(méi)有使用超過(guò) 2 個(gè)深度的特征。此外,這些特征很難解釋,但是我鼓勵(lì)任何對(duì)「深入」感興趣的人。

我們不必人工指定特征基元,但可以讓特征工具自動(dòng)為我們選取特征。為此,我們使用相同的 ft.dfs 函數(shù)調(diào)用,但是不傳入任何特征基元。

# Perform deep feature synthesis without specifying primitives features, feature_names = ft.dfs(entityset=es, target_entity='clients', max_depth = 2)features.head()

特征工具構(gòu)造了很多特征供我們使用。盡管這個(gè)過(guò)程確實(shí)能自動(dòng)構(gòu)造新的特征,但是它不會(huì)取代數(shù)據(jù)科學(xué)家,因?yàn)槲覀內(nèi)匀恍枰宄绾翁幚磉@些特征。例如,我們的目的是預(yù)測(cè)一位客戶是否會(huì)償還貸款,我們可以尋找與特定結(jié)果最相關(guān)的特征。此外,如果我們具有領(lǐng)域知識(shí),我們可以用這些知識(shí)來(lái)選擇指定的特征基元或候選特征的種子深度特征合成。


下一步

特征工程自動(dòng)化解決了一個(gè)問(wèn)題,但是帶來(lái)了另一個(gè)問(wèn)題:特征太多了。盡管在擬合一個(gè)模型之前很難說(shuō)哪些特征是重要的,但很可能不是所有這些特征都與我們想要訓(xùn)練的模型的任務(wù)相關(guān)。此外,擁有太多特征(參見(jiàn)《Irrelevant Features and the Subset Selection Problem》)可能會(huì)導(dǎo)致模型性能不佳,因?yàn)檩^無(wú)益的特征會(huì)淹沒(méi)那些更重要的特征。

特征過(guò)多問(wèn)題以維度災(zāi)難著稱。隨著特征數(shù)量的上升(數(shù)據(jù)維度增長(zhǎng)),模型越來(lái)越難以學(xué)習(xí)特征與目標(biāo)之間的映射關(guān)系。事實(shí)上,讓模型表現(xiàn)良好所需的數(shù)據(jù)量與特征數(shù)量成指數(shù)關(guān)系。

維度災(zāi)難與特征降維(也叫特征選擇,去除不相關(guān)特征的過(guò)程)相對(duì)。這可以采用多種形式:主成分分析(PCA)、SelectKBest、使用模型中特征的重要性或使用深度神經(jīng)網(wǎng)絡(luò)進(jìn)行自編碼。但是,特征降維是另一篇文章的不同主題。到目前為止,我們知道我們可以使用特征工具以最小的努力從許多表中構(gòu)造大量的特征!


結(jié)論

與機(jī)器學(xué)習(xí)中的許多主題一樣,使用特征工具進(jìn)行特征工程自動(dòng)化是一個(gè)基于簡(jiǎn)單想法的復(fù)雜概念。使用實(shí)體集、實(shí)體和關(guān)聯(lián)的概念,特征工具可以執(zhí)行深度特征合成操作來(lái)構(gòu)造新的特征。深度特征合成可以依次疊加特征基元:「聚合」,它們?cè)诙鄰埍黹g的一對(duì)多關(guān)聯(lián)中起作用,以及「轉(zhuǎn)換」,是應(yīng)用于單張表中一或多列以從多張表中構(gòu)造新的特征的函數(shù)。

在之后的文章中,我將介紹如何在現(xiàn)實(shí)世界的問(wèn)題上使用這項(xiàng)技術(shù),即在 Kaggle 上舉辦的房屋信用違約風(fēng)險(xiǎn)競(jìng)賽(kaggle.com/c/home-credi)。請(qǐng)繼續(xù)關(guān)注那則帖子,與此同時(shí),閱讀這則說(shuō)明以開(kāi)始競(jìng)賽(towardsdatascience.com/)! 我希望你們可以使用特征工程自動(dòng)化作為數(shù)據(jù)科學(xué)工作中的輔助工具。我們的模型與我們提供的數(shù)據(jù)一樣好,并且特征工程自動(dòng)化可以使特征構(gòu)造的過(guò)程更高效。

有關(guān)特征工具更多的信息,包括高級(jí)用法,請(qǐng)查看在線文檔(docs.featuretools.com/)。要了解在實(shí)踐中如何使用特征工具,請(qǐng)閱讀開(kāi)源庫(kù)的開(kāi)發(fā)公司 Feature Labs 的工作(featurelabs.com/)。

原文鏈接:towardsdatascience.com/

總結(jié)

以上是生活随笔為你收集整理的Feature Tools:可自动构造机器学习特征的Python库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。