今回は、手軽にAutoMLが実行できるラブラリTPOTのサンプルコードを初心者の方向けに紹介します。似たライブラリである、Pycaretに比べて知られていませんが、個人的には、実業務で現実的に運用できるライブラリとしては、TPOTがおすすめです。
自動機械学習ライブラリTPOTとは
機械学習で精度の高い答えを導き出すためには、適切な特徴量の前処理、特徴量の選択、特徴量の加工、機械学習時のハイパーパラメータチューニングが必要となります。
これらを、自動で行うツールやサービスをAutoML(自動機械学習)といいます。
AutoMLで有名な有償ツールは、Datarobotなどがあります。また、無償のPythonライブラリとしては、Pycaretが有名です。ご存じの方も多いと思います。
今回は、有名ではないですが、個人的におすすめAutoML無償ライブラリのTPOTのサンプルコードを紹介します。
例えば、簡単な課題に対しては、複雑なモデルを使わずに、きっちり線形モデルを使うなど、使用感として、経験とあった方法を導き出します。
※pycaretに興味のあるかたは、こちらも参考になさってください。↓↓
サンプルコード解説
今回紹介するサンプルコードはこちらです。iris(アヤメの)分類問題ですね。
もう少し詳しく書かれているページはこちらです。
データの準備 学習
from tpot import TPOTClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data.astype(np.float64),
iris.target.astype(np.float64), train_size=0.75, test_size=0.25, random_state=42)
tpot = TPOTClassifier(generations=5, population_size=50, verbosity=2, random_state=42)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export('tpot_iris_pipeline.py')
- 1行目 tpotの分類器
- 2行目 sikit-learnのirisデータ インポート
- 3行目 scikit-learnのテストデータと学習データを分けるもの インポート
- 4行目 numpyインポート
- 6行目 irisデータをよみこみます
- 7~8行目 データを学習用と推論ように分けます。
- train_size=0.75 学習データは75%
- test_size=0.25 テストデータは25%
- iris.data データ特徴量の方です。numpyのfloat形式に変換してます
- iris.target データのラベルの方です。numpyのfloat形式に変換してます
- 10行目 TPOTのAutoMLの設定です。(遺伝的アルゴリズムで最適化を行っています)。サンプルコードでは、50パターン(population)を、5回(generation)計算しています。全部で、250
- generation 最適化を行う世代数の設定です。
- population_size 1世代のサンプル数です。
- 11行目 TPOTで学習します
- 12行目 学習結果を表示します。
- 13行目 結果を保存します。前処理から、予測までるまで pyファイルのコードとして保存されます。
最適化して保存したスクリプト
上記で保存されたコード(前処理と推論のスクリプト)はこちらです。自動で作成されますよ!
irisはシンプルなデータなので、機械学習アルゴリズムはシンプルな決定木が選ばれています。
前処理で、RBFサンプラーを用いることは、なかなか思いつかないですね。。。
# %load tpot_iris_pipeline.py
import numpy as np
import pandas as pd
from sklearn.kernel_approximation import RBFSampler
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.tree import DecisionTreeClassifier
# NOTE: Make sure that the outcome column is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1)
training_features, testing_features, training_classes, testing_classes = \
train_test_split(features, tpot_data['target'], random_state=None)
exported_pipeline = make_pipeline(
RBFSampler(gamma=0.8500000000000001),
DecisionTreeClassifier(criterion="entropy", max_depth=3, min_samples_leaf=4, min_samples_split=9)
)
exported_pipeline.fit(training_features, training_classes)
results = exported_pipeline.predict(testing_features)
- 1~2行目 numpyとpandasのインポート
- 4行目 RBFサンプラーという前処理ツールをインポート(最適化であった前処理アルゴリズム)
- 7行目 決定木をインポート(最適解であった機械学習アルゴリズム)
- 10行目 推論対象のデータを読み込みます。”PATH/TO/TO/DATA/FILE”に、適用したいデータファイルのパスを設定します。
- 11行目 データの中で、推論対象のラベルを指定します
- 12行目~13行目 データを、学習用の特徴量、テスト用の特徴量、学習用のラベル、テスト用のラベルに分けます。(学習用とテストように分けるところですね)
- 15行目~17行目 前処理から機械学習のパイプライン処理を作成します。前処理がRBFsampler、機械学習がDecisiontTreeです。
RBFsamplerの引数gammaはRBFカーネルのパラメータです。(初心者のかたは読み飛ばしてください)
DecitionTreeの引数、criterionは決定時の評価指標、max_depthは木の深さの最大値、min_samples_leafは、葉の数の最小値、min_sample_splitは分岐の数の最小値。 - 20行目 今回のデータで学習します
- 21行目 テストデータで予測します。
まとめ
初心者の方向けに、自動機械学習ライブラリ TPOTのサンプルコードを紹介しました。
比較的簡単に実装できますので、ぜひ試してください。
数日前、TPOT2のアルファ版がリリースされています。こちらの進化具合もたのしみですね。