基本的な分析の実行手順

1. はじめに

本章を通して、ユーザーは異種混合学習技術を用いて、簡単なデータ分析ができるようになります。

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

  • 「SAMPO/FABの学習と予測の実行方法を理解した上で、ユーザー自身で用意したデータを用いて学習・予測の実行ができる」

本章では、自動車の燃料消費量予測を題材として、学習と予測を実行する例を示します。その中で、モデルの作成と予測結果の確認について示します。

2. データの準備

本節では、以下のデータ準備の手順について示します。

  1. 分析対象データにサンプルID (_sid) を追加

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

  3. 分析対象データを学習用と予測用に分割

本章では、自動車の燃料消費量予測で使用される分析対象データを使用します。

データは、UCIのオープンデータである Auto MPG Data Set (https://archive.ics.uci.edu/ml/datasets/auto+mpg) を属性名car_nameを削除して、利用しています。

自動車の燃料消費量予測の属性とデータの型は、下記の表のとおりです。目的変数はmpg、その他が説明変数です。

属性名

データ型

   説明

mpg

REAL

1ガロンで進める距離(mile per gallon)

cylinders

INTEGER

エンジンの気筒数

displacement

REAL

排気量

horsepower

INTEGER

馬力

weight

REAL

重量

acceleration

REAL

加速度

model_year

INTEGER

年式(西暦の下二桁)

origin

NOMINAL

原産国(1:アメリカ、2:ヨーロッパ、3:日本)

2.1. 分析対象データにサンプルID (_sid) を追加

**サンプルID(_sid)**は、SAMPO/FABがサンプルを識別するための一意に識別できる整数型の属性です。

SAMPO/FABで分析を実行する際には、分析対象データに_sidの属性が含まれていなければなりません。
そのため、ユーザーは分析を行う前に以下の作業をする必要があります。
  1. 分析対象データに_sidという名の属性の有無を確認する

  2. 分析対象データに_sidが無い場合は_sidを追加する

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

[1]:
import pandas as pd

input_data = pd.read_csv('./data/auto-mpg.csv', na_values='?')

input_data.head()
[1]:
mpg cylinders displacement horsepower weight acceleration model_year origin
0 18.0 8 307.0 130 3504 12.0 70 1
1 15.0 8 350.0 165 3693 11.5 70 1
2 18.0 8 318.0 150 3436 11.0 70 1
3 16.0 8 304.0 150 3433 12.0 70 1
4 17.0 8 302.0 140 3449 10.5 70 1

上記の表から、_sidが分析対象データに含まれていないことが確認できます。

SAMPO/FABの分析では、欠損値が1つでも含まれるサンプルは学習や予測で使用されません。 そのため、欠損値を含むサンプルを削除し、分析対象データの先頭列に連続値の _sid を追加します。

[2]:
input_data.dropna(inplace=True)

input_data.insert(0, '_sid', list(range(input_data.shape[0])))

input_data.head()
[2]:
_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

2.2. ASDの作成

本節では、SAMPO/FABに分析対象データの属性スキーマを読み込ませるASDを作成します。

下記のコードを実行し、分析対象データを読み込んだPandas DataFrameからASDを作成します。

[3]:
from sampotools.api import gen_asd_from_pandas_df

asd = gen_asd_from_pandas_df(input_data)
pd.DataFrame(asd).T
[3]:
scale
_sid INTEGER
mpg REAL
cylinders INTEGER
displacement REAL
horsepower INTEGER
weight INTEGER
acceleration REAL
model_year INTEGER
origin INTEGER

上記で出力されたASDの型が、1. はじめにで示している分析対象データの属性の型と一致しているか確認します。

weightとoriginの型が一致していないことが確認できます。

下記のコードを実行し、weightとoriginの型を修正します。 修正後、ASDにdomainの列とoriginのカテゴリの一覧が追加されます。

[4]:
asd['weight'] = {'scale': 'REAL'}
asd['origin'] = {'scale': 'NOMINAL', 'domain': ['1', '2', '3']}
pd.DataFrame(asd).T[['scale', 'domain']]
[4]:
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]

