自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

(auto-sklearn) Pythonで3つのAutoML環境を用意してみた

Python
Python

前回はAutoGluonの仮想環境を作成しました。

(AutoGluon) Pythonで3つのAutoML環境を用意してみた
前回はmljarの仮想環境を作成しました。今回はAutoGluonの仮想環境を作成します。AutoGluon requires Python version 3.7, 3.8, or 3.9. For troubleshooting the...

今回3つ目のauto-sklearnの環境を作成しようと思います。

jupyterから確認すると最終的には下記のようにそれぞれのAutoML環境を選択可能になります。

png

sklearnと聞いたらご存知の方は多いかも知れませんが、AutoML版のsklearnのようです。

まずはAutoSklearnをインストールするにあたり、必須環境をみてみます。

Linux operating system (for example Ubuntu) (get Linux here)
Python (>=3.7) (get Python here),
C++ compiler (with C++11 supports) (get GCC here).

・OSはLinux (Ubuntuなど)
・Pythonは3.7以上
・C++コンパイラが必要

とのことです。Windowsでは動作せず、Macは動作するかどうか分からない(検証していない)ようです。

We currently do not know if auto-sklearn works on macOS. There are at least two issues holding us back from actively supporting macOS: 引用: https://automl.github.io/auto-sklearn/master/installation.html#installation

Macは動作するか分からないとのことですが、#155#360のauto-sklearnのチケットでMacで動かすためのやり取りがされています。

本記事ではチケットに記載されているやり方でMacにインストール出来ることを確認しました。

スポンサーリンク

auto-sklearnの仮想環境を作成する

gccとswigのインストール

事前にauto-sklearnとその依存ライブラリをインストールするために必要なコンパイラなどをインストールします。

# gccとswigのインストール
brew install gcc
brew install swig

auto-sklearnの仮想環境作成

# venv-autosklearnという名前の仮想環境を作成
python3.8 -m venv venv-autosklearn

# activateし仮想環境内に入る
source venv-autosklearn/bin/activate

# pip、wheel,setuptoolsのインストールもしくはアップグレード
(venv-autosklearn) % python3 -m pip install pip wheel setuptools --upgrade

auto-sklearnのインストール

