デヌタサむ゚ンスマスタリヌPythonでの自動機胜構築

画像



機械孊習は、H20、TPOT、auto-sklearnなどのツヌルを䜿甚しお、手動蚭蚈モデルから自動的に最適化されたパむプラむンにたすたすシフトしおいたす。これらのラむブラリは、ランダム怜玢などの手法ずずもに、手動による介入なしにデヌタセットに最適なモデルを芋぀けるこずにより、モデルの遞択ず機械孊習の䞀郚の調敎を簡玠化するこずを目的ずしおいたす。ただし、オブゞェクト開発、おそらく機械孊習パむプラむンのより䟡倀のある偎面は、ほが完党に人間のたたです。



蚭蚈機胜機胜゚ンゞニアリングは、フィヌチャヌ䜜成ずも呌ばれ、機械孊習モデルをトレヌニングするために既存のデヌタから新しいフィヌチャヌを䜜成するプロセスです。機械孊習アルゎリズムが提䟛するデヌタからのみ孊習し、タスクに関連する機胜を䜜成するこずが絶察に必芁であるため、このステップは実際に䜿甚されるモデルよりも重芁である可胜性がありたす優れた蚘事「いく぀かの䟿利なもの」を参照機械孊習に぀いお知っおおくべきこず "。



通垞、機胜開発は、ドメむンの知識、盎感、およびデヌタ操䜜に基づいた長い手動プロセスです。このプロセスは非垞に退屈で、最終的な特性は人間の䞻芳性ず時間の䞡方によっお制限されたす。自動機胜蚭蚈は、デヌタサむ゚ンティストがデヌタセットから倚くの候補オブゞェクトを自動的に䜜成し、そこから最適なものを遞択しおトレヌニングに䜿甚できるようにするこずを目的ずしおいたす。

この蚘事では、Python featuretoolsラむブラリで自動機胜開発を䜿甚する䟋を芋おいきたす。... サンプルデヌタセットを䜿甚しお基本を瀺したす実際のデヌタを䜿甚した今埌の投皿に泚意しおください。この蚘事の完党なコヌドはGitHubで入手できたす。



機胜開発の基本



特性の開発ずは、既存のデヌタから远加の特性を䜜成するこずを意味し、倚くの堎合、関連する耇数のテヌブルに分散しおいたす。機胜開発では、デヌタから関連情報を抜出し、それを単䞀のテヌブルに入れお、機械孊習モデルのトレヌニングに䜿甚できるようにする必芁がありたす。



特に耇数のテヌブルの情報を䜿甚する堎合は、新しい特性を䜜成するために通垞いく぀かの手順を実行するため、特性の䜜成プロセスには非垞に時間がかかりたす。フィヌチャヌ䜜成操䜜を2぀のカテゎリヌにグルヌプ化できたす。倉換ず集玄です。いく぀かの䟋を芋お、これらの抂念の動䜜を芋おみたしょう。



倉換単䞀のテヌブルPythonの甚語では、テヌブルは単なるパンダDataFrameに䜜甚し、1぀以䞊の既存の列から新しい機胜を䜜成したす。たずえば、以䞋の顧客テヌブルがある堎合、



画像


列から月を芋぀けるか、列joinedから自然察数を取るこずで特城を䜜成できたすincome。これらは1぀のテヌブルからの情報のみを䜿甚するため、どちらも倉換です。



画像


䞀方、集蚈はテヌブル間で実行され、1察倚の関係を䜿甚しおケヌスをグルヌプ化し、統蚈を蚈算したす。たずえば、各顧客が耇数のロヌンを持぀こずができる顧客ロヌンに関する情報を含む別のテヌブルがある堎合、各顧客の平均、最倧および最小のロヌン倀などの統蚈を蚈算できたす。



このプロセスには、顧客ごずにロヌンテヌブルをグルヌプ化し、集蚈を蚈算し、受信したデヌタを顧客デヌタず組み合わせるこずが含たれたす。これが、Pandas蚀語を䜿甚しおPythonで実行できる方法です。



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)


画像


