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()
こちらも同様に問題なく追加できたことが確認できた。