# auto-sklearnのインストール
(venv-autosklearn) % python3 -m pip uninstall pyrfr auto-sklearn # 再インストールする前に実行
(venv-autosklearn) % curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install
(venv-autosklearn) % env CC="/usr/bin/gcc -stdlib=libc++ -mmacosx-version-min=10.7" pip install auto-sklearn
(venv-autosklearn) % python3 -m pip install matplotlib seaborn # auto-sklearnで依存関係でインストールされないライブラリ (オプション)
Out[0]
Collecting pyrfr
  Downloading pyrfr-0.8.2.tar.gz (296 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 296.2/296.2 kB 11.2 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Collecting auto-sklearn
  Downloading auto-sklearn-0.14.7.tar.gz (6.4 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.4/6.4 MB 14.8 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
・・・省略・・・
Successfully built pyrfr auto-sklearn smac
Installing collected packages: pyrfr, emcee, smac, auto-sklearn
Successfully installed auto-sklearn-0.14.7 emcee-3.1.2 pyrfr-0.8.2 smac-1.2

ipykernelをインストール

my-venvのjupyter notebookから今回作成したvenv_autogluonの仮想環境を呼び出せるようにします。

(venv-autosklearn) % python3 -m pip install ipykernel
(venv-autosklearn) % python3 -m ipykernel install --user --name venv_autosklearn --display-name "venv_autosklearn"
Out[0]

Installed kernelspec venv_autosklearn in /Users/hinomaruc/Library/Jupyter/kernels/venv_autosklearn

スポンサーリンク

エラー対応

pyrfrライブラリをインストールするときにエラー

error: command 'swig' failed: No such file or directory

→ brew install gcc swig で解決しました。

import autosklearn.regression したらエラー

ImportError: dlopen(/Users/hinomaruc/Desktop/blog/venv-autosklearn/lib/python3.8/site-packages/pyrfr/_regression.cpython-38-darwin.so, 2): Symbol not found: ZNSt7cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev

→ pyrfrとautosklearnを再インストールしました。

スポンサーリンク

auto-sklearnの動作確認

# 必要なライブラリをインポート
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import autosklearn.regression
# データセットをデータフレームに読み込む
df = pd.read_csv("http://lib.stat.cmu.edu/datasets/boston_corrected.txt", encoding='Windows-1252',skiprows=9,sep="\t")
# モデリング用の説明変数
anacols=[
        'CRIM' #  1人当たりの犯罪数
      , 'ZN'  # 町別の25,000平方フィート(7600m2)以上の住居区画の割合
      , 'INDUS'  #町別の非小売業が占める土地面積の割合
      , 'CHAS' # チャールズ川沿いかどうか
      , 'NOX' # 町別の窒素酸化物の濃度(1000万分の1)
      , 'RM' # 住居の平均部屋数
      , 'AGE' # 持ち家住宅比率
      , 'DIS' # 5つのボストン雇用センターへの重み付き距離
      , 'RAD' # 町別の環状高速道路へのアクセスのしやすさ
      , 'TAX' # 町別の$10,000ドルあたりの固定資産税率
      , 'PTRATIO' #町別の生徒と先生の比率
      , 'B' # 1000*(黒人人口割合 - 0.63)^2
      , 'LSTAT' #     貧困人口割合
    ]
# Xとyの作成
X = df[anacols] # 説明変数
y = df["CMEDV"] # 目的変数
# 訓練データとテストデータへ分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)
# auto-sklearnのautomlモデルを作成
automl = autosklearn.regression.AutoSklearnRegressor(
    time_left_for_this_task=120,
    per_run_time_limit=30,
    tmp_folder='autosklearn_regression_example_tmp',
)
# fit
automl.fit(X_train, y_train, dataset_name='boston')
Out[0]

    AutoSklearnRegressor(per_run_time_limit=30, time_left_for_this_task=120,
                         tmp_folder='autosklearn_regression_example_tmp')
# 作成したモデルの一覧
automl.leaderboard()
Out[0]

rank ensemble_weight type cost duration
model_id
3 1 0.56 gaussian_process 0.135742 19.743288
7 2 0.44 extra_trees 0.143952 4.990713
# 作成したモデルの概要 (leaderboardより詳細が表示されるようです)
automl.show_models()
Out[0]

    {3: {'model_id': 3,
      'rank': 1,
      'cost': 0.13574170835870003,
      'ensemble_weight': 0.56,
      'data_preprocessor': ,
      'feature_preprocessor': ,
      'regressor': ,
      'sklearn_regressor': GaussianProcessRegressor(alpha=0.037731974209709904,
                               kernel=RBF(length_scale=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
                               n_restarts_optimizer=10, normalize_y=True,
                               random_state=1)},
     7: {'model_id': 7,
      'rank': 2,
      'cost': 0.14395180044569844,
      'ensemble_weight': 0.44,
      'data_preprocessor': ,
      'feature_preprocessor': ,
      'regressor': ,
      'sklearn_regressor': ExtraTreesRegressor(criterion='mae', max_features=0.9029989558220115,
                          n_estimators=512, n_jobs=1, random_state=1,
                          warm_start=True)}}

# テストデータにモデルを適用し住宅価格の予測をする
prediction = automl.predict(X_test)
# 予測結果と正解データの比較
from matplotlib import pyplot as plt
plt.plot(y_test, prediction,'.')
plt.xlabel("True value")
plt.ylabel("Predicted value")
Out[0]

png

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
print("MAE(test)", str(mean_absolute_error(y_test, prediction)))
print("RMSE(test)",str(np.sqrt(mean_squared_error(y_test, prediction))))
Out[0]
    MAE(test) 1.9468150494145413
    RMSE(test) 2.8329039607127253

xgboost(gridsearchあり)より精度は良いようです。

autogluonもよりもよく、mljarよりは悪いという結果になりました。

スポンサーリンク

精度比較

xgboost (gridsearchあり)

旧ブログでボストンの住宅価格のデータセットで色々なモデルを試しました。その中でもxgboost(グリッドサーチあり)が一番精度がよかったのでautomlとの比較対象とします。

結果:
MAE(test) 2.07
RMSE(test) 2.89

auto-sklearn

結果:
MAE(test) 1.94
RMSE(test) 2.83

AutoGluon

結果:
MAE(test) 2.03
RMSE(test) 2.96

xgboost(grid searchあり)と比較して、MAEはAutoGluonの方がよくて、RMSEはxbgoost(grid searchあり)の方が良さそうです。

mljar

結果:
MAE(test): 1.81
RMSE(test) 2.76

mljarが一番精度が良いようです。

スポンサーリンク

まとめ

やっとmljar,AutoGluon,auto-sklearnの環境をそれぞれ準備することが出来ました。

ボストンの住宅価格のデータセットではmljarが一番精度がよかったです。

簡単にすべて自動でやってくれてしかも精度がいいとなれば、使わずにはいられないですね。

タイトルとURLをコピーしました