kNakajima's Blog

技術系のアウトプットブログです。

scikit-learnのcross_val_scoreで他クラス分類の交差検定の結果をF値で出したい時の注意点

Python機械学習ライブラリscikit-learnのcross_val_scoreを利用して、他クラス分類タスクの交差検定の結果をF値で出力したいときに、つまづいた点があったため、メモとして残しておきます。

エラーの内容

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold

stratifiedkfold = StratifiedKFold(n_splits=10)

scores = cross_val_score(model, data, labels, cv=stratifiedkfold, scoring='f1')

交差検定を行いたい時に、sklearnのcross_val_scoreを利用しています。

デフォルトの設定だと、accuracyが結果として出るのですが、結果をF値で出したい時、scoring='f1'と設定しても、データセットが他クラスだと以下のようなエラーが起こります。

 Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

解決方法

他クラス分類の場合は、F値の平均をどのように算出するかを指定する必要があります。

こちらを参考に、F値の平均の算出方法も指定することで、解決します。

例としてF値のマクロ平均を結果として出力したい場合は、以下のようにscoring='f1_macro'とします。

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold

stratifiedkfold = StratifiedKFold(n_splits=10)

scores = cross_val_score(model, data, labels, cv=stratifiedkfold, scoring='f1_macro')

print('Cross-Validation scores: {}'.format(scores))
# スコアの平均値
print('Average score: {}'.format(np.mean(scores)))