ロジスティック回帰をしてみる #alteryx #11 | Alteryx Advent Calendar 2016
こんにちは、小澤です。
当エントリは『Alteyx Advent Calendar 2016』の11日目のエントリです。
今回はロジスティック回帰をAlteryxで行ってみます。
ロジスティック回帰とは
非線形な回帰モデルの一種ですが、出力が0から1の範囲に収まるという性質があるため、分類でよく利用されるものになります。
線形回帰では、目的変数と説明変数の関係をy=ax+bの形式で表しましたが、ロジスティック回帰では
のような関係となります。yを表すax+bがexpの中に入った形になります。 この関数をグラフにするとこのようになります。
グラフの形を見ていただけると分かる通り、ロジスティック回帰ではxが+∞に近づくにつれ、yは1に近づき、-∞に近づくにつれ、yは0に近づいていきます。xに対して、カーブの部分に該当するyの値を確率値としてあわらすことができるのです。 そのため、例えばスパムメールの判定に使ったとすると、スパムメールである確率が何%、そうでない確率が何%のように判断できます。 また、ロジスティック回帰で複数の説明変数がある場合、それぞれがどの程度影響を及ぼしているかを線形回帰に時のようにモデルの数値で判断できるのも強みの一つです。
一般化線形モデルとロジスティック回帰
ロジスティック回帰は上記の式のようにy=ax+bを変形させたような形式になっています。 これは特定の分布に従うような統計モデルに当てはめるためのもので一般化線形モデル(GLM; Geeneralized Linear Model)と呼ばれます。 ロジスティック回帰では、ロジット関数
のような関数になっており、これはオッズ比の対数を取ったものになります。 オッズ比に関する詳細な説明は割愛しますが、上記の式では確率pで起こる事象が発生する場合と発生しない場合の比率(何倍発生しやすい/しづらい)を表しています。
このロジット関数のようなものを一般化線形モデルではリンク関数と呼び、
のように線形回帰でのyの部分をこのリンク関数に当てはめた形式の問題を解くことで、ある事象が発生する確率を二項分布に従う時の統計モデルへの当てはめが可能になっています。 この問題を解くためにロジット関数の逆関数を利用することで「y=」の形式に式を変形させたのが、上記のロジスティック回帰の式になります。 ロジスティック回帰の右辺はシグモイド関数と呼ばれる
の形となるため、式中にこのσを用いて記載することにします。
補足:二項分布とは
確率pである事象が起こり、確率q(q=1-p)で起こらないと試行をn回繰り返した時に何回pが起こるかをあわらす確率分布です。 よく挙げられる例として、コイントスがあります。コイントスでは裏表がそれぞれ1/2で発生するとして、n回コイントスを行うとそのうち何回が表になるかというものです。 下記はp=0.5, n=10とした時の二項分布のグラフです。コイントスで考えると、5回表が出る確率が最も高く、表裏どちらかに回数が偏るほどその確率が低くなることを表しています。
コイントスとの例ですと、この時に以下の2つの条件に従っています。
- 全の試行がp=0.5。すなわち同じ分布したがっている
- i回目のコイントスの結果がi+1回目の結果に影響を与えるなどがなく毎回独立である
この二つの条件を満たしていることをi.i.dであると言ったりします。
補足:逆関数とは
何らかの関数f(x)があるととした時に、もとのxに戻るような関数g(x)のことをf(x)の逆関数と言います。
ロジスティック回帰ではシグモイド関数がロジット関数の逆関数にあたるため、
となり、
に変形されます。
ロジスティック回帰への当てはめ
ロジスティック回帰では主に二値分類を扱います(多項ロジットやOne vs restなどで多値分類を扱うこともできますがここではそちらについては紹介しません)。 各データが二値(Yes or Noなど)として扱われるので、所属するカテゴリCをNoを0、Yesを1といった具合に数値で考えます。 どちらかの一方の値しかとらないので、予測の結果もYesである確率をpとすると、Noである確率は1-pで表すことができます。
線形回帰と同様、ロジスティック回帰でもwの値を求めることで実際の関数を決定します。 これには最尤推定という方法を使います。最尤推定では、与えられたデータのみからそのデータを説明するのに適切なwを決定します。 最尤推定では正解ラベルと予測値の差異が最も小さくなるよう、尤度と呼ばれる値を決めます。 尤度関数では、正解ラベルが1の場合は1である確率、正解ラベルが0の場合は0である確率のみを扱い、各データは独立である前提とすると、それらの掛け算でどれだけ正解に近いか(予測の分布が正解の分布に近いか)を求めます。 ロジスティック回帰の尤度関数は
のようになります。 ここでは各データの正解ラベルCの値がt(t ∈ {0, 1})であるとしています。 これの個々のデータでの計算は
となります。これを工夫すると1つの式で計算することができます。
0乗の値が1になるのを利用し、正解がt=1のデータは1-t=0となり、σ(w^T x)の部分のみ、t=0の時は1-σ(w^T x)の部分のみが残る形式になっています。
これを微分して0になる値を求めればいいのですが、正解ラベルでの確率を求める必要があります。 この式は確率値の掛け算になっています。 確率値の性質上0から1の範囲の値の掛け算となるため、コンピュータで行うのは都合がよくありません。 尤度はwの値を変えた時の大小関係がわかればいいので、足し算に変形でき、x > yの時常に log(x) > log(y)となる対数を利用します。
として、この値を最小化します。
を利用して、E(w)の微分を求めると
となります(途中の計算式は省略しますので、気になる方は計算してみてください)。 求まった値を利用して、下記の計算を収束するまで繰り返すことでwが求まります。
全体の流れをまとめると
- 初期値として適当なwの値を決める
- 各データに対してP(C=t|x)を計算する
- L(w)と∂L/∂wを計算する
- 計算した値を利用してwを更新する
- wが収束していれば終了。していなければ2に戻る
となります。 収束の判定には更新前後での変化の差が一定数以下であるや繰り返し回数が一定以上などを基準にします。
補足:正則化
ここまでの解説に加えて、損失関数には正則化項と言われるものが入る場合があります。 これはどういうものかというと、既存のデータのみに過度に適応してしまう過学習という状態を抑えるためのものになります。 データの量や性質に対して、表現力の高いモデルを使った場合などによく起こり、表現力の高いモデルであるほどデータに対して多くの情報を含められるので、実査には関係無い誤差のようなものまで拾ってしまうことで過学習が起こります。 正則化はそれに対する対策して行われ
のように、wの値が大きくなるほどペナルティを与える項を追加しています。 この正則化項で主に利用されるのはwの各要素の絶対値を足し合わせたL1正則化とwの各要素の2乗の値を足し合わせたL2正則化があります(上記の式はL2正則化)。
このような正則化項がなぜ有効かなどについての説明はここでは割愛しますが、それぞれの特徴として以下のような点が挙げられます。
- L1正則化はwの中の不要な特徴を削るのに利用出来る
- L2正則化は特徴を保持したままwの値に制約を加える
また、この2つを組み合わせるという方法もあります。
Alteryxで利用する
Sample Workflows > Predictive Analytics > 9 Logistic Regression を例にして動かしてみます。
基本的な構造は決定木や線形回帰と同様です。 入力となるデータとLogistic Regression Toolを結び、結果をRenderやBrowseにつなぎます。 出力も線形回帰のものとよく似ています。
「Coefficients:」のテーブルにある「Estimate」という項目で各説明変数がどの程度重要であるかがわかります。 ここにある数値の絶対値が大きいほど強い影響を及ぼしており、符号でプラスの要因かマイナスの要因かがわかります。線形回帰と同様「Pr(> |z|)と合わせてどの程度意味のある値が出ているかの確認もできます。
混同行列を作成してみる
さて、今回は混同行列(Confusion Matrix)を作成してみます。これは
NoFalse PositiveTrue Negative
予測した値 | |||
Yes | No | ||
正解の値 | Yes | True Positive | False Negative |
のようにそれぞれの領域に入る数をカウントするものになります。この表を利用することで様々な評価指標を出すことができます。 ここでは実際に値を出して確かめてみます。
Workflowはこのようになります。
まず、入力となるデータをCreate Samples Toolに入れています。 これはデータを最大で3種類(Estimation, Validation, Holdout)に分けるためのツールです。 機械学習などを行う際は学習データとテストデータを分けて、テストデータの予測精度を計るわけですが、予測精度を向上させるために様々なチューニングなどを何度も繰り返すと、テストデータに対しても過学習してしまうことがあります。そこで、ここではチューニングの際の学習データと確認データ、それに最終的な予測精度を計るためのデータの3つに分けることができます。 今回はチューニングは行わないため、学習につかうEstimationを80%、予測精度の評価につかうValidationを残りの20%を指定しています(Holdoutは0%となります)。
次に学習データをLogistic Regression Toolにつないでいます。 その次に学習したモデルと、テストデータをScore Toolにつなぐことで、予測を行っています。Score ToolにつなげたBrowseを確認すると一番最後に「Score_No」、「Score_Yes」の2カラムが追加されています。これは予測値としてYesである確率とNoである確率になっています。
次にFormula ToolでYes, Noの予測に変換しています。これはスコアが高い方の値を採用しているだけの単純な処理になります。
Select Toolで必要なカラムのみに絞ってBrowseするとこのような結果担っています。
これをSummarize Toolにつないで集計します。
この段階で目的の情報にたどり着いたのですが、最後にCross Tab Toolを使って上記の混同行列の形に体裁を整えます。
Yes, Noの並びが逆になってしまっていますが、これで混同行列の形になりました。最後にこの並びをSort ToolとSelect Toolで入れ替えています。
混同行列の結果を見る
この後の説明で必要になるため、混同行列の表を再掲しておきます。
NoFP(False Positive)TN(True Negative)
予測した値 | |||
Yes | No | ||
正解の値 | Yes | TP(True Positive) | FN(False Negative) |
正解率
正解率(Accuracy)は全データのうち、予測が正解だったものの割合になります。
で計算することができ、今回の場合ですと
となり、およそ62%正解していることになります。 YesかNoの二値分類のため適当に答えた際の正解率が50%ととなるため、それよりも正解する学習ができていることを意味します。 また、この「適当に答えた時の正解率50%」のような比較対象となるものをベースラインと呼びます。通常は何らかの基準(今回のようなランダム解答や他のアルゴリズムでの結果など)を設けることでどのくらい今までより良くなっている(あるいは悪くなっている)を比較することが可能になります。
精度
精度(Precision)とは、予測によってYesと判断されたもののうち正解がYesであったものの割合となります。
で計算され、今回の場合ですと
となり、Yesと予測したもののうちおよそ55%が本当にYesであるということになります。
再現率
再現率(Recall)は正解がYesのうち、Yesと予測できた割合にになります。
で計算され、今回の場合ですと
となり、Yesであるもののうち、およそ70%はこのモデルで拾えていることになります。
F値
さて、このように複数の指標があるとどれを使えばいいかわからなくなります。
それぞれの指標には特徴があり、例えば正解率はわかりやすい指標ですが有効でない場面としてYesとNoの割合が極端に異なっている場合などが挙げられます。 例えばYesが99個、Noが1個の学習データがあったとして、この場合問答無用でYesを予測するモデルを作成すれば正解率は99%になります。
精度と再現率はトレードオフの関係にあり、どちらかを増やせばどちらが減るという状況が起きます。 これは、Yesと答える割合を高くすれば、本当にYesであるものをより多く含むようになり再現率は上がりますが、一方でその中に本当はNoであるものも多く含むため精度は下がる。Yesの割合を低くした場合はその逆になり。といった具合です。 この2つは、多少間違えることは多くても取りこぼしがないようにしたいですとか、取りこぼしはあっても間違うと問題になるといった具合に実際に適用させたい場面によって使い分けます。
この時に精度と再現率で適度にバランスをとった指標として、F値というものがあります。これは精度と再現率の調和平均で
で計算されます。今回の場合ですと
となり、およそ0.62あたりの数値になります。
どの値を使えば良いか
では、結局のところどの値を使えば良いのでしょうか? 特に問題がなければとりあえずF値を使っておけばバランスのとれた値での評価値となります。
精度や再現率はどちらのかの値がより重要になる場面があります。 例えば最終的に目視での確認をするのであれば、精度は多少低くても再現率が高いモデルであれば全数チェックをしなくてもある程度機械的に数を減らした中から人間による最終チェックを行うものをようにすることで負担を減らすことができます。 一方、スパムメールのようなものを考えると、スパムメールがある程度含まれてしまうよりも、大事なメールを誤ってスパムと判定しないほうが重要でしょう。この場合、再現率を落としてでも精度の高いモデルにするということが考えられます。
このような精度と再現率の調整は、今回のロジスティック回帰のような場合ですと、Yesと判定する確率が何%以上がYesと予測したかという調整で行えます。 今回は、YesとNoの確率それぞれで高い方だったので50%を基準としていますが、例えば30%以上とすれば再現率を上げるととができ、80%とすれば精度を上げることができるといった感じです。 また、0%から100%まで少しずつ値を変えていきその時の評価値を確認する評価方法もあります。 こちらの詳細を知りたい方は、ROC曲線やAUCといった用語で調べてみてください。
終わりに
Alteryxでロジスティック回帰を行ってみました。 数学的な解説の部分は難しいと感じられた方もいるかもしれませんが、使ってみるだけであれば非常に簡単であることもご理解いただけたかと思います。 こういった機械学習につながる手法は他にもたくさんあり、数式からそれぞれがどのような特徴を持つのかを理解できれば強みにもなりますが、まずは動かしてみることでその動作を見てみるというのもいいかと思います。
明日12日目は大場の『Automation アドオンのご紹介』の予定です。明日もお楽しみに!
参考
- Machine Learning(Coursera)
- データ解析のための統計モデリング入門
- オンライン機械学習(MLPシリーズ)
- 機械学習 はじめよう 第18回 ロジスティック回帰
- 機械学習 はじめよう 第18回 ロジスティック回帰の学習
- 混同しやすい混同行列