機械学習

【機械学習システム設計】Coursera「機械学習」受講記(第6週その2)

機械学習システム設計

機械学習で問題を分析する際に入力データを見ていると、やるべき(やりたい)と思う候補がたくさん出てきます。

  • データをもっと集めるべきではないか?
  • この特徴量はもっと加工して追加するべきではないか?

Coursera機械学習の第6週の後半では、何を優先順位として、どのようにアプローチしていくかについて述べられています。

エラー解析

とりあえず「quick-and-dirty」なアルゴリズムで、すぐに試して、テストしろとのことです。

「quick-and-dirty」は、直訳すると「素早く、そして汚く」で、頑張ってみんな訳していますが、あまり良い日本語約がないような気がします。(安上がり、にわか仕立て、その場しのぎ、etc)

個人的には英語のままの方がピント来るのですが、要するに「性能とか取り敢えず置いておいて、パラメータ調整とかしない簡単なモデルでチャチャッと試せ」という事です。

試す事は大きく分けて以下の2点です。

  • 学習曲線(第6週の前半で紹介)が、データを増やした時、特徴量を増やした時どのようなカーブを描くか?
  • 交差検証でアルゴリズムが間違って分類したデータはどのような傾向にあるか?

学習曲線を書けば、データを増やした方が良いのか、特徴量を増やした方が良いのかどうかも見えてきます。(性能が悪いのにデータを増やしていっても意味ない等)

そして、アルゴリズムが間違って分類したデータの傾向を見れば、データに対して何をするべきかも見えてきます。

スパムメールの判定を例にとると、判定に失敗したメールについて以下を実施します。

  • 間違ったのはどのようなタイプのメール(広告、架空請求、ウイルスメールなど)か?
  • どうすれば(どのような特徴量を考えれば)、それぞれのタイプを正しく判定する事ができるか?(ミススペルを修正する?ヘッダー情報を参照する?など)

有用そうに見えても、性能がたいして改善しない事をしても意味がありません。

quick-and-dirtyなアルゴリズムでたくさん試す事によって、何をする事が重要かを認識する事ができます。

「実際に使用するアルゴリズムで試さないと意味がないのでは?」と思いますが、この「quick-and-dirty」なアルゴリズムで掴んだ傾向が後々の精密なアルゴリズムでも同様の傾向を示すとの事です。

そしてアルゴリズムの性能を測定するために重要なのは、「1つの数値の指標で評価する事」だと言及されています。指標がいくつもあるとアルゴリズムの評価をするのが困難になるからです。

歪んだデータの場合の性能評価

再現率・適合率

指標として「正確度」を使っている場合、アルゴリズムの性能を正しく測定できない場合があります。

本サイトの他の記事では、正確度(accuracy)を「精度」と記載していたりします。「精度」でも間違いではないのですが、後述の適合率(precision)を「精度」と訳す事もあり、紛らわしいので本記事では、accuracyは正確度と記載します。
ただ、実際の現場で「正確度」って言葉はあまり使った事ないなあ・・

例えば、癌かどうかを判定するアルゴリズムで、癌のデータが全体のデータの1/100だったとします。

この時、全てを「癌でない」と判断するアルゴリズムがあったとしても、99/100は当たるので、正確度は99%になりますが、これでは癌かどうかを判定するアルゴリズムにはなりません。

このような歪んだ(ラベルの数が偏った)データの性能を判定するには「再現率」と「適合率」を計測する必要があります。

ここでまずは改めて正確度の定義を確認してみましょう。

$\text{正確度}=\Large\frac{\text{真陽性}+\text{真陰性}}{\text{真陽性}+\text{真陰性}+\text{偽陽性}+\text{偽陰性}}$

ここで、真陽性、真陰性、偽陽性、偽陰性の定義はそれぞれ、以下となります。

真陽性 「陽性」と判定されたものの中で実際に「陽性」であるもの。
真陰性 「陰性」と判定されたものの中で実際に「陰性」であるもの。
偽陽性 「陽性」と判定されたものの中で実際に「陰性」であるもの。
偽陰性 「陰性」と判定されたものの中で実際に「陽性」であるもの。

一方、再現率・適合率はそれぞれ以下で定義されます。

$\text{再現率}=\Large\frac{\text{真陽性}}{\text{真陽性}+\text{偽陰性}}$
$\text{適合率}=\Large\frac{\text{真陽性}}{\text{真陽性}+\text{偽陽性}}$

再現率は「実際に陽性のものを、どれだけ陽性と判定する事ができたか?(どれくらい見逃していないか)」、適合率は「陽性と判定されたものの中で実際に陽性のものがどれくらいあるか?(どれくらい当てられたか)」を意味します。

