属性生成コンポーネントを用いた手軽な有効属性の生成¶
1. はじめに¶
具体的な達成目標は、以下の通りです。
「コンポーネントが出力する属性の条件を理解する」
「『複製』と『結合』を理解した上で、SPDを記述できる」
複製:1つのコンポーネントから複数のコンポーネントにデータを渡す場合、全てに同一なデータを渡すこと
結合:複数のコンポーネントから1つのコンポーネントへデータを渡す場合、データを結合してから渡すこと
自動車の燃料消費量予測の分析対象データを用いて、属性の複製と結合とコンポーネントが出力する属性について示します。
2. データの準備¶
本節では、学習・予測の実行と結果確認の2. データの準備と同様にデータの準備について記述します。
以下のデータ準備の手順について示します。
分析対象データに _sid の追加
ASD(属性スキーマ)の作成
分析対象データから学習用と予測用を作成
以下のコードで、自動車の燃料消費量予測で使用される分析対象データを示します。
データは、UCIのオープンデータである Auto MPG Data Set (https://archive.ics.uci.edu/ml/datasets/auto+mpg) を属性名car_name
を削除して、利用しています。
[1]:
import pandas as pd
input_data = pd.read_csv('./data/auto-mpg.csv', na_values='?')
input_data.dropna(inplace=True)
input_data.insert(0, '_sid', list(range(input_data.shape[0])))
input_data.head()
[1]:
_sid | mpg | cylinders | displacement | horsepower | weight | acceleration | model_year | origin | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 18.0 | 8 | 307.0 | 130 | 3504 | 12.0 | 70 | 1 |
1 | 1 | 15.0 | 8 | 350.0 | 165 | 3693 | 11.5 | 70 | 1 |
2 | 2 | 18.0 | 8 | 318.0 | 150 | 3436 | 11.0 | 70 | 1 |
3 | 3 | 16.0 | 8 | 304.0 | 150 | 3433 | 12.0 | 70 | 1 |
4 | 4 | 17.0 | 8 | 302.0 | 140 | 3449 | 10.5 | 70 | 1 |
下記のコードで、分析対象データからASDを作成します。
[2]:
from sampotools.api import gen_asd_from_pandas_df
asd = gen_asd_from_pandas_df(input_data)
pd.DataFrame(asd).T[['scale']]
[2]:
scale | |
---|---|
_sid | INTEGER |
mpg | REAL |
cylinders | INTEGER |
displacement | REAL |
horsepower | INTEGER |
weight | INTEGER |
acceleration | REAL |
model_year | INTEGER |
origin | INTEGER |
学習・予測の実行と結果確認の2. データの準備で示している通り、上記のASDのweightとoriginの型を修正し、ASDファイルとして出力します。
[3]:
from sampotools.api import save_asd
#修正
asd['weight'] = {'scale': 'REAL'}
asd['origin'] = {'scale': 'NOMINAL', 'domain': ['1', '2', '3']}
#出力
save_asd(asd_object=asd, file_path='./data/auto-mpg.asd')
pd.DataFrame(asd).T[['scale', 'domain']]
[3]:
scale | domain | |
---|---|---|
_sid | INTEGER | NaN |
mpg | REAL | NaN |
cylinders | INTEGER | NaN |
displacement | REAL | NaN |
horsepower | INTEGER | NaN |
weight | REAL | NaN |
acceleration | REAL | NaN |
model_year | INTEGER | NaN |
origin | NOMINAL | [1, 2, 3] |
下記のコードを実行することで、全体の90%にあたる件数を学習用とし、CSVファイルを出力します。
[4]:
n_all = len(input_data)
n_predict = n_all // 10
n_learn = n_all - n_predict
learn_data = input_data.iloc[0:n_learn,:]
learn_data.to_csv('./data/auto-mpg_learn.csv', sep=",", index=False)
本節の具体的な説明は、学習・予測の実行と結果確認の2. データの準備 を参照してください。
3. コンポーネントが出力する属性の条件¶
下図は、以下の2点について示しています。 - 分析対象データは、データローダーコンポーネントから二値展開の属性生成コンポーネントに入力される - 二値展開の属性生成コンポーネントから出力された属性が予測器コンポーネントに入力される
二値展開は、カテゴリ型の属性から数値型の属性を生成しています。そのため、予測器コンポーネントに二値展開で生成した属性とSPDで設定した属性を渡しています。
属性生成コンポーネントが出力する属性の条件は、以下の通りです。
出力する属性
コンポーネントで生成された属性 (図中の属性名:x3, x4)
SPDの
global_settings
のkeep_attributes
で設定した属性 (図中の属性名:y)
出力しない属性
属性選択条件で一致しなかった属性(図中の属性名:x1)
属性選択条件で一致し、入力された属性 (図中の属性名:x2)
ただし、属性選択条件で一致してコンポーネントに入力された属性でも、SPDのglobal_settings
のkeep_attributes
で設定していれば属性は出力されます。
SPDのglobal_settingsは、下記のパラメーターを持ちます。
keep_attributes
コンポーネントに必ず引き継がせたい属性名を指定します。目的変数のような予測器コンポーネントまで引き継ぐ必要がある属性を設定します。
feature_exclude
各コンポーネントの属性選択条件に一致しても、一切使用しない属性名を指定します。目的変数は使用されないように設定する必要があります。
以下に、二値展開の属性生成コンポーネントを使用するSPDの記述例を示します。
[5]:
spd_content = '''
dl -> bexp -> rg
---
components:
dl:
component: DataLoader
bexp:
component: BinaryExpandFDComponent
features: scale == 'nominal'
rg:
component: FABHMEBernGateLinearRgComponent
features: name != 'mpg'
target: name == 'mpg'
standardize_target: True
tree_depth: 3
global_settings:
keep_attributes:
- mpg
feature_exclude:
- mpg
'''
以下に学習用SRCの記述例を示します。
[6]:
learn_src_templ = '''
fabhmerg_learn_attr:
type: learn
data_sources:
dl:
path: ./data/auto-mpg_learn.csv
attr_schema: ./data/auto-mpg.asd
'''
上記のSPDと学習用SRCを用いて、学習を実行します。 SAMPO/FABが読み込めるように、SPDをgen_spd()関数で、学習用SRCをgen_src()関数で生成します。
[7]:
import os
from sampo.api import gen_spd, gen_src, process_store, process_runner
pstore_url = './pstore_attr'
if not os.path.isdir(pstore_url):
process_store.create(pstore_url)
spd = gen_spd(template=spd_content)
learn_src = gen_src(template=learn_src_templ)
process_runner.run(src=learn_src, spd=spd, pstore_url=pstore_url)
[7]:
fabhmerg_learn_attr.6929da69-b371-4f19-ae85-cd65ba3dcdf3
学習を実行し、属性生成コンポーネントの出力した属性を確認します。 load_comp_output()関数に属性生成のコンポーネントIDを指定することで、下表のように生成された属性とkeep_attributes
に指定された属性が出力されていることを確認できます。
[8]:
from sampo.api import process_store
import pandas as pd
with process_store.open_process(pstore_url, 'fabhmerg_learn_attr') as prl:
bexp_df = prl.load_comp_output('bexp')
bexp_df.head()
[8]:
mpg | bexp(1)_origin | bexp(2)_origin | bexp(3)_origin | |
---|---|---|---|---|
_sid | ||||
0 | 18.0 | 1.0 | 0.0 | 0.0 |
1 | 15.0 | 1.0 | 0.0 | 0.0 |
2 | 18.0 | 1.0 | 0.0 | 0.0 |
3 | 16.0 | 1.0 | 0.0 | 0.0 |
4 | 17.0 | 1.0 | 0.0 | 0.0 |
4. 複製と結合¶
本節では、複数の属性生成コンポーネントを使用するケースで複製と結合を示します。 - 複製:1つのコンポーネントから複数のコンポーネントにデータを渡す場合、全てに同一なデータを渡すこと - 結合:複数のコンポーネントから1つのコンポーネントへデータを渡す場合、データを結合してから渡すこと
下図では、2つの属性生成コンポーネントを使用する例を示します。
データローダーコンポーネントから複数の属性生成コンポーネントへ分析対象データを入力する場合、分析対象データを複製して各属性生成コンポーネントへ同じ入力をする
2つある属性生成コンポーネントが出力した属性を、予測器コンポーネントは結合して入力します。
dl
からbexp
とstd
にデータを複製して入力するので、std
の前のdl
は省略することが出来ます。[9]:
spd_content_attr = '''
dl -> bexp -> rg
-> std -> rg
---
components:
dl:
component: DataLoader
bexp:
component: BinaryExpandFDComponent
features: scale == 'nominal'
std:
component: StandardizeFDComponent
features: scale == 'real' or scale == 'integer'
rg:
component: FABHMEBernGateLinearRgComponent
features: name != 'mpg'
target: name == 'mpg'
standardize_target: True
tree_depth: 3
global_settings:
keep_attributes:
- mpg
feature_exclude:
- mpg
'''
データフローセクションの仕様については、Analytics Reference
のSPD (SAMPO Process Description) Specification
を参照してください。
以下に、学習用SRCを示します。
[10]:
learn_src_templ = '''
fabhmerg_learn_attr:
type: learn
data_sources:
dl:
path: ./data/auto-mpg_learn.csv
attr_schema: ./data/auto-mpg.asd
'''
上記のSPDとSRCを使用して学習を実行します。
[11]:
from sampo.api import gen_spd, gen_src, process_store, process_runner
pstore_url = './pstore_attr'
if not os.path.isdir(pstore_url):
process_store.create(pstore_url)
spd = gen_spd(template=spd_content_attr)
learn_src = gen_src(template=learn_src_templ)
process_runner.run(src=learn_src, spd=spd, pstore_url=pstore_url)
[11]:
fabhmerg_learn_attr.5cfd4c92-31bc-4ff3-a71c-d2dab6a8289d
attr_name
を出力して確認します。[12]:
from sampo.api import process_store
import pandas as pd
with process_store.open_process(pstore_url, 'fabhmerg_learn_attr') as prl:
df = prl.load_model('rg')
result_df = df['prediction_formulas']
result_df.reset_index(inplace=True)
result_df.iloc[:, 0:1]
[12]:
attr_name | |
---|---|
0 | bexp(1)_origin |
1 | bexp(2)_origin |
2 | bexp(3)_origin |
3 | std_cylinders |
4 | std_displacement |
5 | std_horsepower |
6 | std_weight |
7 | std_acceleration |
8 | std_model_year |
9 | bias |
10 | variance |
attr_name
には、二値展開された属性と標準化された属性の名前が混在します。そのため、各属性生成コンポーネントにデータローダーコンポーネントから同じ入力データを用いてそれぞれで生成された属性が出力され、それらが結合されて予測器コンポーネントに入力されたことが確認できます。