PyCaretを利用して簡単にモデル比較を行おう
今回はローコードでモデルを開発できるPyCaretを利用して、titanicデータセットの分類をさせてみようと思います。
PyCaretとは?
PyCaretとは、オープンソースのローコードで機械学習モデルを開発できるPythonライブラリです。通常機械学習モデルを開発する時はscikit-learnやXGBoost、LightGBMなど様々なライブラリを駆使し、ベースモデルや比較対象モデルを開発して行きます。しかし、モデルの開発を行う場合は多くの実装を必要とすることが多々あり、最低限の設定でモデルを作って性能比較をしたいと言った場合に負担が大きかったと思います。そこでPyCaretはローコードツールとして上記のようなライブラリをラッピングし、データを指定すればベースモデルの学習と比較をしてくれるものとなります。
実際に使ってみよう
取り扱うデータセットについて
今回は機械学習モデル開発の入門の定番データであるTitanicの生存者を見極めるタスクをしてみようと思います。例えばこちらからデータを取得できますので、ぜひ参照してください。ダウンロードしたデータは後ほど作成するpycaret_titanic_tutorialの下にdata/train.csvのような形で保存してください。
Python環境の構築
まずはPython環境を構築します。なお、Pythonバージョンですが3.11までにしか対応していないというエラーが出てしまったため、今回は3.11で初期化します。また、結果を可視化するために今回はJupyter Notebookを使うためにjupyterをインストールしています。
uv init pycaret_titanic_tutorial -p 3.11
cd pycaret_titanic_tutorial
uv add pycaret pandas jupyter
PyCaretを使ったモデル比較の実行を実装
それでは実際にPyCaretを利用するコードを実装してみます。
import pandas as pd
from pycaret.classification import *
data = pd.read_csv('data/train.csv')
setup(data, target='Survived')
top_model = compare_models()
まずはpd.read_csv("data/train.csv")で学習用データを読み込み、setup(...)の部分で学習データの設定と目標ラベルのカラムを指定しています。そしてcompare_modelsで定義されているモデルの学習を実行してその中でベスト評価されたモデルをtop_modelに格納しています。Jupyter Notebook上で実行しましたが、setupおよびcompare_modelsの結果は以下のようになります。

setupの結果

compare_modelsの結果
compare_modelsで学習された結果最も性能が高く評価されたモデルが戻り値として取得できます。今回の場合は結果をみてもわかるようにLogisticRegressionがトップだったため、そのモデルが返されます。戻り値であるtop_modelを表示すると以下のようにパラメータ含め確認できます。

compare_modelsの結果
トップモデルのチューニング
先ほど学習したtop_modelであるLogisticRegressionモデルをチューニングすることができ、以下のように実装することでチューニングが可能です。
tuned_top_model = tune_model(top_model)
tune_modelを実行すると以下のような結果が得られます。

compare_modelsの結果
なお、チューニングについては以下のドキュメントにまとまっています。要約すると以下のようなことを実施しています。
- モデルのハイパーパラメータを調整
- フォールドごとにクロスバリデーションされたスコアを含むスコアリンググリッドである
- optimizeパラメータで定義された指標に基づいて最適なモデルが選択される
- クロスバリデーション中に評価された指標には、Gent_metrics関数を使用してアクセス可能
- add_metricおよびremove_metric関数を使用して、カスタム指標を追加または削除できます。
ROC曲線の表示
先ほど作成したtuned_top_modelについてROC曲線を描画させてみます。ROC曲線とはモデルの分類精度を可視化する手法の一つであり、閾値を変化させた時の偽陽性率と真陽性率の関係についてプロットしたグラフとなります。
以下のコードを実行するとプロットを描画できます。
plot_model(tuned_top_model)

plot_modelの結果
テスト結果のサブミット
最後に、今回作ったモデルの結果をKaggleにサブミットしてスコアを検証してみましょう。先ほどまではtrain.csvを利用した学習していましたが、提出用のデータセットとしてtest.csvを読み込んで、tuned_top_modelを利用して提出用データを作ります。
test_df = pd.read_csv('data/test.csv')
predict_result = predict_model(tuned_top_model, test_df)
submission_df = predict_result[["PassengerId", "prediction_label"]]
submission_df.to_csv("submission.csv")
こちらのようにpredict_modelを利用することで、指定したモデルを指定したデータについて推論させることが可能です。推論結果にはprediction_labelというカラムに推論結果のラベルが、prediction_scoreに推論スコアが保存されます。今回必要な情報はPassengerIdとpredict_labelなのでその二つを保存しました。なお、出力形式はPassengerIdとSurvivedのカラムにする必要があるのでそのように保存後に調整しました。
最後にKaggleの該当ページからsubmission.csvを提出した結果、以下のような結果になりました。結果は0.78468ということで、80%弱のデータの分類は成功しているものの20%程度は失敗しているということです。PyCaretで学習するのはあくまでベースラインとなるモデル、またはそこから少し込み入った調整がされたモデルだと思うので、一見精度は低いように見えますがここで作ったモデルをベースにこの先開発していくことになると考えると十分な比較結果になると思います。

テストデータの推論の結果
まとめ
今回はPyCaretを利用してTitanicデータセットに対するローコードでの学習およびKaggleへの提出をしてみました。学習されたモデルの精度は必ずしも高いとは言えなかったですが、PyCaretで学習されたモデルをベースラインとしてそこから発展した学習を実現していくために利用するといい使い方かなと思います。機械学習入門者からベースラインモデルを開発する必要がある方まで幅広く利用できるライブラリとなっているので、ご興味があればぜひ使ってみてください!
Discussion