PyCaretでカスタムメトリクスを利用する
AutoMLライブラリのPyCaretでカスタムメトリクスを追加する方法です。
結論
add_metricを利用する。
from pycaret.${学習方法} import add_metric add_metric(~)
${学習方法}の箇所は、classification、cluster、regressionのいずれかを選択する。
公式ドキュメントはこちら
pycaret.classification.add_metricに指定可能な引数とその意味は以下の通り。
| 引数名 | デフォルト値 | 意味 |
|---|---|---|
| id | メトリクスの中で唯一のid(名称)を指定する。 | |
| name | compare_model()などを実行した際に出力される表示名 | |
| score_func | PyCaretに追加する評価関数のメソッド。score_func(y, y_pred, **kwargs)の形式で動作するものである必要がある。 |
|
| target | pred | モデルの出力のうち何を評価に用いるか。(pred : モデルによって予測された値, pred_proba: モデルの出力の生データ(predict_proba), threshold : decision_functionとpredict_probaのどちらか。 |
| greater_is_better | True | score_funcの値が大きいほど良いモデル=True、小さいほどいいモデル=False |
| multiclass | True | マルチクラス分類をサポートするかどうか |
| **kwargs | score_funcに与えるy,y_pred以外の引数 |
targetにおいてpred以外を指定した場合は、モデルの予測値ではなくモデルの分類確信度であるdecision_functionとpredict_probaのどちらかの値で評価が実施される。特別なことがない限りtargetはデフォルト値で良さそう。
decision_functionとpredict_probaの違いは、以下のリンクを参照。
実装例
実際に幾つかのメトリクスをpycaretのモデルに追加し、動作を確認してみる。
LogLossの追加
サンプルとしてsklearn.metrics.log_lossを追加してみる。
まずpycaretの機能を利用して、試験用データのインポートを行う。
from pycaret.classification import * exp_name = setup(data = juice, target = 'Purchase', log_experiment = True)
追加したいメトリクスであるsklearn.metrics.log_lossの定義と、add_metricによる追加を実施する。
from sklearn.metrics import log_loss add_metric('logloss', 'Log Loss', log_loss, greater_is_better = False)
実行すると以下のように出力され、pycaretのパイプラインに、loglossが「Log Loss」の名称で組み込まれたことを確認する。
Name Log Loss
Display Name Log Loss
Score Function <function log_loss at 0x13d18b8b0>
Scorer make_scorer(log_loss, greater_is_better=False)
Target pred
Args {}
Greater is Better False
Multiclass True
Custom True
Name: logloss, dtype: object
compare_models()で、add_metricで定義したlog_lossによる評価が実施されているかを確認する。
best = compare_models()

出力結果の右端に、log_lossが追加されていることが確認できた。
引数つきメトリクスを追加(FBetaScore)
先ほど追加したメトリクスは、メトリクスに渡す引数がyとy_predの2つのみであった。追加するメトリクスの種類によっては、ハイパーパラメータや追加の引数を要求するものがある為、そのようなメトリクスの場合の追加方法も確認する。
確認のために利用するメトリクスとして、FBetaScoreを利用する。FBetaScoreは、予測データと正解データ以外にbetaの引数が必要になる。追加の引数をadd_metricsで指定するする場合は、**kargsとして追加する。
from sklearn.metrics import fbeta_score add_metric('fbeta', 'FBetaScore', fbeta_score, beta=7)
loglossの場合と同様に、FBetaScoreが組み込まれたことを確認する。
Name FBetaScore
Display Name FBetaScore
Score Function <function fbeta_score at 0x14248a8b0>
Scorer make_scorer(fbeta_score, beta=7)
Target pred
Args {'beta': 7} # ←こちらにkargsで追加した引数が追加されていることを確認
Greater is Better True
Multiclass True
Custom True
Name: fbeta, dtype: object
同様にcompare_modelsを実施する。
best = compare_models()

こちらも同様に問題なく追加できたことが確認できた。