🚗

PyCaretでAutoMLの世界を覗いてみる

2020/12/10に公開

PyCaretとは

PyCaret(https://pycaret.org/)は、2020年4月にMoez Ali氏によって発表された、オープンソースのPython機械学習ライブラリです。このライブラリの何がすごいかというと、機械学習における様々なアルゴリズム、評価、チューニングを自動で試してくれるところです。
scikit-learnで有名なデータセットの分析をやってみたなど、機械学習をかじったことがある人でも、なぜそのアルゴリズムを使うのか、チューニングの勘所はどこなのかを、1から説明できる方は少ないのではないでしょうか。かくいう私も、オリジナルの課題に対して、0からプロセスを組み立てるには、ハードルを感じていました。
このPyCaretは、アルゴリズムやパラメータの設定を自動で試行することで、人間のアクションを【試行結果の比較・判断】だけにしてくれます。つまり、機械学習の細かいところをわかっていなくても、PyCaretのカバーする範囲においては、よしなにやってくれるわけです。ある程度きれいなデータであれば、データを投げるだけで、このモデルが良さそう!というのが見えてきます。

これがAutoMLか

AutoMLは、生のデータセットから、最も使えるモデルをつくるまでの、一連の流れの自動化を指す言葉と理解しています。通常何らかの機械学習に取り組もうとすると、前処理やモデリング、性能評価、チューニング...と手順を踏むわけですが、それをロボットがやってくれると言うことですね。

Colabで手軽に試す

今回は、IBMの離職分析をテーマに進めてみたいと思います。従業員ごとの属性データが並んでおり、従業員の離職した/していないを予測します。今回はデータをダウンロードして、GoogleDriveに配置して使用します。
https://www.kaggle.com/pavansubhasht/ibm-hr-analytics-attrition-dataset

Colab(https://colab.research.google.com/)にアクセスして、ノートブックを新規作成します。
Colabの使い方は、ざっくり参考程度。

準備

まずはPyCaretを使うための準備として、PyCaretのインストールします。

!pip install pycaret

次に、GoogleDriveに配置したデータを操作できるようにします。

from google.colab import drive
from google.colab import files
drive.mount("/content/drive")

これを実行するとURLと入力フォームが出てきます。
リンクから認証コードを取得して、入力すると、連携できるようになります。

ちなみにscikit-learnやPyCaretに用意されているデータも、下記のように取り込むことが可能です。

from sklearn.datasets import load_iris
from pycaret.datasets import get_data

データの詳細はこちらを参照ください。
Dataset loading utilities — scikit-learn https://scikit-learn.org/stable/datasets/index.html
PyCaret’s Data Repository https://pycaret.org/get-data/

前処理

データを読み込む準備もできたので、まずはデータの中身を見てみましょう。

import pandas as pd
train_data = pd.read_csv("drive/My Drive/Colab Notebooks/HR-Employee-Attrition.csv")
train_data.head()


年齢や出張頻度、部署、職場の満足度などのカラムが確認できます。
今回は、離職した/していないを予測するため、ターゲット(目的変数)は"Attrition"になります。

これより、データの前処理を行います。今回は2値分類ですのでpycaret.classificationをimportします。予測のターゲットを指定し、以下を実行します。

from pycaret.classification import *
exp_clf101 = setup(data = train_data, target = "Attrition", session_id = 123)

ここでは、データの型が推測され、正しい場合はEnterキー、修正したい場合はquitを入力します。
型を修正したい場合は、setup()で下記のように指定します。

exp_clf101 = setup(data = train_data, target="Attrition", categorical_features=["EmployeeNumber"], numeric_features=["EnvironmentSatisfaction", "JobInvolvement"], session_id = 123)

例えば、1~4の数字であっても、カテゴリの識別子として使用している数字なのか、値として意味を持っている数字なのかで、型の設定は変わってくると思います。

前処理では、データの型の推測のほかに、データの分割や欠損値の補完も行ってくれます。
データに欠損がある場合、Missing ValuesにTrueが表示されます。その場合、setup()の中で自動で欠損補完が行われます。数値データであれば平均値、カテゴリデータであれば"not_available"という文字列の代入が、デフォルトの処理として実行されます。もちろん、欠損埋めの方法を指定することも可能で、平均値ではなく中央値で埋めたり、"not_availabl"ではなく最頻値で埋める設定が可能です。
https://pycaret.org/missing-values/

複数の予測モデルで分析

compare_models()で、データセットを複数の予測モデルを用いて分析を行い、その結果を表として出力します。

compare_models()


どの指標においても、数字の大きいものが、より優れた予測モデルと言えます。
今回は、まずAUCで全体感を比較し、見落としがないようにしたい場合はRecallを重視(少しでも離職の可能性がありそうであれば離職に分類)、余計な対象を含めたくない場合はPrec.を重視(確実に離職しそうな人だけを離職に分類)で見ます。
AUCは、0.5が最小(完全にランダム状態)で、1が最も精度が良い、となります。上記の表で0となっているモデルがあるのは、処理の中で例外が発生した場合に0になるようになっているためです。通常こういったモデルは無視してしまって問題ないと思います。
RecallとPrec.はトレードオフの関係にあるため、調和平均をとったF1をみる場合もあります。Accuracyはわかりやすい指標ではあるのですが、ラベルに偏りがある場合(Yesばかり/Noばかり)は注意が必要です。
表の見方は、扱っているデータのストーリーに合わせて決めていきます。ちなみに、PyCaretでは精度指標にLoglossがありません。

create_model()により予測モデルを生成します。今回は、AUCが高く、離職しそうな人を絞って予測する(Prec.を重視)という意図で、その2つの値が大きい"CatBoost Classifier"を採用します。create_model()を実行すると、10分割の交差検定が行われていることがわかります。evaluate_model()は、実行すると、モデル評価に利用できる各種グラフ類が表示されます。

model = create_model("catboost")
evaluate_model(model)


モデルを確定し、予測を実行

finalize_model()でモデルを確定します。finalize_model()は、create_model()の時には使われていなかったホールドアウトも使用して、モデルのパフォーマンスを確定させます。
ホールドアウトとは、機械学習モデルのパフォーマンスを最終的に推定するときに使うデータのことで、PyCaretではデフォルトで30%のデータが、ホールドアウトとして先取りされています。アルゴリズムの選定やチューニングの段階では使用せず、モデルを確定するときにのみ使用します。
次に、予測をしたい未知データ(test.csv)を取り込み、予測を実行します。今回は元のデータからランダムに抽出したデータセットを使用しました。新たに、LabelとScoreという列が追加されたresult.csvが出力され、Labelで離職する/しないの予測ができたことになります。

final_model = finalize_model(model)
data_unseen = pd.read_csv("drive/My Drive/Colab Notebooks/test.csv")
result = predict_model(final_model, data = data_unseen)
result.to_csv("drive/My Drive/Colab Notebooks/data/result.csv")

モデルの保存

モデルの保存、保存したモデルの使用も可能です。

save_model(final_model,'Final Model 10Dec2020')
saved_final_rf = load_model('Final Model 10NDec2020')

まとめ

今回は離職分析をテーマに、PyCaretを使って、AutoMLの世界を覗いてみました。実際の処理を行うコードとしては十数行で、それなりの学習済みモデルを作ることができ、予測もできました。これだけ手軽なので、気軽にいろんなデータを投入してみて、新たな発見や活用が見えると面白いと思います。
データ分析というと、○○が要因で〜といった帰着が多いですが、今回のように、このくらいの精度をもつ予測モデルができました、それによってこういう予測ができて、この人に対して○○という施策を行うと...といった【予測からのアプローチ】も、今後、さらに広がりそうだと感じた次第です。

Discussion