基本的な分析の実行手順¶
目次¶
1. はじめに¶
本章を通して、ユーザーは異種混合学習技術を用いて、簡単なデータ分析ができるようになります。
具体的な達成目標は、以下の通りです。
「SAMPO/FABの学習と予測の実行方法を理解した上で、ユーザー自身で用意したデータを用いて学習・予測の実行ができる」
本章では、自動車の燃料消費量予測を題材として、学習と予測を実行する例を示します。その中で、モデルの作成と予測結果の確認について示します。
2. データの準備¶
本節では、以下のデータ準備の手順について示します。
分析対象データにサンプルID (_sid) を追加
ASD(属性スキーマ)の作成
分析対象データを学習用と予測用に分割
本章では、自動車の燃料消費量予測で使用される分析対象データを使用します。
データは、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がサンプルを識別するための一意に識別できる整数型の属性です。
分析対象データに_sidという名の属性の有無を確認する
分析対象データに_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は、データフローセクションとパラメーターセクションで構成されており、セパレーターによって区切られています。
データフローセクション ・・・
dl
やrg
のようなコンポーネント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 Reference
のSPD (SAMPO Process Description) Specification
を参照してください。
また、SPDに記述できるコンポーネントの一覧と各コンポーネントのパラメーターについては、Analytics Reference
のComponent 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
のサブセクションにtype
とdata_sources
を記述します。type
には、学習用SRCなのでlearn
を設定します。
data_sources
のサブセクションには、SPDで設定したDataLoader
のコンポーネントIDごとに分析対象データ、ASDの格納先を記述します。 上記の記述例では、分析対象データがCSVファイルの場合を示しており、データベースまたはPandas DataFrameの記述例は、SRCの詳細から確認してください。
SRCの詳細は、Analytics Reference
のSRC (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 Reference
のAPI 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
のサブセクションにtype
、data_sources
、model_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が予測値を示しています。