下記で、修正したASDをASD形式のファイルに出力します。

[5]:
from sampotools.api import save_asd

save_asd(asd_object=asd, file_path='./data/auto-mpg.asd')

2.3. 分析対象データを学習用と予測用に分割

分析対象データを学習用と予測用に分けて、CSVファイルに出力します。

下記のコードを実行することで、全体の90%にあたる件数を学習用とし、残り10%の件数を予測用としてそれぞれCSVファイルに出力します。

[6]:
n_all = len(input_data)
n_predict = n_all // 10
n_learn = n_all - n_predict

learn_data = input_data.iloc[0:n_learn,:]
predict_data = input_data.iloc[n_learn:n_all,:]

learn_data.to_csv('./data/auto-mpg_learn.csv', sep=",", index=False)
predict_data.to_csv('./data/auto-mpg_predict.csv', sep=",", index=False)

3. 学習の実行方法

本節では、SPDと学習用SRCの作成、学習の実行方法を示します。

3.1. SPDの定義

本項では、SPDの定義を2つのステップで説明します。

ステップ1 実行順序とコンポーネントの記述

SPDの記述例:

[7]:
spd_content = '''
dl -> rg

---

components:
    dl:
        component: DataLoader

    rg:
        component: FABHMEBernGateLinearRgComponent
'''

SPDは、データフローセクションとパラメーターセクションで構成されており、セパレーターによって区切られています。

  • データフローセクション ・・・ dlrgのようなコンポーネントIDを->で繋ぐことで分析プロセスを記述します

  • パラメーターセクション ・・・ componentsのサブセクションにコンポーネントIDを記述します

    • コンポーネントIDのサブセクションで、使用するコンポーネント名を記述します

  • セパレーター ・・・ ---で記述します

注意点 - セパレーターは、---より短くすることは出来ませんが、より長く記述することは可能です。

  • パラメーターセクションの記述形式は、YAMLフォーマットが採用されています。 そのため、インデントは必ず半角スペース4つ(または2つ)で記述します。 また、各コンポーネントパラメーターを記述する際には、 : (コロン) と名前の前に必ず半角スペースを1つ入力して、パラメーターの値を記述します。

ステップ2 コンポーネントパラメーターの記述

SPDの記述例:

[8]:
spd_content = '''
dl -> rg

---

components:
    dl:
        component: DataLoader

    rg:
        component: FABHMEBernGateLinearRgComponent
        features: name != 'mpg' and scale != 'nominal'
        target: name == 'mpg'
        standardize_target: True
        tree_depth: 3
'''

本ステップでは、ステップ1のSPDの記述例に続けて components のサブセクションにある rg のコンポーネントパラメーターを記述します。

コンポーネントパラメーター名

記述する内容

features

説明変数の属性選択条件

target

目的変数の属性選択条件

standardize_target

目的変数の標準化の有効化

tree_depth

初期の門木の深さ

補足: - dlで選択しているデータローダーコンポーネントは、コンポーネントパラメーターを持ちません。 - rgで選択している予測器コンポーネントは、NOMINAL型の属性を入力するとエラーを返します。そのため、NOMINAL型の属性をfeaturesで属性選択されないように条件を設定します。

SPDの詳細については、Analytics ReferenceSPD (SAMPO Process Description) Specificationを参照してください。

また、SPDに記述できるコンポーネントの一覧と各コンポーネントのパラメーターについては、Analytics ReferenceComponent Specificationを参照してください。

3.2. 学習用SRCの定義

学習用SRC の記述例:

[9]:
learn_src_templ = '''
fabhmerg_learn:
    type: learn
    data_sources:
        dl:
            path: ./data/auto-mpg_learn.csv
            attr_schema: ./data/auto-mpg.asd

'''

