背景
モデルの開発をするときに、「どのようにモデルを評価するのか」がとても大切になってくるかと思います。
理想としては、モデルをデプロイする前(オフライン評価)とデプロイ後(オンライン評価)で同じ指標を使いたいところですが、基本的にはそれは実現しません。なぜなら、デプロイ前はラベルデータがありますが、デプロイ後は多くのケースで無いからです。
今回は、デプロイする前(オフライン評価)のモデル評価をする流れ及び具体的な方法を共有します。
主な流れは、
- 基準を定める
- その基準に対して比較評価をする
です。
ベースラインを設定
まず最初にやらないといけないのは、基準を定めることです。指標を単体で取得したところで意味がありません。比較対象となる基準を定める必要があります。
この基準は、タスクによってさまざまなので、いくつか例を挙げてみます。
基準例1.ランダム
もしランダムで結果を出力したらどの程度の精度になるのか?
基準例2.単純なヒューリスティック
単純なヒューリスティックで行う場合どの程度の精度になるのか?
例えば、アイテムのランキング付けをするタスクの場合、単純に年代順で並べたらどうなのか?単純にあいうえお順で並べたらどうなるのか?
基準例3.人
かなり多くのMLタスクの目的は、人がやっていた作業の自動化です。その場合であれば、今AIにやらせようとしているタスクを人にやらせたらどのくらい精度が出るのか?
基準例4.既存ソリューション
もし今のMLタスクが既存のソリューションを代替することが目的なのであれば、既存のソリューションでどの程度の精度が実現できるのか?
評価方法
基準を設定できたら、今度はモデルを実際に評価していきます。具体的な評価方法で、有名どころをピックアップし共有します。
また、今回は、行いたいタスクに特化した指標は除いています。
1. ノイズ耐性評価
学習用データセットで高いパフォーマンスを発揮できたとしても、本番時に想定されるノイズが多いデータでも高いパフォーマンスで推論ができるわけではありません。本番時にも良いパフォーマンスが期待できるように、今のモデルがノイズにどれだけ対応できるのかを確認する必要があります。
ノイズに敏感過ぎるMLモデルは将来のメンテナンス性が大変になります。
評価時に、テストセットをローテーションすることで、MLモデルがノイズにどれほど敏感なのかを確認することができます。
2. 不変性評価
ほとんど場合、入力データが変われば出力結果も変わってきます。しかし、入力が変わったとしても出力結果は変わってはいけない項目も存在します。
分かりやすい例だと、「人種」。「人種」によって年収の予測が変わってしまうというようなことはあってはいけません。倫理的に。
このようなバイアスが生じないようにするためには、そもそもこのようなセンシティブな情報を学習データから除くのが理想ですが、無理ならば、センシティブな入力を変えたときにどのように出力が変わるのかを確認する必要があります。
3. 期待方向性評価
入力の増減によってアウトプットも増減することが期待できる予測もあるかと思います。
出力結果が期待通りの動きをするかどうかを確認することで、データそのもの、もしくは学習工程に問題があるかどうかも確認することができます。
例として、家賃予測。もし単純に床面積を増やせば、必然的に価格も上昇することが期待できます。
4. スライス別評価
モデルを評価する際に、「総合」結果に重きを置きすぎるのは危険なケースがあります。
例として、ある企業がモデルを評価をしようとしていて、今使用可能なデータが2種類あるとします。
1種類目は全データの90%を占めていて、2種類目は残りの10%を占めているとします。
上のテーブルのように、「総合」的な指標のみでモデルを評価した場合、モデルAの方が精度が良いと捉えられると思います。しかし、各サブセットのデータに対しての精度を見るとモデルBの方が、両方とも95%の精度なので、よりよいパフォーマンスが発揮できているといえます。
このように、各サブグループ別で評価をすることで、上記のような気付きがある上、どのようなデータと相性が良いのか等の情報も得ることができます。
5. キャリブレーション評価
時系列予測の場合、最も大切になってくる評価方法がキャリブレーション評価です。
モデルが「キャリブレートされている」、と言える状態は、もしモデルが、Aの起こる確率が「40%」と予測した場合、本当にAの生じる頻度が「40%」に近いというような状態です。
逆に、モデルがAの起こる確率が「78%」と予測したのに、本当にAの生じる頻度が「12%」であれば、モデルは「キャリブレートされていない」事になります。
評価の実施方法は、(上記のグラフのように)横軸に「モデルが出力した確率」、縦軸に「発生頻度」のグラフを作成すれば評価ができます。 このようなグラフは、
sklearn.calibration.calibrationcurveのような関数を使用すればすぐに作成できます。
Writed by F.K(20代・入社3年目)