しきい値を最適化する
理論上はデフォルトの 0.5 が accuracy を最大化すると聞きましたが、実際にどうなるか確かめたいとします。そこで複数のしきい値を試し、得られる accuracy を比較して、最も良いしきい値を見つけます。さらに F1 スコアでも同様に実験します。0.5 は本当に最適なしきい値でしょうか? accuracy と F1 スコアで最適なしきい値は同じでしょうか?実際に確かめてみましょう。テストデータをスコアリングして得たscores行列が用意されています。テストデータの正解ラベルはy_testとして利用できます。最後に、配列の最小値・最大値のインデックスを返す 2 つのnumpy関数argmin()とargmax()、さらに評価指標のaccuracy_score()とf1_score()が読み込まれています。
この演習はコースの一部です
Python で設計する Machine Learning ワークフロー
演習の手順
- 0.0、0.25、0.5、0.75、1.0 を含むしきい値の範囲を作成します。
- 二重リスト内包表記を使って、上記の各しきい値に対する予測を保存します。しきい値
thrでスコア行列からラベルを得るには、[s[1] > thr for s in scores]が使えることを思い出してください。 - そのリストを走査して、各しきい値の accuracy を計算します。F1 スコアについても同様に計算します。
argmin()またはargmax()を使って、accuracy と F1 それぞれの最適なしきい値を見つけてください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Create a range of equally spaced threshold values
t_range = ____
# Store the predicted labels for each value of the threshold
preds = [[____ > thr for s in scores] for ____ in ____]
# Compute the accuracy for each threshold
accuracies = [____(____, ____) for p in preds]
# Compute the F1 score for each threshold
f1_scores = [____(____, ____) for p in preds]
# Report the optimal threshold for accuracy, and for F1
print(t_range[____(accuracies)], t_range[____(f1_scores)])