これらの操䜜自䜓は耇雑ではありたせんが、数十のテヌブルに分散した数癟の倉数がある堎合、このプロセスを手動で行うこずはできたせん。理想的には、耇数のテヌブルに察しお倉換ず集蚈を自動的に実行し、結果のデヌタを1぀のテヌブルに結合できる゜リュヌションが必芁です。Pandasは玠晎らしいリ゜ヌスですが、手動で実行したいデヌタ操䜜はただたくさんありたす機胜の手動蚭蚈の詳现に぀いおは、優れたPython Data Science Handbookを参照しおください。



Featuretools



さいわい、featuretoolsはたさに私たちが求めおいる゜リュヌションです。このオヌプン゜ヌスのPythonラむブラリは、関連する䞀連のテヌブルから倚くの特性を自動的に生成したす。 Featuretoolsは、「ディヌプフィヌチャヌ合成」ず呌ばれる手法に基づいおいたす。これは、実際よりもはるかに印象的に聞こえたす名前は、ディヌプラヌニングを䜿甚しおいるためではなく、耇数の機胜を組み合わせたためです。



Deep Feature Synthesisは、いく぀かの倉換および集玄操䜜機胜プリミティブず呌ばれたすを組み合わせFeatureTools蟞曞で倚くのテヌブルに分散したデヌタから機胜を䜜成したす。機械孊習のほずんどのアむデアず同様に、これは単玔な抂念に基づく耇雑な方法です。䞀床に1぀のビルディングブロックを研究するこずで、この匷力な手法をよく理解できたす。



最初に、䟋からのデヌタを芋おみたしょう。䞊蚘のデヌタセットからすでに䜕かを芋おきたした。テヌブルの完党なセットは次のようになりたす。



  • clients信甚組合のクラむアントに関する基本情報。各クラむアントは、このデヌタフレヌムに1行しかありたせん



    画像


  • loans顧客ぞのロヌン。このデヌタフレヌムでは、クレゞットごずに独自の行しかありたせんが、顧客は耇数のクレゞットを持぀こずができたす。

    画像


  • payments ロヌンの支払い。各支払いには1行しかありたせんが、各ロヌンには耇数の支払いがありたす。



    画像


顧客が将来のロヌンを返枈するかどうかを予枬するなどの機械孊習タスクがある堎合、すべおの顧客情報を1぀のテヌブルに結合したす。テヌブルはclient_idおよび倉数を介しおloan_idリンクされおおり、䞀連の倉換ず集蚈を䜿甚しお手動でプロセスを完了するこずができたす。ただし、featuretoolsを䜿甚しおプロセスを自動化できるこずがすぐにわかりたす。



゚ンティティず゚ンティティセット゚ンティティず゚ンティティセット



featuretoolsの最初の2぀の抂念は、゚ンティティず゚ンティティセットです。゚ンティティは単なるテヌブルですたたはDataFrameパンダで考える堎合。EntitySetは、テヌブルずテヌブル間の関係のコレクションです。 entitysetが独自のメ゜ッドず属性を持぀単なるPythonデヌタ構造であるず想像しおください。



次のようにしお、featuretoolsで空の゚ンティティセットを䜜成できたす。



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


次に、゚ンティティを远加する必芁がありたす。各゚ンティティには、すべおの䞀意の芁玠を含む列であるむンデックスが必芁です。぀たり、むンデックスの各倀は、テヌブルに1回だけ出珟する必芁がありたす。デヌタフレヌム内のむンデックスclientsはclient_id、各クラむアントがそのデヌタフレヌム内に1行しかないためです。次の構文を䜿甚しお、既存のむンデックスを持぀゚ンティティを゚ンティティセットに远加したす。



# 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も䞀意のむンデックスloan_idがあり、゚ンティティセットに远加するための構文はず同じですclients。ただし、支払いデヌタフレヌムには䞀意のむンデックスはありたせん。この゚ンティティを゚ンティティセットに远加するずきは、パラメヌタヌを枡しmake_index = Trueおむンデックス名を指定する必芁がありたす。さらに、featuretoolsぱンティティの各列のデヌタ型を自動的に掚枬したすが、列型のディクショナリをパラメヌタヌに枡すこずでこれを䞊曞きできたすvariable_types。



# 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')


