はじめに
scikit-learnのGridSearchCVにおいて、クロスバリデーションの評価指標をscoringパラメータの引数として指定できるが、通常、公式ドキュメントの3.3.1. The scoring parameter: defining model evaluation rulesにあるものしか指定できない。
今回、kappa係数や、マシューズ相関係数を評価指標として指定したかったのでやり方を調査した。
途中でこの記事とかぶっていることに気が付きました。本記事は「scikit-learnの関数としては用意されているが、GridSearchCVには指定できないケース」として読んでください。
やり方
sklearn.metrics.make_scorerにより評価指標の関数をラップしたスコアラーを作成し、それをGridSearchCVのscoringパラメータに渡せばよい。
以下は、kappa係数、マシューズ相関係数、およびそれ以外(規定のもの)を指定する場合の例である。
値が大きいほどよい指標の場合は、make_scorer関数をそのまま呼び出せばよいが、値が小さい程よい指標(RMSE等)の場合は、make_scorerのgreater_is_betterパラメータをFalseに指定する必要がある。
from sklearn.metrics import cohen_kappa_score, make_scorer, matthews_corrcoef
from sklearn.model_selection import GridSearchCV
scoring = ... # 評価指標を文字列で指定
estimator = ... # ハイパーパラメータを求めたい予測器を指定
params = ... # 探索したいハイパーパラメータを指定(dict形式)
if scoring == "kappa":
kappa_scorer = make_scorer(cohen_kappa_score)
gc = GridSearchCV(estimator, params, cv=3, scoring=kappa_scorer)
elif scoring == "mcc":
mcc_scorer = make_scorer(matthews_corrcoef)
gc = GridSearchCV(estimator, params, cv=3, scoring=mcc_scorer)
else:
gc = GridSearchCV(estimator, params, cv=3, scoring=scoring)
所感
そういえば、RMSEも規定の評価指標にはない。毎回、GridSearchCVのログに出力される‘neg_mean_squared_error’等の値を読み替えるのも面倒なので、この方法でRMSEも指定できるようにしたい。
参考
3.3.1. The scoring parameter: defining model evaluation rules
How to use Cohen's Kappa as the evaluation metric in GridSearchCV in Scikit Learn?