いちろう’s blog

すーぱーえんじにあ

PyCaretでカスタムメトリクスを利用する

AutoMLライブラリのPyCaretでカスタムメトリクスを追加する方法です。

pycaret.readthedocs.io

結論

add_metricを利用する。

from pycaret.${学習方法} import add_metric
add_metric(~)

${学習方法}の箇所は、classification、cluster、regressionのいずれかを選択する。

公式ドキュメントはこちら

pycaret.readthedocs.io

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_functionpredict_probaのどちらかの値で評価が実施される。特別なことがない限りtargetはデフォルト値で良さそう。

decision_functionpredict_probaの違いは、以下のリンクを参照。

www.letitride.jp

実装例

実際に幾つかのメトリクスを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の追加結果

出力結果の右端に、log_lossが追加されていることが確認できた。

引数つきメトリクスを追加(FBetaScore)

先ほど追加したメトリクスは、メトリクスに渡す引数がyy_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()

FBetaScoreの追加結果

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