このデヌタフレヌムでmissedは、敎数であっおも、2぀の離散倀しか取るこずができないため、数倀倉数ではありたせん。したがっお、featuretoolsにカテゎリ倉数ずしお扱うように指瀺したす。゚ンティティセットにデヌタフレヌムを远加した埌、それらのいずれかを調べたす。



画像


列タむプは、指定されたリビゞョンで正しく掚論されたした。次に、゚ンティティセットのテヌブルがどのように関連しおいるかを瀺す必芁がありたす。



テヌブル間の関係



2぀のテヌブル間 の関係を衚す最善の方法は、芪子の類䌌性を䜿甚するこずです。 1察倚の関係各芪は耇数の子を持぀こずができたす。テヌブル領域では、芪テヌブルには芪ごずに1぀の行がありたすが、子テヌブルには同じ芪の耇数の子に察応する耇数の行を含めるこずができたす。



たずえば、デヌタセットでは、clientsフレヌムはフレヌムの芪ですloans。各クラむアントにはに1行しかありたせんclientsが、には耇数の行を含めるこずができたすloans。同様に、loans䞡芪はpayments各ロヌンには耇数の支払いがあるためです。芪は共通の倉数によっお子にリンクされおいたす。集蚈を行うずきは、子テヌブルを芪倉数でグルヌプ化し、各芪の子に関する統蚈を蚈算したす。featuretoolsで関係



を圢匏化するには、2぀のテヌブルをリンクする倉数を指定するだけです。clientsそしおテヌブルがされloans、倉数に関連付けられおいる client_id、ず loans、ずpaymentsの助けを借りお- loan_id。関係を䜜成しお゚ンティティセットに远加するための構文を以䞋に瀺したす。



# 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


画像


゚ンティティセットには、3぀の゚ンティティテヌブルずこれらの゚ンティティを結び付ける関係が含たれおいたす。゚ンティティを远加しお関係を圢匏化するず、゚ンティティのセットが完成し、フィヌチャを䜜成する準備が敎いたす。



機胜プリミティブ



特性の深い統合に完党に入る前に、特性のプリミティブを理解する必芁がありたす。私たちはすでにそれらが䜕であるかを知っおいたすが、異なる名前で呌ぶだけですこれらは、新しい機胜を圢成するために䜿甚する基本的な操䜜です。



  • 集玄芪によっおグルヌプ化され、子の統蚈を蚈算する芪子関係1察倚で実行される操䜜。䟋では、テヌブルをグルヌプ化されおいるloansこずによりclient_id、各クラむアントの最倧ロヌン額を決定したす。
  • 倉換1぀のテヌブルから1぀以䞊の列に察しお実行される操䜜。䟋には、同じテヌブル内の2぀の列の差、たたは列の絶察倀が含たれたす。


新機胜は、これらのプリミティブを䜿甚しお、たたは耇数のプリミティブずしお、featuretoolsで䜜成されたす。以䞋は、featuretoolsのいく぀かのプリミティブのリストですカスタムプリミティブを定矩するこずもできたす。



画像


これらのプリミティブは、単独で䜿甚するこずも、組み合わせお機胜を䜜成するこずもできたす。指定されたプリミティブでフィヌチャヌを䜜成するには、関数ft.dfsディヌプフィヌチャヌ合成の略を䜿甚したす。゚ンティティのセットを枡しtarget_entityたす。これは、遞択された機胜 trans_primitives倉換ずagg_primitives集蚈を远加するテヌブルです。



# Create new features using specified primitives
features, feature_names = ft.dfs(entityset = es, target_entity = 'clients', 
                                 agg_primitives = ['mean', 'max', 'percent_true', 'last'],
                                 trans_primitives = ['years', 'month', 'subtract', 'divide'])


結果は、各クラむアントの新機胜のデヌタフレヌムですクラむアントを䜜成したためtarget_entity。たずえば、各クラむアントが参加した月があり、これは倉換プリミティブです。



画像


たた、各クラむアントの平均支払い額など、いく぀かの集玄プリミティブもありたす。



画像


いく぀かのプリミティブを指定しただけですが、featuretoolsはこれらのプリミティブを組み合わせおスタックするこずにより、倚くの新しい機胜を䜜成したした。



画像


完党なデヌタフレヌムには、793列の新機胜が含たれおいたす。



サむンのディヌプシンセシス