学習用SRCには、プロセス名であるfabhmerg_learnのサブセクションにtypedata_sourcesを記述します。typeには、学習用SRCなのでlearnを設定します。

data_sourcesのサブセクションには、SPDで設定したDataLoaderのコンポーネントIDごとに分析対象データ、ASDの格納先を記述します。 上記の記述例では、分析対象データがCSVファイルの場合を示しており、データベースまたはPandas DataFrameの記述例は、SRCの詳細から確認してください。

SRCの詳細は、Analytics ReferenceSRC (SAMPO Run Configuration) Specificationを参照してください。

3.3. 学習の実行

本項では、SPDと学習用SRCを用いて学習の実行方法を示します。

学習の実行に伴い、プロセスストアの作成を行います。

プロセスストアは、学習(または予測)の実行済プロセスを格納するリポジトリです。 下記の pstore_url のように、プロセスストアのパスを指定することが可能です。

[10]:
import os
from sampo.api import process_store

pstore_url = './pstore'
if not os.path.isdir(pstore_url):    process_store.create(pstore_url)

下記のコードで、SAMPO/FABが読み込めるようにSPDをgen_spd()関数で、学習用SRCをgen_src()関数で生成します。

生成したSPDと学習用SRCを用いて学習を実行し、実行済プロセスをプロセスストアに格納します。

[11]:
from sampo.api import gen_spd, gen_src, process_runner

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)
[11]:
fabhmerg_learn.f9a76202-07c4-404f-a5ed-b74c1de1e989

gen_spd()関数とgen_src()関数の詳細は、Analytics ReferenceAPI Specificationを参照してください。

4. 予測の実行方法

本節では、予測用SRCを作成して予測の実行方法を示します。

4.1. 予測用SRCの定義

予測用SRC の記述例 :

[12]:
predict_src_templ = '''
fabhmerg_predict:
    type: predict
    data_sources:
        dl:
            path: ./data/auto-mpg_predict.csv
            attr_schema: ./data/auto-mpg.asd

    model_process: fabhmerg_learn
'''

予測用SRCには、プロセス名であるfabhmerg_predictのサブセクションにtypedata_sourcesmodel_processを記述します。typeには、予測用SRCなので、predictを設定します。

data_sourcesのサブセクションには、SPDで設定したDataLoaderのコンポーネントIDごとに予測対象データ、ASDの格納先を記述します。

model_processには、予測実行時に使用するモデルを含む、実行済プロセスのプロセス名を指定します。

4.2. 予測の実行

本項では、実行済プロセスと予測用SRCを用いて、予測の分析プロセスを実行します。

予測の実行をする前に、SAMPO/FABが読み込めるように予測用SRCをgen_src()関数で生成します。

予測用SRCを用いて予測を実行し、実行済プロセスをプロセスストアに格納します。 予測時のSPDは、SRCのmodel_processで指定した実行済プロセスに含まれるものが利用されるため、指定不要です。

[13]:
predict_src = gen_src(template=predict_src_templ)
process_runner.run(src=predict_src, pstore_url=pstore_url)
[13]:
fabhmerg_predict.b444e9e2-8ec6-49b0-b3b9-b39892e7b85d

プロセスストアから予測結果が含まれている実行済プロセスを開き、実績値と予測値を示します。

[14]:
from sampo.api import process_store

with process_store.open_process(pstore_url, 'fabhmerg_predict') as prl:
    df = prl.load_comp_output('rg')

df[['rg_actual', 'rg_predict']].head(10)
[14]:
rg_actual rg_predict
_sid
353 31.6 29.131691
354 28.1 19.736074
355 30.7 20.046524
356 25.4 26.353198
357 24.2 19.152903
358 22.4 18.264947
359 26.6 17.650778
360 20.2 19.896787
361 17.6 18.976112
362 28.0 30.362683

上記の表では、rg_actualが実績値、rg_predictが予測値を示しています。

ページトップへ