属性生成コンポーネントを用いた手軽な有効属性の生成

1. はじめに

本章を通して、ユーザーはモデルの予測精度を向上させるための有効属性を増やす、属性生成の理解を深められます。
また、属性生成コンポーネントを利用することで、手軽に二値展開や標準化などが行えるようになります。

具体的な達成目標は、以下の通りです。

  • 「コンポーネントが出力する属性の条件を理解する」

  • 「『複製』と『結合』を理解した上で、SPDを記述できる」

  • 複製:1つのコンポーネントから複数のコンポーネントにデータを渡す場合、全てに同一なデータを渡すこと

  • 結合:複数のコンポーネントから1つのコンポーネントへデータを渡す場合、データを結合してから渡すこと

自動車の燃料消費量予測の分析対象データを用いて、属性の複製と結合とコンポーネントが出力する属性について示します。

2. データの準備

本節では、学習・予測の実行と結果確認の2. データの準備と同様にデータの準備について記述します。

以下のデータ準備の手順について示します。

  1. 分析対象データに _sid の追加

  2. ASD(属性スキーマ)の作成

  3. 分析対象データから学習用と予測用を作成

以下のコードで、自動車の燃料消費量予測で使用される分析対象データを示します。

データは、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_settingskeep_attributesで設定した属性 (図中の属性名:y)

  • 出力しない属性

    • 属性選択条件で一致しなかった属性(図中の属性名:x1)

    • 属性選択条件で一致し、入力された属性 (図中の属性名:x2)

ただし、属性選択条件で一致してコンポーネントに入力された属性でも、SPDのglobal_settingskeep_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つある属性生成コンポーネントが出力した属性を、予測器コンポーネントは結合して入力します。

結合時のデータフロー

上図のように、複数の属性生成コンポーネントを使用する場合の SPDの記述例を示します。
下記のデータフローセクションでは、dlからbexpstdにデータを複製して入力するので、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 ReferenceSPD (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には、二値展開された属性と標準化された属性の名前が混在します。そのため、各属性生成コンポーネントにデータローダーコンポーネントから同じ入力データを用いてそれぞれで生成された属性が出力され、それらが結合されて予測器コンポーネントに入力されたことが確認できます。

ページトップへ