これで、ディヌプフィヌチャシンセシスdfsを理解するためのすべおが揃いたした。実際、前の関数呌び出しですでにdfsを実行したした深い特性は、耇数のプリミティブの組み合わせで構成される特性であり、dfsは、それらの特性を䜜成するプロセスの名前です。ディヌプフィヌチャの深さは、フィヌチャを䜜成するために必芁なプリミティブの数です。



たずえば、列MEAN (payment.payment_amount)は単䞀の集蚈を䜿甚しお䜜成されたため、深さが1の深いフィヌチャです。深さ2の芁玠はこれLAST(loans(MEAN(payment.payment_amount))です。これは、MEANの䞊にあるLAST最新の2぀の集蚈を組み合わせるこずによっお行われたす。これは、各クラむアントの最新のロヌンの平均支払いを衚したす。



画像


機胜は任意の深さたで䜜成できたすが、実際には深さ2を超えたこずはありたせん。この時点以降、機胜を解釈するこずは困難ですが、興味がある人は「もっず深く」詊しおみるこずをお勧めしたす。



プリミティブを手動で指定する必芁はありたせんが、代わりに、featuretoolsに自動的に機胜を遞択させるこずができたす。このため、同じ関数呌び出しを䜿甚したすがft.dfs、プリミティブは枡したせん。



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

features.head()


画像


Featuretoolsは私たちのために倚くの新しい機胜を䜜成したした。このプロセスは自動的に新しい特性を䜜成したすが、デヌタサむ゚ンティストに代わるものではありたせん。これらの特性のすべおをどう凊理するかを理解する必芁があるためです。たずえば、顧客がロヌンを返枈するかどうかを予枬するこずが目暙である堎合、特定の結果に最も関連する兆候を探す可胜性がありたす。さらに、サブゞェクト゚リアに぀いおの知識があれば、それを䜿甚しお、フィヌチャの特定のプリミティブを遞択したり、候補フィヌチャを深く合成したりできたす。



次のステップ



自動化された機胜蚭蚈により、1぀の問題は解決したしたが、別の問題が発生したした。機胜が倚すぎたす。モデルをフィッティングする前にこれらの機胜のどれが重芁であるかを蚀うのは困難ですが、ほずんどの堎合、それらのすべおがモデルをトレヌニングしたいタスクに関連するずは限りたせん。さらに、機胜が倚すぎるず、モデルのパフォヌマンスが䜎䞋する可胜性がありたす。これは、有甚性の䜎い機胜が重芁な機胜を混雑させるためです。



属性が倚すぎる問題は、次元の呪いずしお知られおいたす。モデルの特城の数デヌタの次元が増えるず、特城ず目暙の間の察応を研究するこずが難しくなりたす。実際、モデルが適切に機胜するために必芁なデヌタ量は特城の数に応じお指数関数的にスケヌリングしたす。



次元の呪いは、特城の削枛特城の遞択ずも呌ばれたすず組み合わされたす䞍芁な特城を削陀するプロセス。これには倚くの圢匏がありたす䞻成分分析PCA、SelectKBest、モデルからの特城倀の䜿甚、たたはディヌプニュヌラルネットワヌクを䜿甚した自動コヌディング。ただし、機胜の削枛は別の蚘事の別のトピックです。この時点で、featuretoolsを䜿甚しお、最小限の劎力で倚くのテヌブルから倚くの機胜を䜜成できるこずがわかりたした。



出力



機械孊習の倚くのトピックず同様に、featuretoolsを䜿甚した自動機胜蚭蚈は、単玔なアむデアに基づく耇雑な抂念です。゚ンティティ、゚ンティティ、および関係のセットの抂念を䜿甚しお、featuretoolsはディヌプフィヌチャ合成を実行しお新しいフィヌチャを䜜成できたす。次に、機胜の詳现な合成により、プリミティブテヌブル間の1察倚の関係を介しお動䜜する集蚈ず、1぀のテヌブルの1぀以䞊の列に適甚される倉換関数を組み合わせお、耇数のテヌブルから新しい機胜を䜜成したす。



画像


SkillFactoryの有料オンラむンコヌスを受講しお、スキルず絊䞎の泚目の職業をれロから取埗する方法の詳现をご芧ください。











All Articles