LoginSignup
27
28

More than 1 year has passed since last update.

ScikitAllStars: 主要なscikit-learnの教師あり機械学習法を全部Optunaでチューニングしてスタッキングまでやっちゃうツール

Last updated at Posted at 2021-03-29

教師あり機械学習法はたくさんありますが、scikit-learn に入ってるもののうち主なものを全部使って、optunaでハイパーパラメーターチューニングして、できたモデルをさらにstackingしてしまうという一連の作業をまとめて行うライブラリ ScikitAllStars を作りました。

なぜこんなツールを作ったかって?めんどいからです。

また、ScikitAllStars の特徴として、教師あり機械学習が「回帰問題」なのか「分類問題」なのかという違いをほとんど意識せずに使えるというところもあります。

以下のコードは全て Google Colaboratory 上で動作を確認済みです。

必要なツールのインストール

# Optuna のインストール
!pip install optuna
# ScikitAllStars のインストール
!pip install git+https://github.com/maskot1977/scikitallstars.git

データの用意

下記は Numpy array 形式のデータを用いていますが、Pandas DataFrame 形式のデータでも使えるはずです。

まず、分類用データを使ってみましょう。

import sklearn.datasets

dataset = sklearn.datasets.load_breast_cancer() # 分類用データ例
#dataset = sklearn.datasets.load_diabetes() # 回帰用データ例

訓練データ・テストデータへ分割を行います。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(dataset.data, dataset.target, test_size=.4) # 訓練データ・テストデータへのランダムな分割

AllStarsモデルの学習

次のようにして、ScikitAllStarsに登録してある全ての手法に対してoputunaでチューニングしながら学習を行います。feature_selection=True とすることで、RandomForestによる特徴選択を事前に行ないます。

from scikitallstars import allstars, depict

allstars_model = allstars.fit(X_train, y_train, timeout=1000, n_trials=100, feature_selection=True)
feature selection: X_train (341, 30) -> (341, 9)

feature_selection=True とした場合は、次のようにすると、重要な特徴量についての知見が得られます。

depict.feature_importances(allstars_model)

scikitallstars_basic_usage2_10_0.png

次のようにして、学習経過のサマリーが得られます。

depict.training_summary(allstars_model)

scikitallstars_basic_usage2_12_0.png

次のようにして、手法ごとのベストモデルの性能を確認できます。

depict.best_scores(allstars_model)

scikitallstars_basic_usage2_14_0.png

depict.all_metrics(allstars_model, X_train, y_train)

scikitallstars_basic_usage2_15_0.png

depict.all_metrics(allstars_model, X_test, y_test)

scikitallstars_basic_usage2_16_0.png

AllStarsモデル全体でのベストモデルの性能は次のようにして確認できます。

allstars_model.score(X_train, y_train), allstars_model.score(X_test, y_test)
(0.9976689976689977, 0.9690721649484537)
depict.metrics(allstars_model, X_train, y_train, X_test, y_test)

scikitallstars_basic_usage2_19_0.png

ベストモデルを用いた新規予測は次のようにして行えます。

allstars_model.predict(X_test)
array([1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0,
       1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
       0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1,
       1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1,
       1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
       1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1,
       1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1,
       1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
       1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1,
       1, 1, 0, 1, 1, 1, 1, 1])

スタッキングモデルの学習

上記のようにして学習した AllStars モデルを用いて、下記のようなコードでスタッキングモデルを組んでハイパラチューニングしながら学習することができます。

from scikitallstars import stacking

stacking_model = stacking.get_best_stacking(allstars_model, X_train, y_train, timeout=1000, n_trials=100)

得られたスタッキングのベストモデルの性能は次のようにして確認できます。

stacking_model.score(X_train, y_train), stacking_model.score(X_test, y_test)
(0.9882697947214076, 0.9517543859649122)
depict.metrics(stacking_model, X_train, y_train, X_test, y_test)

scikitallstars_basic_usage2_26_0.png

AllStarsベストモデルと比較してみましょう。

depict.metrics(allstars_model, X_train, y_train, X_test, y_test)

scikitallstars_basic_usage2_28_0.png

スタッキングのベストモデルにおける、各機械学習手法の重要度が次のようにして確認できます。

depict.model_importances(stacking_model)

scikitallstars_basic_usage2_30_0.png

スタッキングのベストモデルによる新規予測は次のようにして得られます。

stacking_model.predict(X_test)
array([1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0,
       1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
       0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1,
       1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1,
       1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
       1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
       1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1,
       1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1,
       1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
       1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1,
       1, 1, 0, 1, 1, 1, 1, 1])

分類モデル、回帰モデルの切り替え

ScikitAllStars では、取り扱う問題が分類なのか回帰なのかという違いをほとんど意識せずに使える設計を心がけています。なぜって?めんどいからです。

上記のコードのうち、データの部分だけを次のように書き換えるだけで、自動的に「回帰問題」だと認識して回帰モデルを全部やっちゃってくれます。他の部分は書き換える必要がありません。

import sklearn.datasets

#dataset = sklearn.datasets.load_breast_cancer() # 分類用データ例
dataset = sklearn.datasets.load_diabetes() # 回帰用データ例

結果は省略。気になる方は、各自試してみてくださいね。

今後

細かい設定が色々あるんですが、最小限の動作は上記のコードを参考に行えると思います。詳しくは https://github.com/maskot1977/scikitallstars.git のコードを読んでみてください。

27
28
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
28