予測対象データセットのラベル間の比率に応じて、ラベルをうまく判定する方法
はじめに
こんにちは。
今回の記事は、次の問題についての記事です。
問題提起
場面設定
例えば、ある建物の入り口に防犯カメラが付いているとします。そして、防犯カメラに映った人は一般人か、それとも不審者かを、自動的に判定したいとします。
するとAIの出番ということで、映った人を判定するAIモデルを作れればよいことになります。
問題
ですが、映った人が不審者である確率は、一定ではありません。時間帯が夜のときのほうが、不審者の割合は高そうです。また、その日は平日かどうかや、周辺の警備の強さも、不審者の割合に影響しそうです。このように、映った人が不審者である確率は、状況によって変わってきます。
そうなると、どういう問題が起こるか。
例えば、映った人が不審者である確率が5%程度であることを想定して、映った人を判定するモデルを作りました。しかし、ある状況ではその確率が5%より小さい(1%とか)としたらどうでしょう。そうなると、一般人を誤って不審者と判定してしまう可能性が高くなってしまいます。逆に、その確率が5%より大きい(10%とか)としたら、不審者を誤って一般人と判定してしまう可能性が高くなってしまうのです。このように、状況によって誤判定が多くなってしまいます。
この問題をどう捉え、そしてどうやって人を判定すればよいか。
映った人が不審者である確率のパターンごとに、モデルを作る手が考えられます。しかし、それはキリがないですし、キリ以前に面倒です。
ちなみに、少し関連する問題として不均衡問題がありますが、今回の問題は不均衡問題とはまた別の話です。
この問題提起の意図
今までこのような問題自体はなんとなく認識していたものの、さほど注意を払っていませんでした。改めて考えると重要そうですし、その割にはこのような問題に関する議論をあまり見かけないです。
そういう経緯から、今回このような問題を提起し、その対策を考えてみました。
前提
分かりやすくするために、次の前提を置きます。
ラベルの種類の数
ラベルは2種類とします。
今回のケースでは、一般人と不審者です。ラベルが2種類なら、もちろん他のケースにも応用できます。
評価指標
目指すのは、判定の正解率(accuracy)を高めることとします。
今回のケースでは、評価指標を正解率とするのは非現実的です。同じ誤判定でも、一般人に対する誤判定と不審者に対する誤判定とでは、そのデメリットが大きく異なるためです。
ただ、ひとまずは評価指標として、分かりやすい正解率を採用します。
モデルの数
人の判定のできるモデルを1つ作ったら、新たにモデルを作るようなことをしないものとします。
モデルによる所属確率の出力
モデルは、人を判定した際にラベルごとの所属確率も出力可能であるとします。
ほとんどのモデルは、判定対象のデータに対する所属確率を出すことができます。細かくは調べていませんが、scikit-learnやPyTorchなどの有名な機械学習ライブラリを使えば、たいてい出せると思います。
通常、所属確率の最も高いラベルを、モデルによる判定結果とします。
ちなみに、ここでは所属確率と表記していますが、「確信度」など別の表記もあります。また、「確率」と書かれているので紛らわしいですが、これは正確には確率ではありません。所属確率は、モデルにとっての「このラベルが正しそう」という自信の強さみたいなものです。
映った人が不審者である確率の推察
過去の経験則などから、今の状況において映った人が不審者である確率を推察できるものとします。今回は、映った人が不審者である確率は30%であるような状況を仮定します。
テスト用データセット
ラベルごとに、テスト用データセットがあるものとします。
データ件数は、ラベルによって偏りがある分には一向に構わないです(極端な話、一般人のデータが100件、不審者のデータが5,000件とかでもOK)。
ただし、ラベルごとのデータの内容は、なるべく現実に沿っていることが重要です(これは大事なことです。これについても論じたいところですが、今回の記事では省略します。)。
また、準備できるデータ件数はもちろん多いに越したことはないです。
解決策
ここで、解決策の一例を述べていきます。この解決策は、大きく次の3ステップから成ります。
1.複数の判定パターンの設定
今から説明するやり方で、映った人に対する判定のパターンというものを複数設定します。
まず、次のような表を作ります。パターン数や各数値は、あくまでも一例です。
パターン | 一般人に対する所属確率に加算する数値 | 不審者に対する所属確率に加算する数値 |
---|---|---|
パターン1 | +0.00 | -0.20 |
パターン2 | +0.00 | -0.10 |
パターン3 | +0.00 | +0.00 |
パターン4 | +0.00 | +0.10 |
パターン5 | +0.00 | +0.20 |
ここからは、各パターンごとの作業です。
映った人をモデルに入力すると、ラベルごとの所属確率が出てきます。これら各所属確率に対して、上の表で設定した数値をそれぞれ加算します(加算する値がマイナスの場合は、負の値を加算する、つまり減算するに等しい)。そして、加算済みの各所属確率の中で最も高い数値のラベルを、映った人に対する判定結果とする、という判定方法を考えます。
例えば、映った人をモデルに入力した際、次の各所属確率を得られたとします。
ラベル | 所属確率 |
---|---|
一般人 | 0.54 |
不審者 | 0.46 |
すると、パターンごとの各結果は次のようになります。
パターン | 一般人に対する所属確率に加算済みの数値 | 不審者に対する所属確率に加算済みの数値 | 加算済みの所属確率の最も高いラベル(=判定結果) |
---|---|---|---|
パターン1 | 0.54 | 0.26 | 一般人 |
パターン2 | 0.54 | 0.36 | 一般人 |
パターン3 | 0.54 | 0.46 | 一般人 |
パターン4 | 0.54 | 0.56 | 不審者 |
パターン5 | 0.54 | 0.66 | 不審者 |
表の一番右の列が、パターンごとの判定結果です。パターンごとに、映った人をそのようなやり方で判定することを考えます。
ちなみに、特定の1つだけのラベルに対して所属確率についての閾値を設定する、というやり方もあります。これを便宜的に「閾値設定方式」と呼ぶことにします。閾値設定方式は例えば、「不審者ラベルに対する所属確率が0.4以上なら不審者と判定する」みたいなやり方です。閾値として、0.4やその他いろんな数値を設定する要領です。閾値設定方式は、これまで説明してきたやり方と実質的に同等です。
閾値設定方式なら、特定のラベル1つだけに対して所属確率を見ればいいので、閾値設定方式のほうが分かりやすいかもしれません。ただ、閾値設定方式に比べてこれまで説明してきたやり方なら、ラベルの種類の数が3以上の場合(詳しくは後述)にも応用しやすいです。そのため、これまで説明してきたやり方を紹介しました。
とにかく、以上のようにしていくつかのパターンを設定したら、各パターンの良し悪しをテストします。
2.パターンごとの、テスト用データセットの判定
次に、パターンごとに、テスト用データセットの各データをモデルに入力します。そして、次の表のように、データごとの所属確率の出力結果や、判定結果をまとめます。判定のしかたは、前述の内容をご参照ください。
テストデータNo. | ラベル | 一般人に対する所属確率の出力結果 | 判定結果(パターン1) | 判定結果(パターン2) | 判定結果(パターン3) | 判定結果(パターン4) | 判定結果(パターン5) |
---|---|---|---|---|---|---|---|
1 | 一般人 | 0.54 | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 不審者(ハズレ) | 不審者(ハズレ) |
2 | 一般人 | 0.58 | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 不審者(ハズレ) |
3 | 一般人 | 0.39 | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) |
4 | 一般人 | 0.47 | 一般人(正解!) | 一般人(正解!) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) |
5 | 一般人 | 0.63 | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) |
6 | 一般人 | 0.70 | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) | 一般人(正解!) |
7 | 一般人 | 0.43 | 一般人(正解!) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) |
8 | 一般人 | 0.46 | 一般人(正解!) | 一般人(正解!) | 不審者(ハズレ) | 不審者(ハズレ) | 不審者(ハズレ) |
9 | 不審者 | 0.37 | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) |
10 | 不審者 | 0.41 | 一般人(ハズレ) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) |
11 | 不審者 | 0.51 | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) | 不審者(正解!) | 不審者(正解!) |
12 | 不審者 | 0.58 | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) | 不審者(正解!) |
13 | 不審者 | 0.65 | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) | 一般人(ハズレ) |
14 | 不審者 | 0.44 | 一般人(ハズレ) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) | 不審者(正解!) |
あくまでも例示のため、ここではテスト用データセットを上記の14件だけにしています。
ちなみに、不審者に対する所属確率の列は省略しています(一般人に対する所属確率があれば、不審者に対する所属確率を割り出せます。一般人に対する所属確率を1から引けばいいです。)。
すると、上の結果からパターンごと、かつラベルごとの再現率(recall)を算出することができます。例えばパターン1の場合、ラベルが一般人であるデータ8件のうち7件が正解なので、再現率は7÷8で0.875です。
算出した結果は、次の表の通りです。
パターン | 一般人に対する再現率 | 不審者に対する再現率 |
---|---|---|
パターン1 | 0.875 | 0.167 |
パターン2 | 0.750 | 0.500 |
パターン3 | 0.500 | 0.500 |
パターン4 | 0.375 | 0.667 |
パターン5 | 0.250 | 0.833 |
3.パターンごとの、正解率の推定
前述のように、映った人が不審者である確率は30%だとします。
その情報を用いて次のようにすれば、どのパターンが最も高い正解率を誇れそうなのかを推察することができます。
分かりやすくするために、映った人は100人いて、そのうち一般人は70人(映った人が一般人である確率は70%のため)、不審者は30人だとします。
次に、パターンごとに、ラベルごとの正しく判定できる人数を推定します。
パターン | 一般人を正しく判定できる人数(推定値) | 一般人を正しく判定できる人数(推定値) | 正しく判定できる人数(推定値)の合計 |
---|---|---|---|
パターン1 | 61.25 | 5.0 | 66.25 |
パターン2 | 52.50 | 15.0 | 67.50 |
パターン3 | 35.00 | 15.0 | 50.00 |
パターン4 | 26.25 | 20.0 | 46.25 |
パターン5 | 17.50 | 25.0 | 42.50 |
推定のしかたは、単に人数×再現率です。例えばパターン1の場合、70(人)*0.875(一般人に対する再現率)という掛け算になるので、一般人を正しく判定できる人数の推定値は61.25人です。人数が小数になることは現実にはありえないですが、便宜上小数で表しています。
あとは、ラベルごとの「正しく判定できる人数の推定値」の合計が最も高いパターンを選べばOKです。パターン1といい勝負ですが、パターン2が一番ですね。このパターンだと、正解率0.675を見込むことができます。
以上のようなやり方なら、状況(不審者の割合がどのくらいか)に応じて適切な判定パターンを選ぶことができます。
余談ですが、この状況というのはベイズ理論における事前確率みたいなものかもしれません。
補足
あとは、いくつか補足します。
評価指標の設定
先述の通り、今回は分かりやすい指標である正解率を例にとりました。
ですが、実際には評価指標を適切に選ぶ必要があります。これは、深く検討したいところです。今回の例だと、状況(不審者の割合がどのくらいか)や、ラベルごとの誤判定のデメリットの大きさくらいはきちんと加味したほうがいいです。
具体的な評価指標としては、重み付き正解率なんかが候補になってきます。例えば、不審者を見逃すリスクを減らすために、不審者判定の正解に大きめの重みを付けるとかです。
他の評価指標としては、F1スコアやAUCがあります。
以前の記事でも述べたように、いずれにしてもとにかく各評価指標をよく調査や検討したほうがいいです。
評価指標の値の推定
先述の例は、評価指標が正解率である場合です。正解率以外の評価指標を設定した場合は、当然ですが設定した評価指標の値を推定するように試みる必要があります。
複数のモデルの活用
今回の記事はモデルの数が1つだけの場合ですが、複数のモデルを活用する手もありそうです。
複数のモデルを作るやり方の例は、学習する際の学習用データの一部を変えるとか、ラベル間のデータ数の比率を変えるとかです。さらに言えば、学習のアルゴリズム(モデルの型)を変える手や、他の方の作ったモデルを借用する手もあります。
そして作成したモデルごとに、状況(不審者の割合がどのくらいか)に応じてベターな判定パターンを選抜します。併せて、そのパターンの場合の判定性能(定めておいた評価指標における判定の精度)も記録します。
最後に、判定性能の最も高いモデルを選ぶ、という方策です。これは、状況が一定でないからこそ活きる方策です。
ただ、この方策はそれなりに面倒そうです。この面倒さに見合うほどの価値があるかどうかは、試してみる必要がありそうです。
ラベルの種類が3つ以上の場合
今回紹介したやり方は、ラベルの種類が3つ以上の場合にも応用できます。例えば、こんな感じでパターン設定をすればいいです。
パターン | 一般人に対する所属確率に加算する数値 | 不審者に対する所属確率に加算する数値 | その他の人に対する所属確率に加算する数値 |
---|---|---|---|
パターン1 | +0.00 | -0.20 | -0.10 |
パターン2 | +0.00 | -0.20 | +0.00 |
パターン3 | +0.00 | -0.20 | +0.10 |
パターン4 | +0.00 | -0.10 | -0.10 |
パターン5 | … | … | … |
ただ、ラベルの種類の数が1つ増えるだけで、パターンの数はかなり多くなってしまいます。パターンの数が膨大になっても構わないならいいですが、パターンの数を抑えたいなら何か工夫が必要になりそうです。
状況の推察の精度
今回は、状況(不審者の割合がどのくらいか)をうまく推察できることを前提としました。もちろん、実際には状況をそんなに容易に推察できなそうです。
状況の推察がうまくできないと、適切な判定パターンを選べる可能性が下がってしまいます。その点は、心得ておいたほうがいいです。
ただ、それでも状況の推察にきちんと取り組む価値はあると思います。逆に、状況についての的外れな認識を持っていたら、冒頭に挙げたような問題が依然として残ってしまうからです。状況について無思慮でいるくらいなら、多少は考えて状況を推察するほうがまだいいと思います。
状況の推察のしかたには、いろんな方法が考えられそうですが、今回は省略します。
データの傾向の変化
今回の話は、抽象度を一段階上げると「データの傾向の変化」と言えると思います。
その一種として、今回のようなラベル間の比率の変化があるだけです。他には、同じラベル内でのデータの内容の傾向の変化があります。今回の例で言うなら、不審者の服装や動きの傾向が変わることです。
昨今のAI事情を見ていると、データの傾向の変化というテーマは少しずつ注目されている気がします。今後、このテーマを探っていく価値がありそうです。
終わりに
最後までお読みいただき、ありがとうございました。
Discussion