参考
- Efficient and Robust Automated Machine Learning
- NIPS
- OpenML
- auto-sklearnのGitHub
- auto-sklearnのドキュメント
- インストール手段
論文メモ
気になったところをメモする。
概要
いわゆるAutoMLの一種。 特徴量処理、アルゴリズム選択、ハイパーパラメータチューニングを実施。 さらに、メタ学習とアンサンブル構成も改善として対応。 scikit-learnベースのAutoML。
auto-sklearnと呼ぶ。
GitHub上にソースコードが公開されている。
同様のデータセットに対する過去の性能を考慮し、アンサンブルを構成する。
ChaLearn AutoMLチャレンジで勝利。
OpenMLのデータセットを用いて、汎用性の高さを確認した。
2019/11時点では、識別にしか対応していない?
1. Introduction
以下のあたりのがAutoML周りのサービスとして挙げられていた。
1 | BigML.com, Wise.io, SkyTree.com, RapidMiner.com, Dato.com, Prediction.io, DataRobot.com, Microsoft’s Azure Machine |
Auto-wekaをベースとしたもの。
パラメトリックな機械学習フレームワークと、ベイジアン最適化を組み合わせて用いる。
特徴
- 新しいデータセットに強い。ベイジアン最適化をウォームスタートする。
- 自動的にモデルをアンサンブルする
- 高度にパラメタライズされたフレームワーク
- 数多くのデータセットで実験
2 AutoML as a CASH problem
ここで扱う課題をCombined Algorithm Selection and Hyperparameter optimization (CASH) と呼ぶ。
ポイントは、
- ひとつの機械学習手法がすべてのデータセットに対して有効ではない
- 機械学習手法によってはハイパーパラメータチューニングが必要
ということ。 それらを単一の最適化問題として数式化できる。
Auto-wekaで用いられたツリーベースのベイジアン最適化は、ガウシアンプロセスモデルを用いる。 低次元の数値型のハイパパラメータには有効。 しかし、ツリーベースのアルゴリズムは高次元で離散値にも対応可能。 Hyperopt-sklearnのAutoMLシステムで用いられている。
提案手法では、ランダムフォレストベースのSMACを採用。
3 New methods for increasing efficiency and robustness of AutoML
提案手法のポイント
- ベイジアン最適化のウォームスタート
- アンサンブル構築の自動化
まずウォームスタートについて。
メタ学習は素早いが粗い。ベイジアン最適化はスタートが遅いが精度が高い。 これを組み合わせる。
既存手法でも同様の試みがあったが、複雑な機械学習モデルや多次元のパラメータには適用されていない?
OpenML を利用し、メタ学習。
つづいてアンサンブル構築について。
単一の結果を用いるよりも、アンサンブルを組んだほうが良い。 アンサンブル構成の際には重みを用いる。重みの学習にはいくつかの手法を試した。 Caruana et al. のensemble selectionを利用。
5 Comparing AUTO-SKLEARN to AUTO-WEKA and HYPEROPT-SKLEARN
AUTO-SKLEARNをそれぞれ既存手法であるAUTO-WEKAとHYPEROPT-SKLEARNと比較。 (エラーレート?で比較)
AUTO-WEKAに比べて概ね良好。 一方HYPEROPT-SKLEARNは正常に動かないことがあった。
6 Evaluation of the proposed AutoML improvements
OpenMLレポジトリのデータを使って、パフォーマンスの一般性を確認。 テキスト分類、数字や文字の認識、遺伝子やRNAの分類、広告、望遠鏡データの小片分析、組織からのがん細胞検知。
メタ学習あり・なし、アンサンブル構成あり・なしで動作確認。
7 Detailed analysis of AUTO-SKLEARN components
ひとつひとつの手法を解析するのは時間がかかりすぎた。
ランダムフォレスト系統、AdaBoost、Gradient boostingがもっともロバストだった。 一方、SVMが特定のデータセットで性能高かった。
どのモデルも、すべてのケースで性能が高いわけではない。
個別の前処理に対して比較してみても、AUTO-SKLEARNは良かった。
動作確認
依存ライブラリのインストール
auto-sklearnのドキュメント を参考に動かしてみる。
予め、ビルドツールをインストールしておく。
1 | $ sudo apt-get install build-essential swig |
pipenv使って環境構築
pipenvを使って、おためし用の環境を作る。
1 | $ pipenv --python 3.7 |
依存関係とパッケージをインストールしようとしたらエラーで試行錯誤
今回はpipenvを使うので、公式手順を少し修正して実行。(pip -> pipenvとした)
1 | curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pipenv install |
なお、requirementsの中身は以下の通り。
1 | setuptools |
論文の通り、SMACが使われるようだ。
つづいて、auto-sklearn自体をインストール。 (最初から、これを実行するのではだめなのだろうか?勝手に依存関係を解決してくれるのでは?)
1 | $ pipenv run pip install auto-sklearn |
なお、最初に pipenv install auto-sklearn
していたのだがエラーで失敗したので、上記のようにvirtualenv環境下でpipインストールすることにした。
エラー内容は以下の通り。
1 | (snip) |
作業効率を考え、Jupyterをインストールしておく。
1 | $ pipenv install jupyter |
つづいて公式ドキュメントの手順を実行。
以下を実行したらエラーが出た。
1 | import autosklearn.classification |
1 | ModuleNotFoundError: No module named '_bz2' |
scikit-learn で No module named '_bz2' というエラーがでる問題 の通り、 bzip2に関する開発ライブラリが足りていない、ということらしい。 パッケージをインストールし、Pythonを再インストール。pipenvのvirtualenv環境も削除。 その後、pipenvで環境を再構築。
1 | $ sudo apt install libbz2-dev |
なお、sklearnのバージョンでやはり失敗する? よくみたら、pypiから2019/11/1時点でインストールできるライブラリは0.5.2であるが、 公式ドキュメントは0.6.0がリリースされているように見えた。 また対応するscikit-learnのバージョンが変わっている…。
依存関係のインストールとパッケージのインストール(2度め)
致し方ないので、依存関係のライブラリはpipenvのPipfileからインストールし、 auto-sklearnはGitHubからダウンロードしたmasterブランチ一式をインストールすることにした。
1 | $ pipenv install |
改めてJupyter notebookを起動
1 | $ pipenv run jupyter notebook |
以下を実行したら、一応動いたけど…
1 | import autosklearn.classification |
少し警告
1 | Could not import the lzma module. Your installed Python is incomplete. |
sklearn関係もインポート成功。
1 | import sklearn.model_selection |
学習データ等の準備
1 | X, y = sklearn.datasets.load_digits(return_X_y=True) |
学習実行
1 | automl = autosklearn.classification.AutoSklearnClassifier() |
実行したらPCのCPUが100%に張り付いた!
1 | y_hat = automl.predict(X_test) |
参考)CentOS7ではSwig3をインストールすること
CentOSで依存関係をインストールするときには、 swig
ではなく swig3 を対象とすること。
でないと、以下のようなエラーが生じる。
1 | (snip) |
メモリエラー
EC2インスタンス上で改めて実行したところ、以下のようなエラーを生じた。
1 | (snip) |
これから切り分ける。