前述した「全てを癌ではない(陰性)と判定するアルゴリズム」があり、正常と癌の比率が「99:1」だった場合、精度は以下のようになりますが・・

$\text{正確度}=\Large\frac{0+99}{0+99+0+1} \normalsize=0.99$

再現率・適合率は以下のようになります。

$\text{再現率}=\Large\frac{0}{0+1} \normalsize=0$
$\text{適合率}=\Large\frac{0}{0+0} \normalsize=\text{定義不可}$

再現率は0%となり、適合率はそもそも「陽性」と判断する事がないので定義できません。

これが、例えば以下のようなデータでアルゴリズムによる判定結果だった場合は・・

  • 全体のデータ数:10000件中、癌のデータ100件
  • 真陽性80件、偽陽性118件
  • 真陰性9800件、偽陰性2件

正確度、再現率、適合率は以下のようになります。

$\text{正確度}=\Large\frac{80+9800}{80+9800+118+2} \normalsize=0.99$
$\text{再現率}=\Large\frac{80}{80+2} \normalsize=0.97$
$\text{適合率}=\Large\frac{80}{80+118} \normalsize=0.40$

正確度は99%と「全てを癌でないと判定するアルゴリズム」と同程度ですが、再現率(どれだけ癌を見逃さないか)は97%で、かなり良いアルゴリズムになっています。ただし適合率は40%と低めで、60%は癌ではないのに癌と判定された事になります。

再現率・適合率のトレードオフ

再現率と適合率はトレードオフの関係にあります。

出来るだけ癌を見逃さないように再現率を上げようとすると適合率が下がり、正常な人も癌と判定される確率が高くなってしまい、逆に正常な人を癌と判定しないように適合率を上げようとすると、再現率が下がり、癌の人を見逃してしまいます。

再現率・適合率は、閾値をずらす事で調整できます。

陽性(1)/陰性(0)の判定ならば、通常は閾値は0.5で確率が0.5以上の場合を陽性(1)と判定されます。

しかし閾値を0.3にすれば、より多くの人が陽性と判定され(再現率が上がり適合率が下がる)、閾値を0.8とすれば、陽性と判定される人が少なくなります(再現率が下がり適合率が上がる)。

解決すべき問題によって閾値を変更する事が必要となるケースもあるでしょう。

なお、上記の例では、陽性を「癌」、陰性を「癌でない」と定義しています。

このように通常は少ない方のデータ(=注目しているデータ)を「陽性」とします。(例えば「故障有無」ならば「故障有り」を「陽性」とし、「スパムメールかどうか」ならばスパムメールを「陽性」とします。)

F値

アルゴリズムの性能評価のためには「重要なのは1つの数値の指標で評価する事」と言ったにも関わらず、再現率・適合率の2つの指標が出てきてしまいました。

F値は再現率・適合率を合わせていい感じに評価してくれる指標となり、以下で定義されます。

$\text{F値}=\Large\frac{2\cdot\text{再現率}\cdot\text{適合率}}{\text{再現率}+\text{適合率}}$

この値を使用すれば、歪んだデータの場合のアルゴリズムを評価することができ、再現率・適合率をバランス良く可能な限り良い値にするために、F値が最もよくなるように閾値を選択する事もできます。

機械学習のデータ

「優れたアルゴリズムを持つ者よりも、より多くのデータを持つ者が勝つ」

と言われており、実際にデータが少ない場合は性能の差があったアルゴリズムが、データが多くなるほど性能の差がなくなる事を示唆する論文があります。

ただし、これには条件があります。

それは、データが問題を解決するための十分な情報を持っている事です。

では、デーが問題を解決するために十分な情報を持っているかをどうやって確かめれば良いでしょうか。

「人間(その問題のエキスパートの人)がそのデータを見て、判定する事が出来るかどうか」というのが有力な検証方法となります。

エキスパートが判定できなければ、データが不十分と考えられ、データを増やしても性能が改善することはあまり期待できません。逆にエキスパートがデータを見て判定できるならば、データが多ければ多いほど、バリアンスも低くなり(過学習も抑えられ)、性能が改善する事が期待できます。

最後に

以上、第6章の後半、「機械学習システム設計」について概要を記載しました。

実務でも分析をしていたので、流石に再現率・適合率などは知っていましたが、「quick-and-dirtyなアルゴリズムで、とりあえずすぐに試せ」というのは、正直、やっていなかったです。(その時点で学習曲線書いたりエラー分析したりはしてなかったです。)

本講座の中でも第6章は実践に当たって有用な情報が多くありました。

機械学習についてある程度知識がある方も、本章だけでも(見るだけなら無料なので)見る事をお勧めします。