パイプラインに使う関数を指定し
AutoML【TPOT】構成(Config.)をカスタマイズ

パイプラインに使う関数を指定しAutoML【TPOT】構成(Config.)をカスタマイズ

前回、精度やメモリ使用量、実行速度に応じたTPOTが用意した構成(Config.)を使う方法を説明しました。

構成名 内容 適用できる問題
Default TPOT 初期設定の構成です。 分類・回帰
TPOT light Default TPOTに比べて、シンプルで高速な変換器やアルゴリズムが使われています。早く結果がほしいときにはこちらが適しています。 分類・回帰
TPOT MDR ゲノムワイド関連研究(GWAS)に特化した変換器やアルゴリズムの組み合わせが使われます。予測精度を最大化するパイプラインを得ることができます。ただし、特徴量選択を何度も行うので、大規模データセットの場合実行に時間がかかることがあります。 分類・回帰
TPOT sparse 内部で疎行列(sparse matrix)形式を使うことで、メモリを節約しながらパイプラインの最適化をできる構成です。 分類・回帰
TPOT NN Default TPOTに加え、Pytorchのニューラルネットワーク推定器を使うことができます。 分類
TPOT cuML GPU上で動く機械学習ライブラリである、RAPIDS cuMLを使ってパイプラインの最適化ができます。大規模なデータセットを処理するのに向いています。 分類・回帰

今回は、自分でパイプライン構築に使う関数を指定する方法を説明します。

要は、構成(Config.)をカスタマイズし使用する方法です。

全体の流れ

以下、構成(Config.)をカスタマイズし使用する場合の流れです。

  • 1.必要なモジュールの読み込み
  • 2.データセットの読み込み
  • 3.データセットを学習用と検証用に分割
  • 4.pythonの辞書形式で構成(Config.)作成
  • 5.TPOTClassifierの設定(作成したconfigを指定)
  • 6.学習用データセットを使った学習
  • 7.検証用データセットを使った予測結果の評価

通常のTPOT利用方法と違うのは、4と5です。

それぞれについて、解説していきます。

1.必要なモジュールの読み込み

まずは必要なモジュールを読み込みます。

以下、コードです。

# 1.必要なモジュールの読み込み
from tpot import TPOTClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

 

読み込んだモジュールは次のとおりです。

  • TPOTClassifier … TPOTで分類問題を解くためのモジュールです
  • load_breast_cancer … 今回の例で使うデータセットの、乳がんの分類結果です
  • train_test_split … データセットを学習用と検証用に分けるためのモジュールです
  • f1_score … 予測結果のF値を算出するためのモジュールです

 

2.データセットの読み込み

分類問題を例にとります。

乳がんのデータセット(特徴量と目的変数)が格納されたload_breast_cancerを読み込みます。特徴量をXに、目的変数をyに格納します。

以下、コードです。

# 2.データセットの読み込み
load_breast_cancer = load_breast_cancer(as_frame=True)
X = load_breast_cancer.data
y = load_breast_cancer.target

 

3.データセットを学習用と検証用に分割

データセットを学習用と検証用に分けます。

以下、コードです。

# 3.データセットを学習用と検証用に分割
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    train_size=0.75,
    test_size=0.25,
    random_state=42)

print('X_trainの行数:' + str(len(X_train))) #確認用
print('y_trainの行数:' + str(len(y_train))) #確認用
print('X_testの行数:' + str(len(X_test)))   #確認用
print('y_testの行数:' + str(len(y_test)))   #確認用

 

X_trainy_train学習データX_testy_test検証用データです。

以下、実行結果です。

 

print文でデータの行数を表示することで、約75%の学習用データ約25%の検証用データに分かれたことがわかります。

 

4.pythonの辞書形式で構成(Config.)作成

簡単に前回の復習をします。

TPOT構成(config.)を指定するには、TPOTClassifierconfig_dictパラメータ構成(config.)を指定します(回帰問題の場合はTPOTRegressorconfig_dictパラメータです)。

例えば下図は、TPOTがあらかじめ用意している構成(config.)であるTPOT lightを使うときの設定例です。

 

このconfig_dictに自分が作った構成(config.)を指定することで、好きな関数を使うことができます。

下図は、自分が作った構成(config.)を使うときの設定例です。自分が作った構成(config.)は’tpot_config’に格納しています。

 

では、構成(config.)の作り方を説明します。今回は、自分が作った構成(config.)は’tpot_config’に格納します。

tpot_configの中身は2つの階層を意識して作ります。

第1階層には、使いたい関数(ここでは’sklearn.naive_bayes.BernoulliNB’)を指定します。

