Skip to content

データの前処理を追加する

irisに前処理を追加する

ここでは、irisに対して前処理を追加してtrain,inspectしてみます。 ちなみに、akebonoで扱うirisのデータ形式は以下のようになっています。 scikit-learnload_irisからとっているのですが、説明変数のカラム名を少し変更しています。

In [1]: from akebono.dataset import get_dataset

In [2]: ds = get_dataset({
   ...:     'loader_config': {
   ...:         'name': 'iris'
   ...:     }
   ...: })

In [3]: ds.value.head()
Out[3]: 
   sepal_length  sepal_width  petal_length  petal_width  target
0           5.1          3.5           1.4          0.2       0
1           4.9          3.0           1.4          0.2       0
2           4.7          3.2           1.3          0.2       0
3           4.6          3.1           1.5          0.2       0
4           5.0          3.6           1.4          0.2       0

ここでは、以下2種類の前処理にたいして、複数バリエーションを設定してtrain,inspectします

  1. petal_lengthpetal_widthだけ使うようにする
  2. 標準正規化をかける

config.pyは以下のようになります。

import copy
train_config_template = { 
    'dataset_config': {
        'loader_config': {
            'name': 'iris',
        },  
    },  
    'model_config': {
        'name': 'SklearnLogisticRegression',
        'evaluate_kwargs': {
            'cross_val_iterator': 'KFold@sklearn.model_selection',
            'cross_val_iterator_kwargs': {
                'shuffle': True,
                'random_state': 0,
                'n_splits': 10, 
            },  
        },  
        'model_type': 'multiple_classifier',
    },
    'evaluate_enabled': True,
    'fit_model_enabled': True,
    'dump_result_enabled': True,
}

train_config_1 = copy.deepcopy(train_config_template)
train_config_2 = copy.deepcopy(train_config_template)
train_config_3 = copy.deepcopy(train_config_template)
train_config_4 = copy.deepcopy(train_config_template)

train_config_2['preprocessor_config'] = {'name': 'apply_standard_scaler'}
train_config_3['preprocessor_config'] = {
    'name': 'select_columns',
    'kwargs': {
        'columns': ['petal_length', 'petal_width'],
    },
}
train_config_4['preprocessor_config'] = [
    {
        'name': 'select_columns',
        'kwargs': {
            'columns': ['petal_length', 'petal_width'],
        },
    },
    {
        'name': 'apply_standard_scaler',
    },
]

train_config = [train_config_1, train_config_2, train_config_3, train_config_4]

4種類の設定は、基本は全てロジスティック回帰による分類です。 train_config_1は前処理無し、train_config_2は前処理2のみ、train_config_3は前処理1のみ、train_config_4は前処理1,2の連結です。 実行すると以下のようになります。

$ akebono train
$ akebono inspect

=== scenario summary .. tag: default ===

------------------------------------------------------------
train_id: 0

accuracy
0.94667

------------------------------------------------------------
train_id: 1

accuracy
0.87333

------------------------------------------------------------
train_id: 2

accuracy
0.86000

------------------------------------------------------------
train_id: 3

accuracy
0.93333

結果的には、前処理無しが最も良くなりました。前処理1,2を組み合わせると片方だけに比べると良いようです。

ここでは、StatefulPreprocessorであるapply_standard_scalerを適用した場合に訓練データに依存したパラメータが保存されていることを確認しておきます。

$ ls -l _storage/default/operation_results/default | awk '{print $9}'

train_result_meta_0.pkl
train_result_meta_1.pkl
train_result_meta_2.pkl
train_result_meta_3.pkl
train_result_model_0.pkl
train_result_model_1.pkl
train_result_model_2.pkl
train_result_model_3.pkl
train_result_preprocessor_ApplyStandardScaler_1_0.pkl
train_result_preprocessor_ApplyStandardScaler_3_1.pkl

ストレージに保存されているファイルのうち、下2つがapply_standard_scalerのパラメータファイルです。この内容は予測時に参照されます。