AutoML OSSを紹介する本連載第3回はTPOTを解説します。TPOTは「遺伝的プログラミング(Genetic Programming)」と呼ばれる手法を適用し、効率的なパイプラインの最適化を目指しています。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本記事で紹介したノートブックはGitHubにて公開しています。すぐに実行できますので、ぜひご利用ください。
本連載第2回では、AutoML OSS(オープンソースソフトウェア)の老舗ともいえる「auto-sklearn」を紹介しました。今回は、遺伝的プログラミングと呼ばれる手法を適用しているAutoML OSSの「TPOT」を紹介します。
Tree-based Pipeline Optimization Tool(TPOT)は米ペンシルベニア大学のComputational Genetics Laboratoryが中心となって開発しているAutoML機能を提供するOSSです。TPOTはRandal S. Olson博士らによって2016年の論文「Automating biomedical data science through tree-based pipeline optimization」で発表されました。
開発元 | ペンシルベニア大学 |
---|---|
GitHub公開日 | 2015年11月 |
リポジトリ | https://github.com/EpistasisLab/tpot |
実装言語 | Python |
ライセンス | LGPL-3.0 License |
公式サイト | http://epistasislab.github.io/tpot/ |
表1 TPOTの基本情報 |
TPOTでは、前処理、特徴量選択、分類器からなる機械学習の処理を「パイプライン」と呼びます。パイプラインを構成する各処理やハイパーパラメーターのさまざまな組み合わせを探索し、最適なパイプラインの発見を目指します。
TPOTは複数のPythonライブラリを利用して実装されており、パイプラインを構成する各処理を実現するためにscikit-learnやXGBoostを、パイプラインの最適化手法である遺伝的プログラミングを実現するためにDEAPを利用しています。
TPOTは、AutoMLができる他のOSSと比較して次のような特徴があります。
それぞれの特徴をもう少し詳しく見ていきましょう。
TPOT APIのパラメーターを見ると、generations(世代数)、population_size(個体数)、mutation_rate(変異率)、crossover_rate(交叉率)といった、他のAutoMLではあまり見慣れないものが並んでいます。これはTPOTが遺伝的プログラミングを最適化の手法として採用しているためです。
遺伝的プログラミングでは、生物の進化の仕組みを模倣して最適なパイプラインを探索します。遺伝的プログラミングの詳しい説明は省略しますが、始めにランダムで生成したパイプライン群を生物の個体群と見なし、世代ごとにこれらの掛け合わせ(交叉)や突然変異を適用して進化させていくことで最適解を探します。
優秀な個体(=精度の良いパイプライン)を中心に次の世代へと進化を続けることにより、ランダムな探索と比較して効率的に最適解にたどり着くことが期待できます。
以下に遺伝的プログラミングに関連するTPOTのパラメーターの一部を紹介します。表で示した以外のパラメーターもありますが、遺伝的プログラミングの考え方をよく理解しない限りはデフォルト値のままで使用することが推奨されています。
パラメーター名 | デフォルト値 | 説明 |
---|---|---|
generations | 100 | 世代数。パイプラインの最適化を実行する試行回数に相当する。一般的に数が多いほど精度は高くなるが処理時間もかかる |
population_size | 100 | 世代ごとに保持するパイプライン数。一般的に数が多いほど精度は高くなるが処理時間もかかる |
offspring_size | None(population_sizeと同じ値) | 子孫数。世代ごとに幾つのパイプラインが生成されるかに相当する |
表2 遺伝的プログラミングに関連するTPOTのパラメーター例 |
population_sizeと異なる値をoffspring_sizeに指定した場合、初期のパイプライン数はpopulation_size、それ以降の各世代で生成されるパイプライン数はoffspring_sizeで決まることになります。従って、TPOTが探索するパイプラインの総数は以下の通りです。
一般に遺伝的プログラミングは、木構造(ツリー構造)の個体を扱うことができる特徴を持ちます。遺伝的プログラミングをパイプラインの最適化に適用したTPOTにおいても、直列的なパイプラインだけでなく、図1に示すような出力結果を根ノードとする木構造のパイプラインの探索が可能です。この特徴はTPOTのOSS名称(Tree-Based Pipeline Optimization Tool)にも表れています。
図1で示した例を見てみましょう。入力データセットに対して、上段ではPolynomial Features(多項式特徴量抽出処理)を、下段ではPCA(主成分分析で得られた特徴量抽出処理)を行い、この2つを組み合わせることで分類モデルの入力を作っています。このように複数の前処理結果を組み合わせて利用することで、より最適なパイプラインが生成できる可能性があります。
ただし複雑な構造のパイプラインはそれだけ組み合わせの数も増え、計算負荷も高くなるため、解探索の時間が長くかかってしまいます。処理時間が長くなりすぎないよう、学習時のパラメーターとしてmax_eval_time_mins(1パイプラインごとの所要時間上限)を短く設定したりtemplate(パイプラインの構造)を固定したりすることも合わせて検討しましょう。
TPOTではパイプラインを構成する各処理を「オペレーター」と呼んでいます。オペレーターにはPreprocessors(前処理)、Selectors(特徴量選択)、Classifiers(分類器)といったものがあり、これらを部品として組み合わせることでパイプラインを構成します。図1で示した例で説明すると、以下のようになります。
分類モデル向けのデフォルトの設定は表3で示す通り、Preprocessorsとして14種類、Selectorsとして5種類、Classifiersとして13種類のオペレーターが用意されています。デフォルトの設定ではなく事前に用意された複数パターンから引数config_dictで選択することもできます。後述しますが利用する処理やパラメーターをユーザー自らが指定して利用することも可能です。
Preprocessors | sklearn.preprocessing.Binarizer |
---|---|
sklearn.decomposition.FastICA | |
sklearn.cluster.FeatureAgglomeration | |
sklearn.preprocessing.MaxAbsScaler | |
sklearn.preprocessing.MinMaxScaler | |
sklearn.preprocessing.Normalizer | |
sklearn.kernel_approximation.Nystroem | |
sklearn.decomposition.PCA | |
sklearn.preprocessing.PolynomialFeatures | |
sklearn.kernel_approximation.RBFSampler | |
sklearn.preprocessing.RobustScaler | |
sklearn.preprocessing.StandardScaler | |
tpot.builtins.ZeroCount | |
tpot.builtins.OneHotEncoder | |
Classifiers | sklearn.naive_bayes.GaussianNB |
sklearn.naive_bayes.BernoulliNB | |
sklearn.naive_bayes.MultinomialNB | |
sklearn.tree.DecisionTreeClassifier | |
sklearn.ensemble.ExtraTreesClassifier | |
sklearn.ensemble.RandomForestClassifier | |
sklearn.ensemble.GradientBoostingClassifier | |
sklearn.neighbors.KNeighborsClassifier | |
sklearn.svm.LinearSVC | |
sklearn.linear_model.LogisticRegression | |
xgboost.XGBClassifier | |
sklearn.linear_model.SGDClassifier | |
sklearn.neural_network.MLPClassifier | |
Selectors | sklearn.feature_selection.SelectFwe |
sklearn.feature_selection.SelectPercentile | |
sklearn.feature_selection.VarianceThreshold | |
sklearn.feature_selection.RFE | |
sklearn.feature_selection.SelectFromModel | |
表3 分類モデルのパイプラインオペレーター(デフォルト) |
Copyright © ITmedia, Inc. All Rights Reserved.