第2階層には、第1階層で指定した関数(’sklearn.naive_bayes.BernoulliNB’)の探索したいパラメータ範囲を指定します。

 

今回の例は、パラメータalphafit_priorについて、探索してほしい値を指定しています。

  • alphaについては、0.0011e-3)、0.011e-2)、0.11e-1)、1、10100のうちどれが最適であるか探索します
  • fit_priorについては、TrueFalseのどちらが最適であるか探索します

使いたい関数を増やすには、以下のように辞書の第1階層にどんどん関数を追加します。そして、それぞれの2階層にそれぞれの関数のパラメータの探索範囲を記載します。

 

今回は説明を簡単にするために、tpot_config’sklearn.naive_bayes.BernoulliNB’だけを指定して使ってみることにします。

以下、コードです。

# 4.pythonの辞書形式で構成(Config.)作成
tpot_config = {
    'sklearn.naive_bayes.BernoulliNB': {
        'alpha': [1e-3, 1e-2, 1e-1, 1., 10., 100.],
        'fit_prior': [True, False]
    }
}

tpot_config #確認用

 

以下、実行結果です。

 

5.TPOTClassifierの設定(作成したConfig.を指定)

TPOTClassifierconfig_dictパラメータに、先ほど作った構成(Config.)を指定します(今回はtpot_config)。

そうすると、その構成(Config.)を使ってパイプラインを最適化してくれます。

以下、コードです。

# 5.TPOTClassifierの設定(作成したconfigを指定)
tpot = TPOTClassifier(scoring='f1',
                      generations=5,
                      population_size=50,
                      random_state=42,
                      verbosity=2,
                      config_dict=tpot_config)

tpot #確認用

 

以下、実行結果です。

 

sklearn.naive_bayes.BernoulliNB’がconfig_dictとして設定されていることがわかります。

 

6.学習用データセットを使った学習

では、学習してみましょう。

以下、コードです。

# 6.学習用データセットを使った学習
tpot.fit(X_train, y_train)

 

以下、実行結果です。

 

本当に’sklearn.naive_bayes.BernoulliNB’だけ使われたのでしょうか。

AutoML【TPOT】で学習し評価されたすべてのパイプラインを確認してみます。

以下、コードです。

tpot.evaluated_individuals_

 

以下、実行結果です。

 

確かにBernoulliNBが毎回使われていることがわかります。今回は途中までしか表示させていませんが、最後まで見てもBernoulliNBのみが使われています。

 

7.検証用データセットを使った予測結果の評価

検証用データセット(テストデータ)を使って、予測結果を評価します。

以下、コードです。

# 7.検証用データセットを使った予測結果の評価
y_pred = tpot.predict(X_test)
f1 = f1_score(y_true=y_test, y_pred=y_pred)
print('f1_score=' + str(f1))

 

以下、実行結果です。

 

F値は約0.77であることがわかります。

config_dictを指定せずTPOTデフォルトの構成’Default TPOT’を使ったときは、f1=0.98程度の精度だったので、BernoulliNBだけではあまり精度が出ないことがわかります。

 

プログラムの全体像

# 1.必要なモジュールの読み込み
from tpot import TPOTClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

# 2.データセットの読み込み
load_breast_cancer = load_breast_cancer(as_frame=True)
X = load_breast_cancer.data
y = load_breast_cancer.target

# 3.データセットを学習用と検証用に分割
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    train_size=0.75,
    test_size=0.25,
    random_state=42)
print('X_trainの行数:' + str(len(X_train))) #確認用
print('y_trainの行数:' + str(len(y_train))) #確認用
print('X_testの行数:' + str(len(X_test)))   #確認用
print('y_testの行数:' + str(len(y_test)))   #確認用

# 4.pythonの辞書形式で構成(Config.)作成
tpot_config = {
    'sklearn.naive_bayes.BernoulliNB': {
        'alpha': [1e-3, 1e-2, 1e-1, 1., 10., 100.],
        'fit_prior': [True, False]
    }
}
tpot_config #確認用

# 5.TPOTClassifierの設定(作成したconfigを指定)
tpot = TPOTClassifier(scoring='f1',
                      generations=5,
                      population_size=50,
                      random_state=42,
                      verbosity=2,
                      config_dict=tpot_config)

tpot #確認用

# 6.学習用データセットを使った学習
tpot.fit(X_train, y_train)

tpot.evaluated_individuals_

# 7.検証用データセットを使った予測結果の評価
y_pred = tpot.predict(X_test)
f1 = f1_score(y_true=y_test, y_pred=y_pred)
print('f1_score=' + str(f1))

 

次回

次回は、TPOTの仕組みをかんたんに説明しようと思います。