はじめに
こんにちは.株式会社音圧爆上げくんにプロKagglerとして所属していますAshmeと申します.
業務の一環としてKaggleの様々なコンペティションに参加し,そこで得られた知見などを記事にして投稿しております.よろしくお願いいたします.また使用したソースコードはこちらにあります.
今回は,ベースラインモデルの作成や,モデル改善のためにどのモデルを採用するかなどの分析を非常に簡単にできるPyCaretというライブラリを紹介します.私も知人に教えていただいたものなのですが,非常に高性能で通常では長いコードになってしまうものも,短いコードで様々なことができるので非常に驚きました.
多くのコンペティションが行われるKaggleでも一度はベースラインモデルを作成すると思います.そんなときに非常に簡単にベースラインを作成することができるのでぜひ一度使用してみていただきたいです.
PyCaretのインストール
PyCaretは実行するとわかるのですが,scikit-learnなどの他のライブラリが内部で動作しています.なのでライブラリの整合性が取れないとエラーが出てしまいます.現在では解消されている可能性もありますが,私が初めて使ったときにはそのような事態になり手作業でライブラリのバージョンを合わせていました.
公式ドキュメントを見る限りでは現在では依存関係もインストールしてくれるそうです.ただフルバージョンをインストールする際には末尾に[full]を追加します.
$ pip install pycaret # フルバージョン $ pip install pycaret[full]
また公式でも仮想環境や,conda環境を使用することが推奨されています.ローカルに直接インストールされているPythonで使用するのは控えたほうが良いでしょう.
モデルの比較
まずはさまざまなモデルによる評価の比較を行ってみます.その前に,PyCaretの方にデータを渡す必要があります.これはsetup関数を用いることで実行できます.このときにデータの前処理も含めてPyCaretの方で実行してくれます.
reg_model = setup(data=train_df, target="price", session_id=1)
引数のdataが元なるデータ(DataFrame),targetが目的変数の列名,session_idはこの後モデルを学習したりするときのシード値を表しています.これを実行すると途中に入力を促されるのですが,これは変数の扱い(数値やカテゴリ)について問題がないかを聞かれています.特に問題がなければそのままエンターを押せば処理してくれます.
データの前処理が終わるとどのような処理を施したかを表にまとめたものが表示されます.表の一部を抜粋したものを以下に示します
.
例えばOriginal Dataはのサイズは(16512, 9)であることや,数値変数の特徴量は8つであり,カテゴリ変数の特徴量は0個であることなどがわかります.
次に実際に様々なモデルによる評価を出してみます.これはcompare_models()関数を用いることで実行できます.このときに引数として"exclude"を指定できるのですが,これは予測に使用しない特徴量名をリストで渡すことができます.
これにより様々なモデルを学習させた結果が表示されます.今回は回帰モデルのため評価指標としてMAEやRMSEなどが計算されています.なのでコンペティションの評価関数で最も良い性能のモデルがどれなのかも一目瞭然です.
今回は最も性能が良かったモデルがcatboostだったのでこちらのモデルを用いてこの後の説明をしていきます.まずあるモデルについて詳しく結果を見る場合は,create_model関数の引数にモデル名を与えることで,交差検証のときの各フォールドでの評価結果とその平均,分散を表示してくれます.このとき出力として上図のような表が表示されることになります.
catboost = create_model("catboost")
これにより各評価指標での汎化性能や,データによって評価指標にどれだけばらつきがあるのかを見ることができます.
ここまではすべて各モデルのデフォルトのパラメータを用いて学習させた結果になっています.PyCaretではここからパラメータの調整もすることができます.tune_model関数に先程のモデルを渡すことでパラメータを調整してくれます.
tuned_catboost = tune_model(catboost)
当然ですが調整後のパラメータを取得することも可能です.
tuned_catboost.get_params()
このように様々な学習,比較だけでなく前回の記事で行ったようなパラメータの調整までも行ってくれます.ただ例として実行したときは調整する前のほうが性能が良かったのが気になったので,調整したから大丈夫と過信せずに自身でも比較すべきでしょう.
モデルの分析
モデルの比較や調整を先程示したような非常に少ないコードで実行してくれるのも非常にありがたいですが,更にモデルの分析も行うことができます.今回は回帰問題のため,残差プロット,誤差プロット,特徴量重要度のプロットをしてみます.
これらはすべてplot_model関数で実行可能であり,第1引数に学習済みのモデル,引数"plot"に何を出力するのかを指定することができます.
# 残差プロット plot_model(tuned_catboost) # 誤差プロット plot_model(tuned_catboost, plot="error") # 特徴量重要度 plot_model(tuned_catboost, plot="feature")
それぞれの実行結果は以下のようになりました.
更にevaluate_model関数を用いることで上記の可視化を含んだ様々なデータを表示することができます.下の例では特徴量重要度を表示しています.表示するものによっては処理に時間がかかるものもありますが,モデルの分析を行うには非常に有用だと思います.
PyCaretにデータを渡した際に内部的に訓練用データと検証用データに分割されます.その訓練用データのみを用いて更に交差検証が行われています.なので訓練に全く使用されていない検証用データに対する評価を見てみましょう.これはpredict_model関数を実行することで検証用データに対する評価を表にまとめてくれます.
predict_model(tuned_catboost)
また実際にテストデータに対する予測を作成するときには元の訓練データすべてを用いると思います.そこでPyCaretのfinalize_model
関数を用いることで渡されたデータすべてを用いて学習してくれます.
final_catboost = finalize_model(tuned_catboost)
その後predict_model
関数の"data"引数にテストデータを与えることで予測を作成してくれます.
test_pred = predict_model(final_catboost, data=val_df)
このとき予測したデータだけではなく,入力したテストデータのDataFrameに予測を"Label"という新しい列を加えたDataFrameが返されるので注意しましょう.
ここまでできればテーブルデータを扱うコンペティションであればベースラインの提出ファイルを作成できると思います.通常であればモデルの比較,残差プロットなどの分析,訓練データ全体を用いた再学習など長いコードになってしまいますが,PyCaretを用いることで短く,簡単なコード(おそらく10行もないのではないでしょうか)で実装することができます.
おわりに
今回はベースラインモデルの作成やモデルの比較,分析を非常に短いコードで簡単に実装できるPyCaretについて紹介しました.Pythonのライブラリは非常に豊富で使い勝手も良いものばかりですが,ついにこんなことまでできるのかといった感じですね.
コンペティションごとにベースラインを作成する必要がありますが,PyCaretを用いることで非常に簡単にできることに加えて,各モデルでの評価比較もできるためモデル改善のためにどのモデルを採用するかを考えるのにも使用できるのではないでしょうか.機会があればぜひ使用してみてください.
最後に人材募集となりますが,株式会社音圧爆上げくんではプロKagglerを募集しています.
少しでも興味の有る方はぜひ以下のリンクをご覧の上ご応募ください.
Wantedlyリンク
参考
PyCaret 公式サイト: https://pycaret.org/
PyCaret GitHub(チュートリアルなどもまとめられています): https://github.com/pycaret/pycaret