判別分析:フィッシャーの判別は分散分析のF値の最大化だった【第25回】

はじめに

第23章は判別分析です。前回の主成分分析でマハラノビス距離と多変量正規分布を扱ったので、その道具がそのまま効く回になります。

この章に入る前、私はひとつ引っかかっていることがありました。第18回のロジスティック回帰と、目的が同じに見えるのです。どちらも「この人は継続するか解約するか」という0か1かを予測します。同じ問題に2つの道具があるなら、どちらを使えばいいのか。前提が違うのか、精度が違うのか。

もうひとつ、フィッシャーの線形判別について「群間分散を群内分散で割った値を最大にする」という説明を聞いて、それは第20回の分散分析のF値と同じ形ではないかと思っていました。分子が群間、分母が群内。形がそっくりです。偶然なのか、それとも本当に同じものなのか。

手を動かしてみたら、同じものでした。 しかも定数倍の関係が小数10桁まで一致します。フィッシャーの線形判別は、要するに「射影したあとのF値がいちばん大きくなる向きを探す」手続きでした。第20回で「差があるかを検定する」ために使った量を、今回は「最もよく分かれる方向を探す」目的関数として使い回している。同じ量の別の使い方だったわけです。

そしてこの章でいちばん怖かったのは、誤判別率の話です。2つの群をまったく同じ乱数発生器から作って(つまり原理的に判別が不可能なデータで)判別ルールを組んだところ、変数を18個入れると誤判別率が0.24%と出ました。「99.8%の精度で判別できます」と報告してしまう状態です。真の答えは50%、つまりコイン投げと同じです。

この記事では、通説を検証して自分の実測の読み方を間違えた箇所も記録します。「線形判別分析は外れ値に弱い」という話を確かめたら、ロジスティック回帰も崩れたので「差はない」と結論しかけたのですが、それは両方が壊れきって差を測れない領域の数値でした。もうひとつ「線形判別分析のほうが効率がよい」という話は正しいのですが、差が出る条件がかなり限定的でした。

いつものように、出てくる数値はすべて自分で計算し、理論値と突き合わせています。

この回で扱う用語

用語読み・意味
判別分析Discriminant Analysis。既にグループが分かっているデータから、グループ分けのルールを作る手法
Group / Class。分類したいグループ。この記事では「継続」「解約」の2群
線形判別関数Linear Discriminant Function。z=w1x1++wpxp+cz = w_1x_1 + \dots + w_px_p + c の形の式。符号で群を決める
判別得点線形判別関数に実際の値を入れて出てきた数 zz
LDALinear Discriminant Analysis=線形判別分析。境界が直線(超平面)になるもの
QDAQuadratic Discriminant Analysis=2次判別分析。境界が2次曲線になるもの
マハラノビス距離Mahalanobis Distance。散らばりで割ってから測る距離。(xμ)S1(xμ)\sqrt{(x-\mu)^\top S^{-1}(x-\mu)}
プールした共分散行列群ごとの散らばりをまとめて1つに推定した分散共分散行列。群内共分散行列とも
ベイズ判別事前確率と誤判別コストを考慮して、損失が最小になるように割り当てる方式
事前確率Prior Probability。データを見る前の「この群である割合」。有病率などがこれ
見かけの誤判別率Apparent Error Rate。ルールを作ったのと同じデータで測った誤判別率。楽観的に偏る
ホールドアウト法データを学習用と評価用に分け、評価用だけで誤判別率を測る方法
交差確認法Cross Validation。分割と評価を繰り返して平均する方法。交差検証とも
LOOLeave-One-Out=1個抜き。1件だけ抜いて残りで学習し、抜いた1件を当てる交差確認法
Wilks の Λ\Lambdaウィルクスのラムダ。W/T\lvert W \rvert / \lvert T \rvert。群がどれだけ分かれているかの指標。0に近いほどよい
Hotelling の T2T^2ホテリングのT2乗。2群の平均が等しいかを多変量で検定する統計量
SVMSupport Vector Machine=サポートベクターマシン。マージンを最大にして境界を引く手法

困りごと:グループ分けのルールが欲しい

有料会員が10人います。過去のデータから、5人は継続し、5人は解約したと分かっています。手元にあるのは2つの数字です。

  • x1x_1 = その月のログイン日数
  • x2x_2 = 使った機能の数

やりたいのは、新しい会員が来たときに「この人は解約しそうか」を判定するルールを作ることです。すでに答えが分かっている10人のデータから、判定式を逆算したい。これが判別分析の目的です。

会員ログイン日数 x1x_1機能の数 x2x_2結果
A205継続
B226継続
C184継続
D246継続
E164継続
F124解約
G145解約
H103解約
I165解約
J83解約

継続群の平均は (20,5)(20, 5)、解約群の平均は (12,4)(12, 4) です。数字を眺めると「ログイン日数が多ければ継続」で済みそうに見えます。ところが、それではうまくいきません。

判別分析の困りごとを示す3枚の散布図。左は継続5人(青丸)と解約5人(赤四角)のデータのみ。中央はログイン日数16日で縦に切った境界線で、(16,4)の継続者と(16,5)の解約者が同じ側に入ってしまうことを矢印で示している。右は斜めの境界線で10人全員が正しく分かれている

真ん中の図を見てください。ログイン日数だけで縦に切ると、会員E(16日・機能4個・継続)と会員I(16日・機能5個・解約)が必ず同じ側に入ります。 ログイン日数が同じなので、その1変数では区別できません。どこに線を引いても、このどちらかを間違えます。

右の図のように斜めに切ると、10人全員が正しく分かれます。判別分析は、この「斜めの線」をデータから機械的に決める手続きです。

ここで注意しておきたいのは、この問題設定が第18回のロジスティック回帰とまったく同じだということです。0か1かを予測したい。同じ問題に2つの道具が用意されている理由は、この記事の後半で扱います。


線形判別関数を作ってみる

線形判別関数は次の形です。

z(x)=w1x1+w2x2+cz(x) = w_1 x_1 + w_2 x_2 + c

z>0z > 0 なら継続、z<0z < 0 なら解約と判定します。決めるべきは重み w1,w2w_1, w_2 と切片 cc です。

結論の式を先に出すと、こうなります。

w=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2)

xˉ1,xˉ2\bar{x}_1, \bar{x}_2 は2群の平均ベクトル、SSプールした共分散行列(群ごとの散らばりをまとめて推定したもの)です。

この式の気持ちは後で説明します。まず数字を入れてみます。この記事の10人のデータは、計算がすべて整数になるように作りました。

プールした共分散行列

群ごとに「平均からのずれ」の積和を計算して足し、ngn - g(標本数 − 群の数 = 102=810 - 2 = 8)で割ります。

W=gig(xixˉg)(xixˉg)=(8024248)W = \sum_{g}\sum_{i \in g} (x_i - \bar{x}_g)(x_i - \bar{x}_g)^\top = \begin{pmatrix} 80 & 24 \\ 24 & 8 \end{pmatrix} S=Wng=18(8024248)=(10331)S = \frac{W}{n-g} = \frac{1}{8}\begin{pmatrix} 80 & 24 \\ 24 & 8 \end{pmatrix} = \begin{pmatrix} 10 & 3 \\ 3 & 1 \end{pmatrix}

この行列の行列式は 10×13×3=110 \times 1 - 3 \times 3 = 1 です。行列式が1なので、逆行列も整数になります。

S1=11(13310)=(13310)S^{-1} = \frac{1}{1}\begin{pmatrix} 1 & -3 \\ -3 & 10 \end{pmatrix} = \begin{pmatrix} 1 & -3 \\ -3 & 10 \end{pmatrix}

重みベクトル

平均の差は xˉ1xˉ2=(20,5)(12,4)=(8,1)\bar{x}_1 - \bar{x}_2 = (20, 5) - (12, 4) = (8, 1) です。

w=S1(81)=(13310)(81)=(8324+10)=(514)w = S^{-1}\begin{pmatrix} 8 \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & -3 \\ -3 & 10 \end{pmatrix}\begin{pmatrix} 8 \\ 1 \end{pmatrix} = \begin{pmatrix} 8 - 3 \\ -24 + 10 \end{pmatrix} = \begin{pmatrix} 5 \\ -14 \end{pmatrix}

切片は2群の平均の中点で z=0z = 0 になるように決めます。中点は ((20+12)/2,(5+4)/2)=(16,4.5)\big((20+12)/2, (5+4)/2\big) = (16, 4.5) なので、

c=(16×5+4.5×(14))=(8063)=17c = -(16 \times 5 + 4.5 \times (-14)) = -(80 - 63) = -17

判別関数が出ました。

z=5x114x217z = 5x_1 - 14x_2 - 17

10人に当てはめると次のようになります。

会員x1x_1x2x_2z=5x114x217z = 5x_1 - 14x_2 - 17判定実際
A205+13+13継続継続 ○
B226+9+9継続継続 ○
C184+17+17継続継続 ○
D246+19+19継続継続 ○
E164+7+7継続継続 ○
F12413-13解約解約 ○
G14517-17解約解約 ○
H1039-9解約解約 ○
I1657-7解約解約 ○
J8319-19解約解約 ○

10人全員が正しく分類されました。1変数では区別できなかった会員E(+7+7)と会員I(7-7)も、符号がきれいに分かれています。

係数の符号が「逆」に見える問題

ここで手が止まりました。機能の数 x2x_2 の係数が 14-14、つまりマイナスです。

ところがデータを見ると、機能の数の平均は継続群が5個、解約群が4個。継続群のほうが多いのです。多いほうが継続なのに、係数がマイナスとはどういうことでしょうか。

これは第16回の偏回帰係数とまったく同じ構造です。この係数は「ログイン日数を固定したときの機能の数の効き方」を表しています。

会員EとIで確かめられます。どちらもログイン日数は16日で同じ。違うのは機能の数(4個と5個)だけです。そして機能が多い会員Iのほうが解約している。つまりログイン日数が同じなら、機能を多く触っている人のほうが解約寄り、という関係がデータの中にあります。

解釈をつけるなら「たいして使っていないのにいろいろな機能を触り回っている人は、目的に合わなくて探し回っている状態かもしれない」といった読み方になります。単独で見た平均の大小と、他の変数を固定したときの効き方は別物である、という第16回の教訓がここでも効いています。


フィッシャーの線形判別は何を最大化しているのか

さて、w=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2) という式はどこから来たのでしょうか。フィッシャーの考え方から導けます。

発想:2次元を1次元に潰す

2変数のままだと「分かれているか」を判断しづらい。そこで1本の直線に射影して1次元に潰します。 潰したあとで2群がきれいに離れていれば、その方向が良い方向です。

フィッシャーの線形判別を示す3枚組の図。左は2群の平均を結ぶ方向に射影した散布図で群間÷群内が1.146。中央はフィッシャーの判別方向に射影した散布図で3.775。右は射影後の1次元のヒストグラムで、方向Aは2群が重なり方向Bは離れている

左の図が、素直な発想です。2群の平均を結ぶ向きに射影する。中心が離れている方向なのだから、それが一番よく分かれそうに思えます。

ところが右の図を見ると、この方向(塗りつぶしのヒストグラム)では2群が大きく重なっています。一方、中央の図の方向(線のヒストグラム)ではきれいに離れています。平均を結ぶ向きが最良ではないのです。

何を測って良し悪しを決めるか

良い方向とは何でしょうか。図を見ながら考えると、2つの条件が要ります。

  1. 2群の中心が離れていること(群間のばらつきが大きい)
  2. 各群の中でまとまっていること(群内のばらつきが小さい)

中心が離れていても、各群がだらしなく広がっていたら重なってしまいます。逆に各群がぎゅっと固まっていれば、中心が少ししか離れていなくても分かれます。この2つを同時に扱うには、割り算にすればよい。

分離の良さ=群間のばらつき群内のばらつき\text{分離の良さ} = \frac{\text{群間のばらつき}}{\text{群内のばらつき}}

これがフィッシャーの判別基準です。上の3枚組の図に書いてある数字がこれで、方向Aは 1.146、方向Bは 3.775。方向Bは3.3倍よいという意味です。

方向 uu に射影したときの値を式で書くと、群間変動 BB と群内変動 WW を挟んで次の形になります。

J(u)=uBuuWuJ(u) = \frac{u^\top B \, u}{u^\top W \, u}

これを最大にする uuW1(xˉ1xˉ2)W^{-1}(\bar{x}_1 - \bar{x}_2) に比例する、というのがフィッシャーの結果です。WWngn-g で割ったものが SS なので、定数倍の違いを無視すれば冒頭の式と同じになります(判別は符号だけで決まるので、ww の定数倍は結果に影響しません)。

そしてこれは分散分析のF値だった

ここが今回いちばん確かめたかった点です。「群間÷群内」という形は、第20回の分散分析のF値とそっくりです。

フィッシャーの基準と分散分析のF値の一致を示す2枚の図。左はあらゆる方向で群間平方和÷群内平方和を測った曲線で、最大値がフィッシャー方向と一致。右は同じ曲線の縦軸をn-2倍したもので、射影後データの分散分析のF値になり形が完全に同じ

左の図は、あらゆる方向(0度から180度まで)について「群間平方和÷群内平方和」を計算したものです。山のピークは139度で、フィッシャーの判別方向と一致しています。素直な発想だった「平均を結ぶ向き」は0度(この設定では平均差が x1x_1 方向だけなので)で、ピークから大きく外れています。

右の図は、同じ計算の縦軸を (n2)(n-2) 倍しただけです。すると、射影後のデータを一元配置分散分析にかけたF値になります。2群の一元配置分散分析では自由度が (1,n2)(1, n-2) なので、

F=群間平方和/1群内平方和/(n2)=群間平方和群内平方和×(n2)F = \frac{\text{群間平方和} / 1}{\text{群内平方和} / (n-2)} = \frac{\text{群間平方和}}{\text{群内平方和}} \times (n-2)

(n2)(n-2) は方向によらない定数です。だから「群間÷群内を最大にする方向」と「F値を最大にする方向」は完全に同一になります。

実際に数値で確認しました。ここまでの2枚の図と同じデータ(各群80人、合計160人)で、フィッシャー方向の分離比は 3.775252、(n2)=158(n-2) = 158 を掛けると 596.489833。射影後のデータで一元配置分散分析を計算したF値も 596.489833 で、差は 1.1×10121.1 \times 10^{-12}(浮動小数点の丸め誤差の範囲)でした。

任意の方向でも成立します。

射影する方向群間÷群内射影後のF値比 × (n2)(n-2)
フィッシャー方向(139度)3.775252596.489833596.489833
x1x_1(1,0)(1, 0)1.145507180.990040180.990040
x2x_2(0,1)(0, 1)0.0024730.3907500.390750
対角 (1,1)/2(1,1)/\sqrt{2}0.35153255.54212955.542129
逆対角 (1,1)/2(1,-1)/\sqrt{2}3.568547563.830465563.830465

どの方向でも一致します。フィッシャーの線形判別と分散分析は、同じ量を違う目的で使っているだけでした。

  • 第20回(分散分析)… 群間÷群内を計算して、F分布と比べて検定する
  • 第25回(判別分析)… 群間÷群内が最大になる方向を探す

前者はF値を「読む」、後者はF値を「最大化する」。同じ量に対する2つの態度です。この接続が見えたのが、今回いちばんの収穫でした。

群が3つ以上のとき

補足として、群が3つ以上ある場合は射影する方向が1本では足りません。W1BW^{-1}B の固有値問題を解いて、min(g1,p)\min(g-1, p) 本の判別方向を取り出します(gg は群の数、pp は変数の数)。2群なら g1=1g-1=1 なので方向は1本で、上の式で終わりです。3群なら2本になり、その2本で張る平面にデータを落として散布図を描く、という使い方をします。前回の主成分分析で固有値分解を扱ったので、道具立ては同じです。

ただし目的が違います。主成分分析は群のラベルを使わず「全体のばらつきが大きい方向」を探しました。判別分析はラベルを使って「群が分かれる方向」を探します。同じ固有値分解でも、BBWW という2つの行列を持ち込むところが違いです。

判別そのものを多群でどう行うかは、この記事の後半「3群以上に拡張する」の節で扱います。


なぜマハラノビス距離なのか

判別のもうひとつの説明の仕方があります。2つの群の中心のうち、近いほうに割り当てる。 これなら直感的です。

ただし「近い」の測り方が問題になります。素直に定規で測った距離(ユークリッド距離)ではうまくいきません。

まず距離の等距離線を見る

距離の定義そのものを図にすると、違いが一目で分かります。

マハラノビス距離とユークリッド距離の等距離線を比較した3枚組の図。左はユークリッド距離の等距離線が真円でデータの楕円形を無視している。中央はマハラノビス距離の等距離線がデータの散らばりに沿った楕円。右は同じユークリッド距離2.50の2点PとQでマハラノビス距離が1.84と6.45になることを示す

灰色の点がデータの散らばりです。斜めに細長く伸びています(2変数に強い正の相関がある状態)。

左の図がユークリッド距離の等距離線です。真円で、データの形をまったく見ていません。中央がマハラノビス距離の等距離線で、データの散らばりに沿った楕円になっています。

右の図に注目してください。点Pと点Qは、原点からのユークリッド距離がどちらもちょうど 2.50 です。同じ円の上に乗っています。ところがマハラノビス距離は 1.84 と 6.45 で、3.51倍も違います。

3.51倍の出どころ

この数字は手で確かめられます。共分散行列を

Σ=(10.850.851)\Sigma = \begin{pmatrix} 1 & 0.85 \\ 0.85 & 1 \end{pmatrix}

とすると、固有値は 1+0.85=1.851 + 0.85 = 1.8510.85=0.151 - 0.85 = 0.15 です(対称行列の固有値分解。前回の主成分分析で扱った計算です)。

  • データが伸びている方向の標準偏差 … 1.85=1.360\sqrt{1.85} = 1.360
  • データがつぶれている方向の標準偏差 … 0.15=0.387\sqrt{0.15} = 0.387

点Pは伸びている方向(45度)にあり、点Qはつぶれている方向(45-45度)にあります。同じ長さ 2.50 の矢印でも、割る数が違います。

2.501.360=1.838,2.500.387=6.455\frac{2.50}{1.360} = 1.838, \qquad \frac{2.50}{0.387} = 6.455

比を取ると 1.85/0.15=3.512\sqrt{1.85/0.15} = 3.512。図の 3.51 と一致します。

主軸(固有ベクトル)方向に限れば、マハラノビス距離は「その方向の標準偏差いくつ分か」を測っていると読めます。つぶれている方向に 2.50 も離れているのは「データが行かない方向にそんなに行った」ということなので、異常さの度合いが大きい。だから遠い、と評価されます。

「主軸方向に限れば」と条件を付けたのは、これが一般の方向では成り立たないからです。上の点P・Qはたまたま主軸上(45度と 45-45度)に取ったので単純な割り算になりましたが、たとえば0度方向では、uΣ1u=1.898\sqrt{u^\top \Sigma^{-1} u} = 1.898 に対して「その方向の標準偏差の逆数」は 1/uΣu=1.0001/\sqrt{u^\top \Sigma u} = 1.000 で、約1.9倍ずれます。

一般の方向まで含めて正確に言うなら、Σ1/2\Sigma^{-1/2} を掛けてデータを等方(真円)に変形してから、ユークリッド距離で測ったものがマハラノビス距離です。楕円を円に引き伸ばす座標変換をしてから普通に測る、という理解が厳密です。

ユークリッド距離だと実際に間違える

抽象的な話ではなく、最初の10人のデータで実害が出ます。

ユークリッド距離とマハラノビス距離で判別した結果の比較。左のユークリッド距離では境界がほぼ垂直になり2人を誤判別。右のマハラノビス距離では群内の散らばりの傾きに沿って境界が斜めになり誤判別0人

破線の楕円が各群の散らばり(1標準偏差)です。斜めに傾いています。

左はユークリッド距離で「近いほうに割り当てる」を実行した結果です。境界がほぼ垂直になり、会員E(16, 4)と会員I(16, 5)の2人を誤判別しました。ユークリッド距離は各群の楕円の傾きを無視するので、境界が2群の平均を結ぶ線と直交する向きに引かれてしまいます。

右はマハラノビス距離を使った結果です。境界が群内の散らばりの傾きに沿って斜めになり、誤判別0人になりました。

同じデータ、同じ「近いほうに割り当てる」という規則です。違いは距離の定義だけで、結果が変わりました。

線形判別関数との関係

ここで気持ちのよい事実があります。「マハラノビス距離が小さいほうに割り当てる」と「線形判別関数の符号で決める」は同じ判定になります。

2つの群のマハラノビス距離の2乗の差を取ってみます。

d12d22=(xxˉ1)S1(xxˉ1)(xxˉ2)S1(xxˉ2)d_1^2 - d_2^2 = (x - \bar{x}_1)^\top S^{-1}(x - \bar{x}_1) - (x - \bar{x}_2)^\top S^{-1}(x - \bar{x}_2)

展開すると xS1xx^\top S^{-1} x の項が両方に同じ形で現れて消えます。残るのは xx について1次の項と定数項だけです。

d12d22=2xS1(xˉ1xˉ2)+(xˉ1S1xˉ1xˉ2S1xˉ2)d_1^2 - d_2^2 = -2x^\top S^{-1}(\bar{x}_1 - \bar{x}_2) + (\bar{x}_1^\top S^{-1}\bar{x}_1 - \bar{x}_2^\top S^{-1}\bar{x}_2)

2-2 で割って符号を整えると、xS1(xˉ1xˉ2)+定数x^\top S^{-1}(\bar{x}_1 - \bar{x}_2) + \text{定数} という形になります。w=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2) を思い出すと、これは wx+cw^\top x + c そのものです。

共通の共分散行列を使うから2次の項が消えて、境界が直線になる。 これが「線形」判別と呼ばれる理由です。実際に検証コードでも、テスト点500個すべてで両者の判定が一致しました。後で扱う2次判別では、群ごとに共分散行列が違うため2次の項が消えず、境界が曲線になります。


「共分散行列が全群で同じ」とはどういう仮定なのか

ここまで「共通の共分散行列」と繰り返してきましたが、これが実際のデータで何を仮定していることになるのか、私は最初つかめていませんでした。式の上では SS が1つだけという話ですが、現実の言葉に直すと何を主張しているのでしょうか。

答えは「群によって中心はズレるが、ばらつき方の癖は同じ」です。身長と体重で男女を判別する例で見ます。

男性女性同じか
平均172cm, 68kg159cm, 53kg違う
身長の標準偏差約6cm約6cm同じ
体重の標準偏差約8kg約8kg同じ
身長と体重の相関約0.6約0.6同じ

つまり「背が高い人は重い傾向がある」という関係の強さが、男女で同程度だと仮定しています。中心の位置が違うのは構いません(むしろそれが判別の材料です)。ばらつき方だけが共通という主張です。

共通の共分散行列のイメージを示す3枚組の図。左は男性と女性の身長体重の散布図で、1σ楕円と2σ楕円の形・傾き・大きさが同じで位置だけがずれている。中央は女性の楕円を平均の差だけ平行移動すると男性の楕円にぴったり重なることを示す。右は新入社員と役員の年収の例で、役員のばらつきが大きく楕円の大きさが違うため平行移動しても重ならない

図の見どころは真ん中です。女性の楕円を平均の差の分だけ平行移動すると、男性の楕円にぴったり重なります。 幾何的に言えばこうなります。

共通の共分散行列 = 全群の等確率楕円が「合同」(平行移動だけで重なる)

  • 平均が違う … 楕円の位置が違う(仮定違反ではない)
  • 共分散行列が違う … 楕円の形・大きさ・傾きが違う(これが仮定違反)

右の図が崩れる例です。新入社員と役員の年収を比べると、役員は個人差が桁違いに大きいので楕円の大きさが違い、平行移動しても重なりません。

崩れる3つの典型パターン

崩れ方には型があり、それぞれ境界の形と対応します。

崩れ方実務の例境界の形
ばらつきの大きさが違う新入社員 vs 役員の年収(役員は個人差が大きい)/既存顧客 vs 新規顧客楕円・円
相関の符号が違う健康な人は「運動量が増えると体重が減る」、回復期の患者は「運動量が増えると体重も増える」双曲線
片方の群だけ特定の変数が固定的正常な製造ラインは温度が一定、異常ラインは温度が暴れる放物線・平行2直線

実務で「同じ」と言えるのはどんなときか

目安として、同じ母集団を条件で切り分けた群なら成り立ちやすいです(男女、地域、購入経路など)。測定の仕組みが共通なので、測定誤差の構造も似通ります。

逆に階層や規模が違う群では崩れがちです(新人と役員、中小企業と大企業、健常者と重症患者)。判断のコツは「片方の群だけ極端な人が混じりうるか」を考えることです。混じりうるなら、その群の分散が大きくなって仮定が崩れます。

確認する手順としては、群ごとに標準偏差と相関行列を出して並べるのが手軽です。検定(Box のM検定)もありますが、標本が大きいと些細な違いでも有意になるので機械的な採用は勧められません。後の節で扱うように、交差確認法で線形と2次を両方測って比べるのがいちばん確実です。


境界が「直線」と「2次曲線」に分かれる仕組み

前の節で「2次の項が消えるから直線になる」と書きました。ここは判別分析の構造の核心で、試験でも問われるところなので、1次元の例で丁寧に追ってみます。

出発点は、群 gg に属する見込み(対数尤度)です。

dg(x)=12logSg12(xμg)Sg1(xμg)d_g(x) = -\frac{1}{2}\log \lvert S_g \rvert - \frac{1}{2}(x-\mu_g)^\top S_g^{-1}(x-\mu_g)

判別は「d0(x)d_0(x)d1(x)d_1(x) のどちらが大きいか」で決めます。だから境界は差がゼロになる場所です。この引き算で何が起きるかが全てでした。

分散が同じとき:x2x^2 が打ち消し合う

1次元で書くと、分母が同じ 2σ22\sigma^2 になるのがポイントです。

(xμ0)22σ2+(xμ1)22σ2=(x22μ0x+μ02)+(x22μ1x+μ12)2σ2-\frac{(x-\mu_0)^2}{2\sigma^2} + \frac{(x-\mu_1)^2}{2\sigma^2} = \frac{-(x^2 - 2\mu_0 x + \mu_0^2) + (x^2 - 2\mu_1 x + \mu_1^2)}{2\sigma^2}

分子の x2x^2 に注目すると x2+x2=0-x^2 + x^2 = 0。消えます。

=2(μ0μ1)x+μ12μ022σ2x の1次式= \frac{2(\mu_0 - \mu_1)x + \mu_1^2 - \mu_0^2}{2\sigma^2} \quad \leftarrow x \text{ の1次式}

1次式がゼロになる点は1個だけμ0=0,μ1=4\mu_0=0, \mu_1=4 なら x=2x=2(中点)です。log\log の項も σ\sigma が共通なので引き算で消えています。

分散が違うとき:x2x^2 が生き残る

分母が揃わないので、係数が打ち消し合いません。

x22σ02+x22σ12=x22(1σ121σ02)0-\frac{x^2}{2\sigma_0^2} + \frac{x^2}{2\sigma_1^2} = \frac{x^2}{2}\left(\frac{1}{\sigma_1^2} - \frac{1}{\sigma_0^2}\right) \ne 0

x2x^2 が残るので境界の式は2次方程式になり、解は最大2個。さらに 12logSg-\frac{1}{2}\log \lvert S_g \rvert も消えずに残ります(広がった群にペナルティを与える役割です)。

1次元での境界の個数の違いを示す4枚組の図。上段は分布で、左は分散が同じ場合に交点が1個(x=2)、右は分散が違う場合に交点が2個(x=±1.21)で群1の領域が左右に分断される。下段はスコアの差で、左は直線なので0を横切るのが1回、右は放物線なので0を横切るのが2回

下段を見てください。スコアの差が直線か放物線かという違いが、そのまま境界の個数になっています。

右上の図で起きていることが「2次」の実質です。群0 = N(0,12)N(0, 1^2)、群1 = N(0,1.52)N(0, 1.5^2) という平均が同じで分散だけ違う設定で、判定はこうなります。

xx群0のスコア群1のスコア判定
4-48.000-8.0003.961-3.961群1(外側)
2-22.000-2.0001.294-1.294群1(外側)
000.0000.0000.405-0.405群0(内側)
222.000-2.0001.294-1.294群1(外側)
448.000-8.0003.961-3.961群1(外側)

群0と判定されるのは 1.208<x<1.208-1.208 < x < 1.208 という「区間」で、群1は左右2つに分断されます。これは1本の線では絶対に表せません。

中央に固まっていたら散らばりの小さい群、外側にあったら散らばりの大きい群、という理にかなった判定です。そして平均が同じでも分散の違いだけで判別できている点にも注目してください。線形判別だと μ0=μ1\mu_0 = \mu_1 のとき w=S1(μ0μ1)=0w = S^{-1}(\mu_0-\mu_1) = 0 となって判別不能ですが、2次判別なら分けられます。

2次元だと「2次曲線」の種類が見える

多次元では x2x^2 の項が xQxx^\top Q x という行列を挟んだ形になります。

Q=12(S11S01)Q = \frac{1}{2}\left(S_1^{-1} - S_0^{-1}\right)

S0=S1S_0 = S_1 なら Q=0Q = 0 で2次の項が消えて直線。違えば Q0Q \ne 0 で、QQ の固有値の符号が境界の形を決めます。高校で習う2次曲線の分類とまったく同じです。

2次元での境界の形4種類を示す図。左から共通の共分散行列で直線、分散の大きさが違って円、楕円の向きが違って双曲線、x1方向だけ分散が違って平行な2直線。各パネルに2次の項の固有値を表示

QQ の固有値境界の形起きている状況
両方 0直線(超平面)共分散行列が共通=線形判別
同符号楕円・円片方の群が全方向に広い(内側と外側で分ける)
異符号双曲線楕円の向きが違う(方向ごとに優劣が逆転)
片方が 0放物線・平行2直線ある方向だけ分散が同じ

4枚目を手で解いて確認しました。群0 = μ(0,0)\mu(0,0)S0=diag(1,4)S_0=\mathrm{diag}(1,4)、群1 = μ(2,0)\mu(2,0)S1=diag(3.6,4)S_1=\mathrm{diag}(3.6,4) のとき、x2x_2 方向は分散も平均も両群で同じなので、x2x_2 の2次項も1次項も完全に打ち消し合います。すると境界は x1x_1 だけの2次方程式になり、x2x_2 を含まない ── つまり縦の直線です(分散だけが同じで平均が違うと、x2x_2 の1次項が残って傾いた放物線になります)。解くと x1=2.745x_1 = -2.7451.2071.207 の2本で、図の縦線の位置と一致しました。

ここから引っかけポイントが出てきます。「2次判別の境界は必ず曲線」ではありません。 固有値に0が混じると平行2直線になります。「2次式で表される図形」であって、必ず曲がるわけではない ── これが正確な理解です。


事前確率を考える:これは第2回のベイズの定理そのもの

ここまでは「2群が同じくらいの割合で存在する」という暗黙の前提で話してきました。しかし現実には偏りがあります。

有病率1%の病気の検査を考えます。検査値 xx は、健常者なら N(0,1)N(0, 1)、病気の人なら N(3,1)N(3, 1) に従うとします。分布の形だけ見れば、中点の 1.5 で切るのが自然に思えます。

事前確率が判別境界を動かす様子を示す3枚組の図。左は健常と病気の分布が対称に見え中点1.5で切るのが自然に見える。中央は事前確率を掛けると山の高さが99倍違い正しい境界が3.03になることを対数目盛で示す。右は理論値の棒グラフで陽性的中率が12.36%から80.19%に上がり、逆に感度が93.32%から48.74%に下がる

真ん中の図が答えです。事前確率(健常0.99、病気0.01)を掛けると、山の高さが99倍違います。 2本の曲線の交点は中点から大きくずれ、x=3.03x = 3.03 になります。

式を見ると足し算になっている

なぜ足し算なのかを確認します。第2回のベイズの定理はこうでした。

P(x)f(x)×P()P(\text{群} \mid x) \propto f(x \mid \text{群}) \times P(\text{群})

事後確率は、尤度と事前確率の掛け算に比例します。判別は「事後確率が大きいほうに割り当てる」だけです。両辺の対数を取ると、掛け算が足し算になります。

logP(gx)=logf(xg)データから+logP(g)事前確率+共通項\log P(\text{群}_g \mid x) = \underbrace{\log f(x \mid \text{群}_g)}_{\text{データから}} + \underbrace{\log P(\text{群}_g)}_{\text{事前確率}} + \text{共通項}

多変量正規分布の密度を入れると、第1項が 12(xμg)S1(xμg)-\frac{1}{2}(x-\mu_g)^\top S^{-1}(x-\mu_g)、つまりマハラノビス距離の2乗の 1/2-1/2になります(正規分布の指数部分がそのままマハラノビス距離だからです。ここは前回の多変量正規分布の話が直接効きます)。

2群の差を取ると、前節と同じように2次の項が消えて、

z(x)=wx+c+logπ1π2z(x) = w^\top x + c + \log\frac{\pi_1}{\pi_2}

という形になります。事前確率は log\log の項として切片に足されるだけです。1次元の例で境界を書くと、

境界=μ1+μ221μ1μ2logππ=1.5log(0.01/0.99)3=1.54.59513=3.0317\text{境界} = \frac{\mu_1 + \mu_2}{2} - \frac{1}{\mu_1 - \mu_2}\log\frac{\pi_{\text{病}}}{\pi_{\text{健}}} = 1.5 - \frac{\log(0.01/0.99)}{3} = 1.5 - \frac{-4.5951}{3} = 3.0317

図の 3.03 と一致します。

誤判別コストも同じ場所に入る

「病気の人を healthy と判定する損失」と「健常者を病気と判定する損失」は普通は等しくありません。前者のほうがずっと重い。この非対称性も、まったく同じ場所に入ります。

z(x)=wx+c+logπ1π2+logc(21)c(12)z(x) = w^\top x + c + \log\frac{\pi_1}{\pi_2} + \log\frac{c(2 \mid 1)}{c(1 \mid 2)}

c(21)c(2 \mid 1) は「本当は群1なのに群2と判定したときの損失」です。事前確率とコストは、どちらも切片への足し算という同じ形で効きます。実務では両者を掛けた πg×c\pi_g \times c をまとめて扱うことも多く、比だけが効くので片方に押し込めます。

この添字はとても間違えやすいので、確認の仕方を決めておきます。この記事では群1が継続、群2が解約です。「解約の見逃し」とは、真は解約(群2)なのに継続(群1)と判定することなので c(12)c(1 \mid 2) です。これを5倍重く見るなら c(12)=5c(1\mid2) = 5c(21)=1c(2\mid1) = 1 なので、足す量は

logc(21)c(12)=log15=1.6094\log\frac{c(2 \mid 1)}{c(1 \mid 2)} = \log\frac{1}{5} = -1.6094

とマイナスになります。

誤判別コストと事前確率を変えても境界が平行移動するだけで傾きは変わらないことを示す図。等確率・等コストの黒実線、解約の見逃しを5倍重く見る赤破線、解約が8割の緑一点鎖線の3本が平行に並び、赤と緑は黒より下側にある

図で確認できます。3本の境界はすべて平行です。10人のデータで実際の数値を出すと、

設定ww切片
等確率・等コスト(5,14)(5, -14)17.0000-17.0000
解約の見逃しを5倍重く見る(5,14)(5, -14)18.6094-18.6094
解約が8割と分かっている(5,14)(5, -14)18.3863-18.3863

ww はまったく変わっていません。 切片だけが動いています。log(1/5)=1.6094\log(1/5) = -1.6094 なので 171.6094=18.6094-17 - 1.6094 = -18.6094log(0.2/0.8)=1.3863\log(0.2/0.8) = -1.3863 なので 171.3863=18.3863-17 - 1.3863 = -18.3863。手計算と一致します。

符号の向きは意味で検算します。 この判別関数では z>0z > 0 が継続なので、w2=14w_2 = -14 より継続領域は境界の下側です。切片を小さくすると境界が下がり、継続領域が狭まって解約と判定されやすくなります。 解約の見逃しを重く見るなら、解約と判定されやすくなるべきなので、切片は小さくなるのが正しい。図でも赤破線と緑の一点鎖線が黒より下にあり、両方とも「解約と判定されやすくする」方向で揃っています。

実際に境界付近の点で判定が変わることを確認しました。(16,4.5)(16, 4.5) から (20,4.5)(20, 4.5) の5点で、等コストなら解約判定は1点、log(1/5)\log(1/5) を足しても1点ですが(この設定では判定が変わるほどの移動ではない)、符号を逆にして log5\log 5 を足すと解約判定が0点になります。逆向きに動かすと見逃しがむしろ増えるわけで、そこで誤りに気づけます。

有病率が低いと陽性的中率が下がる、あの話と同じ

ご質問の「有病率が低いと陽性的中率が下がるという話と同じ構造か」について、正規分布の確率を厳密に計算して確かめました(シミュレーションだと乱数の揺れが入るので、ここは理論値で出しています)。人数は200万人あたりに換算した値です。

指標中点 1.5 で切る事前確率を入れる(3.03)
陽性と判定された人150,942人12,154人
そのうち本当に病気18,664人9,747人
陽性的中率12.36%80.19%
感度(病気を見つける率)93.32%48.74%
特異度93.32%99.88%
総誤判別率6.68%0.63%

同じ構造です。中点で切ると、感度93.32%・特異度93.32%という「そこそこ優秀」な検査に見えるのに、陽性的中率は12.36%しかありません。 陽性と言われた人の9割近くが実は健常者です。健常者が99倍多いので、たった6.7%の偽陽性率でも人数では病気の人を圧倒してしまう。第2回でやったあの計算です。

事前確率を入れた境界にすると陽性的中率は80.19%に上がります。ただし感度が93.32%から48.74%に落ちます。

ここは自分でも引っかかったので書いておきます。総誤判別率は 6.68% → 0.63% と10分の1に改善しているのに、病気の人の半分以上を見逃しているのです。総誤判別率を最小にするというのは、人数の多い群を優先するという意味なので、少数派の見逃しが増えます。

実際の検診でこの境界を使わないのは、まさにこの理由です。見逃しの損失が桁違いに大きいので、誤判別コストを入れて境界を戻すことになります。「総誤判別率の最小化」が実務の目的とは一致しない、という良い例でした。


誤判別率を同じデータで測ってはいけない

判別ルールができたら「どれくらい当たるのか」を知りたくなります。ここに罠があります。

見かけの誤判別率

ルールを作ったのと同じ10人にルールを当てはめると、誤判別0人=誤判別率0%でした。これを見かけの誤判別率と呼びます。この0%を「このルールは完璧です」と読んではいけません。

どれくらい嘘をつくのかを、極端な実験で測りました。2つの群をまったく同じ乱数発生器から発生させます。 群のラベルはコイン投げで割り当てただけで、データには群の情報が一切入っていません。つまり真の誤判別率は50%(コイン投げと同じ)です。

見かけの誤判別率が嘘をつくことを示す2枚の図。左は変数の数を増やすと見かけの誤判別率が0.24%まで下がる一方、交差確認法とホールドアウト法は正しく50%前後を返すことを示す折れ線グラフ。右は同じ内容の棒グラフ

各群10人(合計20人)で、変数の数 pp を増やしていきます。

変数の数 pp見かけの誤判別率1個抜き交差確認ホールドアウト法真の値
142.92%50.60%49.77%50%
238.38%50.83%51.28%50%
528.69%51.18%50.43%50%
1015.53%52.17%50.28%50%
153.86%50.88%49.28%50%
180.24%51.10%49.55%50%

p=18p = 18 で見かけの誤判別率が 0.24% です。「99.8%の精度で判別できるルールができました」と報告してしまいます。実際にはデータに情報が1ビットも入っていません。

一方、1個抜き交差確認法とホールドアウト法は、どの行でも正しく50%前後を返しています。

細かい点ですが、交差確認法の値が 50.60〜52.17% とすべて50%を上回る側に寄っているのは偶然ではありません。1個抜き交差確認法は n1n-1 件で学習した規則を評価するので、nn 件全部で学習する規則より少し不利な条件になります。つまりわずかに悲観側に偏るのが理論通りの振る舞いです。見かけの誤判別率が大きく楽観側に外れるのに比べれば、無視できる大きさです。

なぜこうなるのか

標本20人に対して、p=18p=18 のとき共分散行列だけで 18×19/2=17118 \times 19 / 2 = 171 個のパラメータを推定しています。平均も 18×2=3618 \times 2 = 36 個。推定すべき量が標本数より桁違いに多い状態です。

こうなると判別ルールは、群の構造ではなくその20人の偶然の凹凸を暗記します。20人の座標を丸暗記して線を引けば、その20人は完璧に分けられます。でも21人目には何の役にも立ちません。

これが第16回で扱った「変数を増やすと決定係数 R2R^2 が下がることはない」現象と同じ構造です。R2R^2 のときは自由度調整という補正がありました。判別分析では、測る場所を変える(学習に使っていないデータで測る)という解き方をします。

3つの測り方

方法やり方長所短所
見かけの誤判別率学習データで測る計算が1回で済む楽観的に偏る。標本が小さいと使い物にならない
ホールドアウト法データを2分割し、片方で学習、片方で測る簡単。楽観側には偏らない学習に使えるデータが減る。分割の仕方で結果が揺れる
交差確認法分割と評価を繰り返して平均するデータを無駄にせず、揺れも小さい計算量が増える(kk 回学習する)

1個抜き交差確認法(LOO)は、nn 件のデータから1件だけ抜いて残り n1n-1 件で学習し、抜いた1件を当てる。これを nn 回繰り返して誤りの割合を出します。データが少ないときはこれが定番です。

なお、これらは判別分析に限った話ではありません第32回のモデル選択(AIC・BIC)は、同じ「当てはめすぎ」の問題に対して「パラメータ数に罰則を科す」という別の解き方をします。交差確認法は罰則を仮定せず実際に測るので、モデルの形を問わず使える一方、計算量を払う。この対比は第32回で改めて扱います。

2次判別:柔軟なら常にそちらでよいのか

ここまでは2群の共分散行列が同じだと仮定していました。この仮定を外すと2次判別になります。

群ごとに共分散行列 SgS_g を推定して、次のスコアが大きいほうに割り当てます。

dg(x)=12logSg12(xxˉg)Sg1(xxˉg)+logπgd_g(x) = -\frac{1}{2}\log|S_g| - \frac{1}{2}(x - \bar{x}_g)^\top S_g^{-1}(x - \bar{x}_g) + \log \pi_g

第2項がマハラノビス距離の2乗(群ごとの共分散で測ったもの)です。第1項の logSg\log|S_g| が新しく登場します。共分散行列が群で違うと、2群の差を取っても xSg1xx^\top S_g^{-1} x の項が消えません。だから境界が2次曲線になります。

logSg\log|S_g| の意味は「その群の広がりの大きさによる補正」です。広がった群は密度がどこでも低いので、距離が同じでも所属確率が下がる。行列式は楕円の体積に相当するので、体積が大きいほどペナルティが付きます。

線形判別と2次判別の境界の形の比較。左の線形判別は境界が直線。右の2次判別は境界が2次曲線になり、小さい群に沿って湾曲した形になっている

破線の楕円が各群の実際の散らばりです。青い群は小さくまとまり、赤い群は大きく広がっています。左の線形判別は境界が必ず直線なので、内側の小さい群に沿った形にはできません。右の2次判別は曲線なので、青い群の側に張り出した形を描けています(この図では放物線状に開いた曲線になっていて、完全に閉じた楕円で囲んでいるわけではありません)。

「柔軟なら常に2次でよいのでは」への答え

私も同じことを考えたので、2つの設定で誤判別率を実測しました。評価は必ず別に発生させたテストデータ(各群3000件)で行っています(前節の教訓)。

各群の nn① 等分散が真:線形① 2次①の差② 分散が違う:線形② 2次②の差
1021.46%23.73%+2.27pt24.14%17.75%6.39-6.39pt
2020.22%20.96%+0.74pt23.00%15.39%7.61-7.61pt
5019.68%19.86%+0.18pt22.39%14.58%7.80-7.80pt
20019.44%19.49%+0.05pt22.07%14.16%7.91-7.91pt
100019.28%19.29%+0.01pt21.97%14.08%7.89-7.89pt

答えは「常に2次でよいわけではない、ただし損は思ったより小さい」でした。そして表の縦の動き方に決定的な非対称性があります。

①の列(等分散が真なのに2次を使った場合)は、n=10n=10+2.27+2.27pt 悪化しますが、n=50n=50+0.18+0.18pt、n=1000n=1000 では +0.01+0.01pt。標本を増やせば損失がほぼ消えます。 余分に推定したパラメータの誤差が、標本が増えれば小さくなるからです。

②の列(分散が本当に違うのに線形を使った場合)を見てください。線形判別は n=10n=10 で 24.14%、n=1000n=1000 でも 21.97%標本を1000倍にしても改善しません。 一方2次は14.08%まで下がります。7.9ptの差が、標本をいくら増やしても埋まらないのです。

ここが本質でした。

  • 間違ったモデルを使うと、標本を増やしても直らない(バイアスは消えない)
  • 無駄に複雑なモデルを使うと、標本を増やせば直る(バリアンスは消える)

前者は取り返しがつかず、後者は取り返しがつきます。だから「等分散かどうか怪しいなら2次を試す価値がある」という判断になります。

では判断基準は何か

標本サイズが変数の数に対して十分かどうかです。2次判別は群ごとに共分散行列を推定するので、1群あたり p(p+1)/2p(p+1)/2 個の成分が必要です。

変数の数 pp線形判別(共通1個)2次判別(2群なら2個)
23個6個
515個30個
836個72個
20210個420個

p=8p=8 で分散が本当に違う設定を実測すると、標本が足りないときに逆転が起きます。

各群の nn線形判別2次判別
1231.29%29.33%(差が小さい)
2033.01%18.83%
5027.08%9.94%
30022.96%6.24%

各群12人(1群あたり36個の共分散成分を12人から推定)では、2次判別の優位がほぼ消えています。n=20n=20 以上では明確に2次が勝つ。共分散行列を推定できるだけの標本があるかが分かれ目です。

なお、等分散かどうかを検定する方法としてBox のM検定があります。ただしこの検定は標本が大きいと些細な違いでも有意になり、正規性からのずれにも敏感なので、検定結果を機械的に採用するのは勧められません。実務では交差確認法で線形と2次を両方測って比べるのがいちばん確実です(測り方の話が、そのままモデル選択の道具になります)。

線形と2次の中間として、共分散行列を「群ごとの推定」と「共通の推定」の重みつき平均にする正則化判別分析もあります。第19回のリッジ回帰と同じ発想で、極端な2択の間を連続的につなぐ考え方です。


3群以上に拡張する

ここまで2群で話してきましたが、実務では3つ以上に分けたい場面が普通にあります。優良顧客・一般顧客・離脱予兆の3段階、といった具合です。

判別分析は元から多群に対応しています。 各群のスコアを計算して、いちばん大きい群に割り当てるだけです。

dg(x)=μgS1x12μgS1μg+logπgd_g(x) = \mu_g^\top S^{-1} x - \frac{1}{2}\mu_g^\top S^{-1}\mu_g + \log \pi_g

これを全群について計算して最大のものを選ぶ。群が何個でも同じ手続きで、2群の「符号で決める」はこの特殊ケースでした(2群の差を取ると1本の判別関数になる)。

3群を4つの方法で分類した結果の比較。左から線形判別分析(境界が3本の直線で1点に集まる、誤判別8.70%)、2次判別分析(9.17%)、SVM 1対1(11.60%)、SVM 1対他(9.10%)。各群の2σ楕円を破線で表示

左端の線形判別分析を見ると、境界が3本の直線で1点に集まる形になっています。3群を一度に扱っていることが図から見て取れます。

一方、サポートベクターマシンは2群専用

ここに両者の設計思想の差が出ます。サポートベクターマシンは本質的に2群を分ける道具なので、多群にするには複数の分類器を組み合わせる必要があります。

方式やり方分類器の数(gg 群)決め方
1対1(one-vs-one)全ペアで分類器を作る(A対B、A対C、B対C)g(g1)/2g(g-1)/2多数決
1対他(one-vs-rest)「その群 vs 残り全部」の分類器を作るggスコアが最大の群

3群で実測すると次のようになりました。

手法誤判別率内部の分類器
線形判別分析8.70%1回の計算
サポートベクターマシン 1対他9.10%3個
2次判別分析9.17%1回の計算
サポートベクターマシン 1対111.60%3個

この設定(多変量正規・等分散)では線形判別分析が最良でした。前提が合っているので当然の結果です。

組み合わせ方式には決められない領域ができる

格子4万点で内部の投票状況を調べたら、両方式の弱点が観察できました。

1対1の弱点:じゃんけん状態。 3群の得票は必ず (2,1,0)(2,1,0)(1,1,1)(1,1,1) になります。(1,1,1)(1,1,1) は「AはBに勝ち、BはCに勝ち、CはAに勝つ」という三すくみで、多数決では決まりません。実測で0.12%(49点)発生しました。

1対他の弱点:全員が否定する領域。 すべての分類器が「自分の群ではない」と言う点が1.79%(716点)ありました。だから符号ではなくスコアの大小で決める実装にしていますが、スコアの尺度が分類器間で揃っている保証がないという問題が残ります(別々に学習しているため)。

判別分析にはこの種の不整合が起きません。全群のスコアを同じ式・同じ尺度で計算して比べるので、決められない領域も矛盾も生じないからです。

群が増えたときのコストも違います。

群数 gg判別分析1対11対他
31回3個3個
101回45個10個
26(アルファベット認識)1回325個26個
100(画像分類)1回4,950個100個

1対1は g2g^2 で増えます。ただし1個あたりの学習データは2群分だけなので、計算量が O(n2)O(n^2) である効果で合計時間は意外に悪化しません。実務では1対1のほうがよく使われます。

試験対策として押さえるのは3点です。①各群のスコアを計算して最大の群に割り当てる、②判別方向は min(g1,p)\min(g-1, p) 本取れる、③Wilks の Λ\Lambda で「gg 個の平均ベクトルが全て等しいか」を一度に検定できる(これは多変量分散分析、MANOVA=Multivariate Analysis of Variance と同じ枠組みです)。


変数選択とWilksのラムダ

変数が10個も20個もあるとき、全部使うべきでしょうか。前節の通り、変数を増やすと見かけの成績は上がりますが実力は落ちます。効く変数を選ぶ必要があります。

そのための指標が Wilks の Λ\Lambda(ラムダ)です。

Λ=WT=群内変動全変動\Lambda = \frac{|W|}{|T|} = \frac{|\text{群内変動}|}{|\text{全変動}|}

WW は群内の平方和積和行列、T=W+BT = W + B は全体の平方和積和行列です(T=W+BT = W + B は検証コードで数値的に確認済みです。第20回の平方和の分解が多変量に拡張された形です)。

読み方はこうです。全体のばらつきのうち、群内で説明されずに残っている割合。 縦棒は行列式で、多変量の「体積」に相当します。

  • Λ\Lambda が1に近い … 群内変動が全変動とほぼ同じ=群で分かれていない
  • Λ\Lambda が0に近い … 群内変動が小さい=よく分かれている

1変数の場合を書くと Λ=SSW/SST=1SSB/SST\Lambda = SS_W / SS_T = 1 - SS_B/SS_T なので、1R21 - R^2 と同じ形です(第16回の決定係数)。決定係数が「説明できた割合」なら、Λ\Lambda は「説明できずに残った割合」。向きが逆なので、Λ\Lambda は小さいほうが良い、という読み方になります。

Wilksのラムダによる変数選択を示す2枚の図。左は4変数を1つずつ測った棒グラフで、無関係な変数x3が0.9995とほぼ1になっている。右は効く順に変数を足していく前向き選択の折れ線で、x4→x2→x1→x3の順に足し、最後にx3を足しても0.3238から0.3236しか動かない

4つの変数を用意しました。x1x_1x2x_2 は本当に効く変数、x3x_3 は群と無関係なノイズ、x4x_4x1x_1 とほぼ同じ情報を持つ変数(相関0.95)です。

左の図(1変数ずつ測る): 無関係な x3x_3Λ=0.9995\Lambda = 0.9995 で、ほぼ1です。「まったく分かれていない」と正しく判定できています。

右の図(前向き選択): 効く順に変数を足していきます。Λ\Lambda は 1.0000 → 0.7219 → 0.6401 → 0.3238 と下がり、最後に x3x_3 を足しても 0.3238 → 0.3236 しか動きません。 ここが打ち切りの目安になります。

Λ\Lambda はF統計量に変換して検定できます(Rao の近似)。

変数Λ\LambdaF値自由度p値
x4x_40.721945.455(1, 118)6.1×10106.1 \times 10^{-10}
x4,x2x_4, x_20.640132.889(2, 117)4.6×10124.6 \times 10^{-12}
x4,x2,x1x_4, x_2, x_10.323880.733(3, 116)<1016< 10^{-16}
x4,x2,x1,x3x_4, x_2, x_1, x_30.323660.100(4, 115)<1016< 10^{-16}

4変数目を足すと Λ\Lambda はわずかに下がるのに、F値は 80.733 から 60.100 に落ちています。 役に立たない変数を足すと自由度を1つ損するので、検定の切れ味が悪くなる。この動きが「不要な変数を入れるべきでない」ことを数値で示しています。

前向き選択の落とし穴

上の表で1番目に選ばれたのが x4x_4x1x_1 とほぼ同じ情報を持つ変数)だったことに注意してください。単独では x4x_4Λ=0.7219\Lambda = 0.7219x1x_1 の 0.7280 より良かったので選ばれています。しかしこの2つは相関0.95なので、両方入れる意味はほとんどありません。

前向き選択は「その時点で最も良い1個」を貪欲に選ぶので、変数の組み合わせとして最良とは限りません。第16回の多重共線性の話が、そのままここでも効いています。

Hotelling の T2T^2 との関係

2群の場合、Λ\LambdaHotelling の T2T^2 と厳密に対応します。T2T^2 は2群の平均ベクトルが等しいかを検定する統計量で、t検定の多変量版です。

T2=n1n2n1+n2D2,Λ=11+T2/(n2)T^2 = \frac{n_1 n_2}{n_1 + n_2} D^2, \qquad \Lambda = \frac{1}{1 + T^2/(n-2)}

D2D^2 は2群の平均間のマハラノビス距離の2乗です。この関係を検証したところ、小数10桁まで一致しました(Λ=0.314098\Lambda = 0.314098T2=869.12T^2 = 869.12、両者から計算した値が完全に一致)。T2T^2 をF分布に直した値 433.4690 と、Λ\Lambda から Rao の近似で計算したF値も一致しました(2群のときは近似ではなく厳密になります)。

判別分析の「どれくらい分かれているか」と、検定の「平均に差があるか」は同じ量を見ているわけです。ここもフィッシャーの判別=F値の話と同じ構図でした。

最初の10人のデータでも計算できます。D2=26D^2 = 26T2=65T^2 = 65F=28.4375F = 28.4375(自由度 (2,7)(2, 7))、p=0.000436p = 0.000436。10人しかいなくても、2群の平均に差があると言えます。

ロジスティック回帰と何が違うのか

いよいよ最初の疑問です。判別分析とロジスティック回帰(第18回)は、どちらも0か1かを予測します。何が違い、どう使い分けるのでしょうか。

違い①:モデル化する対象が違う

これが本質的な差です。

線形判別分析は xx の分布までモデル化します。 「継続群の xxN(μ1,Σ)N(\mu_1, \Sigma) に従い、解約群の xxN(μ2,Σ)N(\mu_2, \Sigma) に従う」と仮定して、そこからベイズの定理で P(x)P(\text{群} \mid x) を逆算します。データがどう生まれたかを記述するので生成モデルと呼ばれます。

ロジスティック回帰は P(yx)P(y \mid x) の形だけを仮定します。log\log オッズが xx の1次式になる」と決めるだけで、xx 自体がどんな分布かは問いません。境界だけを直接モデル化するので識別モデルと呼ばれます。

面白いのは、正規・等分散を仮定すると、ロジスティック回帰の形が導出できることです。前の節で見たように、2群の対数尤度の差を取ると xx について1次式になりました。事後確率はこれをロジスティック関数に通した形になります。

P(1x)=11+exp((wx+c))P(\text{群}_1 \mid x) = \frac{1}{1 + \exp(-(w^\top x + c))}

つまり両者は同じ形の関数を使っているのに、係数の推定方法が違うのです。

線形判別分析ロジスティック回帰
推定に使うもの群ごとの平均と共分散行列尤度の最大化(yy の条件付き尤度)
計算方法閉じた式で一発(行列の掛け算と逆行列)反復計算(ニュートン法・IRLS)
xx の分布多次元正規・等分散を仮定仮定しない

違い②:前提が正しいときの精度

「前提が正しければ線形判別分析のほうが効率がよい」というのが教科書的な説明です(Efron 1975)。これを実測しました。

正直に書くと、最初の実験では差がまったく出ませんでした。 LDA 20.41% / ロジスティック回帰 20.54% で、0.13ptしか違わない。おかしいと思って条件を振り直したところ、2群の隔たり(マハラノビス距離 DD)を変えると差が出ることが分かりました。最初の設定は D1.73D \approx 1.73 で、あまり分かれていないケースを選んでしまっていたのです。

線形判別分析とロジスティック回帰の精度比較。左はベイズ限界からの超過誤判別率で、Dが大きいところでは赤(ロジスティック回帰)が青(線形判別分析)より上にある。右は超過誤差の比で、D=1では0.99から1.03倍でほぼ互角、Dが大きいほど差が開きD=4では2.8から4.4倍になる

縦軸を「ベイズ限界(理論上の最小誤判別率)からの超過分」にすると、比較が公平になります。DD が変わるとベイズ限界そのものが変わるので、絶対値では比べられないからです。

隔たり DD各群 nnベイズ限界線形判別分析ロジスティック回帰超過誤差の比
11030.85%33.83%33.91%1.03倍
12530.85%31.94%31.96%1.01倍
110030.85%31.12%31.12%0.99倍
21015.87%17.77%18.30%1.28倍
22515.87%16.58%16.71%1.18倍
210015.87%16.02%16.05%1.19倍
3106.68%8.07%9.57%2.08倍
3256.68%7.19%7.71%2.04倍
31006.68%6.80%6.89%1.80倍
4102.28%3.04%4.45%2.83倍
4252.28%2.54%3.42%4.35倍
41002.28%2.35%2.53%3.40倍

ベイズ限界は Φ(D/2)\Phi(-D/2) で計算できます(D=4D=4 なら Φ(2)=2.28%\Phi(-2) = 2.28\%)。理論値と実測が整合しています。

結論として、教科書の説明は正しいのですが、差が出る条件が限定的でした。

  • D=1D = 1(あまり分かれていない)… ほぼ互角(0.99〜1.03倍)
  • D=4D = 4(よく分かれている)… 線形判別分析が2.8〜4.4倍有利

なぜこうなるかというと、超過誤差の絶対値自体が DD が大きいと小さくなるので、比では大きく見えても実害は小さいという側面もあります(D=4D=4n=25n=25 で 2.54% vs 3.42%、差は0.88pt)。一方 D=1D=1 では両者とも 31% 台で、差が0.02pt。

実務のデータは D=1D=1 側に寄りがちです(きれいに分かれるなら統計を使うまでもない)。精度差を体感する機会は少ない、というのが実感でした。

違い③:壊れ方が違う

精度が互角なら、壊れ方で選ぶことになります。ここで通説の検証を2つやりました。

検証1:「線形判別分析は外れ値に弱い」は本当か

線形判別分析は平均と共分散を使うので、外れ値に引っ張られると言われます。訓練データにだけ極端な1点を混ぜ、テストデータはきれいなままにして測りました(外れ値をテストにも入れると測定が壊れるので、ここは分けています)。

訓練データの外れ値線形判別分析ロジスティック回帰
なし20.39%20.52%
群0に (15,15)(15, 15)34.66%32.81%
群0に (40,40)(40, 40)53.05%53.13%
群0に (100,100)(100, 100)52.43%53.07%

(ベイズ限界は 19.32%。D=1.732D = 1.732 の設定です)

両者とも崩れました。 20.4% から 53% まで、つまりコイン投げ以下になります。

ただしこの表の読み方には注意が必要です。2群の判別で53%は偶然水準(50%)そのものなので、(40,40)(40,40) 以降の行は「両方とも完全に壊れきった」状態を見ているだけで、手法の差を測れる領域ではありません(天井に張り付いている)。差が測れるのは (15,15)(15,15) の中程度の外れ値の行だけで、そこではロジスティック回帰のほうが良い(32.81% vs 34.66%)という結果でした。

理屈もこの向きを支持します。ロジスティック回帰の尤度方程式に現れる残差は yp^y - \hat{p} で、yy が0か1、p^\hat p が0から1の間なので必ず 1-1 から 11 の範囲に収まります。一方、線形判別分析は平均と共分散という有界でない量を通じて影響を受けるので、外れ値が遠ざかるほど際限なく引っ張られます。

ただしロジスティック回帰が無敵というわけではありません。尤度方程式は (yip^i)xi=0\sum(y_i - \hat{p}_i)x_i = 0 で、残差が有界でも掛かる xix_i は有界でない(第17回のてこ比です)。だから外れ値が十分遠ざかれば、ロジスティック回帰も結局壊れます。上の表で (40,40)(40,40) 以降に両者の差が消えたのは、まさにこれが効いた結果です。

というわけで、正確な結論はこうなります。「線形判別分析だけが外れ値に弱い」という言い方は不正確で、極端な外れ値では両者とも偶然水準まで壊れる。差が見えるのは中程度の外れ値のときで、そこではロジスティック回帰がやや強い。 ただし差は2pt程度で、崩れ方の大きさ(20%→33%)に比べれば小さい。どちらを選ぶかで対処するより、データを見て外れ値を見つけるほうが効くというのが実務的な結論です(第17回の回帰診断法がここに繋がります)。

検証2:完全分離のとき

こちらは明確な差が出ました。2群がきれいに分離しているデータ(重なりがゼロ)で両者を当てはめます。

手法結果
ロジスティック回帰係数 (48.7,4.96,4.96)(-48.7, 4.96, 4.96)、標準誤差が 10510^510610^6 に発散
線形判別分析w=(18.67,18.67)w = (-18.67, -18.67)、切片 186.67186.67普通に有限の値

ロジスティック回帰は完全分離だと最尤推定量が存在しません(Albert・Anderson 1984)。尤度を大きくしようとすると係数がいくらでも大きくなれるので、反復計算が発散します。その結果として標準誤差が爆発し、係数の検定が意味をなさなくなります。ここは第18回Hauck-Donner 効果(係数が大きくなるとワルド検定統計量がかえって小さくなる現象)と同じ機構で、分離に近づくほど顕在化します。

この2つは混同しやすいので分けておきます。完全分離は「推定量が存在しない」問題Hauck-Donner 効果は「検定の切れ味が非単調に落ちる」問題です。前者が原因、後者がその現れ方という関係になっています。

線形判別分析は平均と共分散を計算するだけなので、この状況でも壊れません。分離が良いほど判別としては望ましい状況なのに、ロジスティック回帰はそこで数値的に不安定になる。これは実用上はっきりした差です。

使い分けの表

まとめます。

観点線形判別分析が向くロジスティック回帰が向く
説明変数の型すべて連続で正規に近い0/1やカテゴリが混ざる
標本サイズ小さい(nn が変数の数に対して少ない)中〜大
2群の分離よく分かれているDD が大きい)分離が悪くても安定
完全分離のとき壊れない係数が発散する
欲しい出力群への割り当て・判別得点オッズ比による効果の解釈
群が3つ以上自然に拡張できる(判別方向が複数)多項ロジットが必要
検定・推論平均ベクトルの差の検定(T2T^2係数ごとのワルド検定・信頼区間

実務での判断としては、「係数の意味を説明したい」ならロジスティック回帰です。オッズ比は「この変数が1増えると解約オッズが1.4倍」と報告できます。判別分析の係数 (5,14)(5, -14) は、そういう直接的な解釈が難しい(前に見た通り符号が直感と逆になることもある)。

逆に「とにかく分類したい・群が3つ以上ある・標本が少ない」なら判別分析です。閉じた式で一発で計算できる軽さも利点です。

なお現代的な実務では、この2つより勾配ブースティングやランダムフォレストのほうが精度が出る場面が多いです。ただし判別分析は「なぜその判定になったか」がマハラノビス距離という明確な量で説明でき、計算が軽く、標本が少なくても動く。解釈と軽さで選ばれる道具という位置づけになります。


実務での使いどころ

スパム判定と解約予測について、実際に測ってみました。

スパム判定:説明変数が0/1ばかりのケース

「特定の単語が出たか」という0/1の変数が20個ある設定です。多変量正規分布からは遠い(0か1しか取らない上に、ほとんどの単語は出現率5%で極端に偏っている)ので、判別分析の前提が崩れています。

学習データ数線形判別分析ロジスティック回帰
6011.94%11.22%
2007.62%8.57%
10005.70%5.96%

意外にも線形判別分析が壊滅しませんでした。 n=200n=200 以上ではむしろ勝っています。前提が0/1データで明らかに崩れているのに、実用的な精度が出る。

理由を考えると、線形判別分析が実際に使うのは平均ベクトルと共分散行列だけです。正規分布を仮定したのは「その2つだけで話が済む」ことの根拠づけであって、計算に入るのは平均と共分散のみ。データが正規でなくても、群の中心と散らばりに情報があれば機能するわけです。

これは「前提が崩れたら使えない」という素朴な理解を修正する必要があった点です。前提は「最適性の保証」のためにあり、「動作の条件」ではない。 ただし極端な偏りがある場合や、共分散行列が特異になる場合(同じ列が2つある等)は計算自体が破綻するので、注意は必要です。実際のスパムフィルタでは単語数が数千になるので、p>np > n になって共分散行列の逆行列が計算できません。そこは正則化や次元削減が必要になります。

解約予測:連続変数で正規に近いケース

利用日数と課金額のような連続変数で、判別分析の前提に近い設定です。

学習データ数線形判別分析ロジスティック回帰
3032.03%32.10%
6031.21%31.23%
20030.58%30.58%
100030.34%30.34%

ほぼ完全に同じでした。この設定は D=1.03D = 1.03、ベイズ限界が 30.33% なので、n=1000n=1000 の実測 30.34% はほぼ限界に達しています。前節の表の D=1D=1 の行(比 0.99〜1.03倍)と整合する結果です。

実務的な結論としては、こうなります。

  • 精度で選ぶ場面はほとんどない。 差が出るのは「よく分かれている×標本が少ない」という狭い条件
  • 解約予測では、判定より「誰から順に手を打つか」が重要。 判別得点や事後確率を大きい順に並べて上位から対応する、という使い方になる。この点はロジスティック回帰の予測確率と同じ運用
  • 事前確率と誤判別コストの調整が、手法選択よりずっと効く。 解約率が5%なら、事前確率を入れないと全員「継続」と判定するルールができあがる(それで95%的中する)。見逃しコストを入れて境界を動かすことが本質
  • どちらを使うにせよ、誤判別率は交差確認法で測る。 ここを外すと何をやっても意味がない

最後の点が今回いちばん実務的な学びでした。手法の選択より、測り方を間違えないことのほうが影響が大きいです。


サポートベクターマシン:同じ問題を別の基準で解く

版によっては第23章にサポートベクターマシン(SVM)が含まれます。準1級では用語と考え方までで十分なので、考え方だけ図で見ます。

サポートベクターマシンの考え方を示す3枚組の図。左は分ける線が無数に引けること。中央は判別分析が群の中心と散らばりから境界を決めること。右はサポートベクターマシンがマージンを最大化し、幅2.186の黄色い帯と、丸を付けた3点だけが境界を決めていることを示す

左: 10点を分ける直線は無数に引けます。「どれが一番よいか」の基準が必要です。判別分析は「群間÷群内を最大に」という基準を持ち込みました。SVMは別の基準を持ち込みます。

中央: 判別分析の答え。群の平均と共分散から計算するので、10点すべてが計算に効きます。 境界から遠い点も平均の計算に入ります。

右: SVMの答え。境界から最も近い点までの幅(マージン)を最大にします。 黄色い帯がマージンで、その幅は 2.186。丸を付けた3点がサポートベクターです。

決定的な違いはここです。この3点以外の7点は、どこに動かしても境界が変わりません。 境界の近くにいる少数の点だけで境界が決まります。

判別分析サポートベクターマシン
何を見るか群の中心と散らばり(全点が効く)群の境目(サポートベクターだけが効く)
基準群間÷群内の最大化マージンの最大化
確率を出せるか出せる(事後確率)素では出せない(後処理が必要)
非線形化2次判別・変数変換カーネル法(高次元に写して線形に分ける)
外れ値平均に効くので影響する境界から遠い外れ値は完全に無視される

「群の中心を見るか、群の境目を見るか」という対比で覚えられます。外れ値が群の内側の奥にあるとき、SVMはそれを無視しますが判別分析は平均が動きます。逆に外れ値が境界付近にあると、SVMはそれをサポートベクターにしてしまうので、そこはソフトマージン(多少の誤分類を許す)で対処します。

カーネル法は「元の空間では直線で分けられないデータを、高次元に写してから直線で分ける」という発想です。2次判別が「境界を曲げる」のに対し、カーネル法は「空間を曲げて境界は直線のまま」と考えます。目指すものは近いのですが、道具立てが違います。

速度は判別分析が圧勝する

ここは私が誤解していた点です。「サポートベクターマシンは3点だけで境界が決まる」と知っていたので、使う点が少ないから速いのだろうと思っていました。逆でした。

「どの点が効くのか」を突き止めるために最適化問題を解く必要があるのが重さの原因です。結果として少数の点しか残らないだけで、全点を見て探索しています。実測すると差は極端でした。

合計 nn判別分析サポートベクターマシン
1000.066ms3.8ms57倍
2000.071ms15.9ms224倍
4000.080ms42.3ms527倍
8000.106ms184.3ms1743倍

判別分析は nn を8倍にしてもほぼ横一線です(図の左パネルでは n=50n=50 から16倍の800まで伸ばしていますが、0.065ms から 0.102ms しか増えていません)。計算量を分解すると理由が分かります。

O(np2)共分散行列を作る+O(p3)逆行列\underbrace{O(np^2)}_{\text{共分散行列を作る}} + \underbrace{O(p^3)}_{\text{逆行列}}

nn については1次、pp については3乗pp が2倍で逆行列の時間は約8倍。実測でも pp: 100→200 で 0.101ms→0.841ms でした)。一方サポートベクターマシンは n×nn \times n のカーネル行列を作って二次計画問題を解くので O(n2)O(n^2)O(n3)O(n^3) です。

では、なぜ機械学習ではサポートベクターマシンが選ばれたのか

上の表は p=2p=2 に固定して nn だけ動かした、判別分析に最も有利な条件でした。pp を動かすと話が変わります。

nとpのスケーリングの比較。左は標本サイズnを増やした場合で判別分析がほぼ横一線、SVMが急増し n=800 で約1700倍の差。右は変数の数pを増やした場合で判別分析がO(p^3)で立ち上がり p=1600 でようやく逆転する様子と、p=n-g=198 の壁が破線で示されている

右の図が本題です。pp を増やすと判別分析が O(p3)O(p^3) で立ち上がります。p=800p=800 ではまだ判別分析が1.7倍速いのですが(18.3ms 対 31.4ms)、p=1600p=1600 で逆転します(100.9ms 対 24.7ms)。しかもサポートベクターマシンは pp が50を超えるとむしろ速くなっています(高次元だと分離しやすく、最適化の収束が早いため)。

ただし速度は本質ではありませんでした。決定的なのは p>ngp > n-g で計算できなくなることです。

プールした共分散行列 SSp×pp \times p ですが、そのランクは高々 ngn-g です(ngn-g 個の独立な偏差ベクトルから作るため)。p>ngp > n-g だとランクが足りず detS=0\det S = 0、つまり逆行列が存在しませんS1S^{-1} を使う判別分析は、ここで原理的に止まります。0で割るのと同じです。

実測で確認すると、n=50n=50(群内自由度48)のとき p=60p=60 では SS のランクが48しかなく、行列式が 3.0×102023.0 \times 10^{-202}、条件数が 3.9×10173.9 \times 10^{17} で完全に破綻していました。

スパム判定における語彙数と誤判別率。判別分析は語彙を増やすほど悪化し(14.73%→42.37%)198語を超えると計算不能になる一方、SVMは語彙を増やすほど強くなり1000語で0.03%になる

スパム判定で実験すると、この壁が現実の問題として現れます。メール200通(ng=198n-g = 198)で学習した場合です。

語彙数 pp判別分析サポートベクターマシン
15023.80%9.03%
198(=ng= n-g42.37%6.70%
300計算不能1.57%
1000計算不能0.03%

判別分析は語彙を増やすほど悪化して壁に当たり、サポートベクターマシンは語彙を増やすほど強くなります。 実際のスパムフィルタの語彙は数千〜数万語なので、この壁は必ず来ます。

サポートベクターマシンが pp に強い理由は、解く問題に xixjx_i^\top x_j という内積の形でしか pp が現れないことです。だから作る行列は常に n×nn \times n で、pp が5000になってもサイズが変わりません(実測では pp を500倍にしても速度が落ちませんでした)。ppnn に置き換える」のがカーネル法の効能で、境界を曲げられるのと同じ仕組みの別の側面です。

境界の形の自由度という軸

もうひとつ、精度で決定的に差がつく場面があります。境界が曲がっているときです。

同心円データでの境界の比較。内側の円が青、外側のリングが赤。左から線形判別分析44.33%(直線)、2次判別分析3.23%(円を描ける)、SVM線形カーネル33.70%(直線)、SVM RBFカーネル0.00%(任意の形)

内側の円と外側のリングという、直線では原理的に分けられないデータです。

手法誤判別率境界の形
線形判別分析44.33%直線のみ
サポートベクターマシン(線形カーネル)33.70%直線のみ
2次判別分析3.23%2次曲線
サポートベクターマシン(RBFカーネル)0.00%ほぼ任意の形

判別分析の境界は直線か2次曲線までです(正規分布を仮定した結果としてその形にしかならない)。サポートベクターマシンはカーネルを差し替えることで形の制約を事実上外せます。機械学習でサポートベクターマシンが使われたのは、この「データの形を仮定せずに複雑な境界を引ける」点が評価されたからでした。

ただし自由度には代償がある

同じデータ・同じ手法で、CC(誤分類をどれだけ許すか)と γ\gamma(RBFカーネルの幅)の選び方だけで誤判別率が 0.0% から 50.0%(=偶然水準、完全に無意味) まで動きました。実務では交差確認法で総当たりしてから選ぶので、実質的な計算コストは上の表よりさらに大きくなります。

一方判別分析には調整するパラメータがありません。データを入れれば答えが1つ出ます。融通が利かないとも読めますが、選ぶ人間の判断が入り込まないという利点でもあります。

使い分けの整理

判断の順序としてはこうなります。

  1. 境界が曲がっているか → 曲がっていればサポートベクターマシン(RBF)か2次判別
  2. ppnn の比pp が小さければ判別分析、ppnn に近い/超えるならサポートベクターマシンかリッジ判別分析
  3. nn が巨大(数百万) → サポートベクターマシンは O(n2)O(n^2) で現実的でないので判別分析側に戻る

2番目に補足があります。pnp \gg n でも、S+λIS + \lambda I の逆行列をとるリッジ判別分析なら動きます。p=1000p=1000n=200n=200 のスパムデータで測ると、リッジ判別分析(λ=1\lambda=1)が 0.00%、サポートベクターマシンも 0.00% で並びました。pp が大きいと判別分析は使えない」のは素の判別分析の話で、正則化すれば判別分析系のまま戦えます。ただし λ\lambda という調整パラメータが増えるので、上で挙げた「調整不要」という長所は手放すことになります。

最後にひとつ注意点です。どちらの手法も変数を選んではくれません。 効く変数5本に無関係なノイズ列を足していく実験をしたところ、サポートベクターマシンも判別分析と同程度に悪化しました(11.94% → 30.06%)。サポートベクターマシンが得意なのは「意味のある列が大量にある」場合(スパムの語彙のように1本1本は弱いが全部に情報がある)で、「意味のない列が大量にある」場合には強くありません。効く列を選ぶ作業は、手法の選択では代替できないわけです。

なお、サポートベクターマシンは現在では第一選択ではなくなりました。O(n2)O(n^2) が現代のデータ量(nn が数百万)に耐えられないためで、2010年代以降はニューラルネットと勾配ブースティングが主流です。サポートベクターマシンの黄金期は「pp は大きいが nn は数千〜数万」という2000年代のデータ規模とよく噛み合っていた時期でした。


試験対策として

準1級で問われそうな形を整理します。

計算問題の型

① 線形判別関数を作る

w=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2) と切片を計算し、新しい個体を判定する。手順は決まっています。

  1. 群ごとの平均ベクトルを出す
  2. 群ごとの偏差平方和積和行列を足して WW を作り、ngn - g で割って SS を得る
  3. S1S^{-1} を計算する(2×2なら 1det(dbca)\frac{1}{\det}\begin{pmatrix} d & -b \\ -c & a \end{pmatrix}
  4. w=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2)
  5. 切片は中点で0になるように c=12(xˉ1+xˉ2)wc = -\frac{1}{2}(\bar{x}_1 + \bar{x}_2)^\top w

注意点SS を作るときの割る数は ngn - g です(n1n-1 ではありません)。群の数を引きます。10人・2群なら8で割る。

② マハラノビス距離を計算する

D2=(xμ)S1(xμ)D^2 = (x - \mu)^\top S^{-1}(x - \mu) を素直に計算する。2×22 \times 2 なら手で展開したほうが速いこともあります。

D2=1detS(s22d122s12d1d2+s11d22)D^2 = \frac{1}{\det S}\left(s_{22}d_1^2 - 2s_{12}d_1d_2 + s_{11}d_2^2\right)

ここで d=xμd = x - \mu です。分母が行列式、s11s_{11}s22s_{22}入れ替わって掛かる点に注意します(逆行列の形から来ています)。

③ 事前確率つきの境界を出す

log(π1/π2)\log(\pi_1/\pi_2) を切片に足す。符号を間違えやすいので、「割合の多い群のほうに広く割り当てられる」という向きで検算します。有病率1%なら、健常と判定される領域が広がる(境界が病気側に動く)。

④ 誤判別率を表から読む

分割表(混同行列)から見かけの誤判別率を出す。(誤った件数)/(全件数)(\text{誤った件数})/(\text{全件数}) です。交差確認法との違いを説明できるようにしておく。

⑤ 2群の判別確率(理論値)

2群が N(μ1,Σ)N(\mu_1, \Sigma)N(μ2,Σ)N(\mu_2, \Sigma) で事前確率が等しいとき、理論上の誤判別率は

Φ(D2)\Phi\left(-\frac{D}{2}\right)

です(DD は2群間のマハラノビス距離)。D=2D = 2 なら Φ(1)=15.87%\Phi(-1) = 15.87\%D=4D = 4 なら Φ(2)=2.28%\Phi(-2) = 2.28\%。この式は出題されやすいので、D/2D/222 で割る部分を落とさないようにします。

用語の対比で問われそうな組

判別分析と主成分分析(前回との対比)

主成分分析判別分析
群のラベル使わない(教師なし)使う(教師あり)
探す方向全体のばらつきが最大群間÷群内が最大
固有値問題Σ\Sigma の固有値分解W1BW^{-1}B の固有値分解
目的次元を落として要約するグループ分けのルールを作る

どちらも「良い方向を探す」ので混同しやすいのですが、ラベルを使うかどうかで区別できます。

線形判別と2次判別

線形判別2次判別
共分散行列群で共通と仮定群ごとに推定
境界の形直線(超平面)2次曲線(超曲面)。退化して平行2直線になることもある
logSg\log \lvert S_g \rvert の項消える(共通なので)残る
必要な標本少なくて済む群ごとに p(p+1)/2p(p+1)/2 個の推定が必要
等確率楕円の関係全群が合同(平行移動で重なる)形・大きさ・傾きが違ってよい
μ0=μ1\mu_0 = \mu_1 のとき判別不能w=0w=0 になる)分散の違いで判別できる

3つの誤判別率

見かけ(楽観的に偏る)/ホールドアウト(偏らないがデータを使い切れない)/交差確認(偏らずデータを活かすが計算量)。この3つの長短を言えるようにしておきます。

引っかかりやすい点

  • SS の分母は ngn - g 群の数を引く
  • マハラノビス距離は「小さいほう」に割り当てる。 大きいほうではない
  • DD ではなく D/2D/2 が誤判別率の引数
  • 事前確率とコストは切片だけを動かす。 傾きは変わらない
  • 見かけの誤判別率は「平均的に」真の値より小さい。 個々の標本で必ずそうなるとは限らない(期待値についての下向きバイアス)
  • 判別関数の係数の符号は、単変量の平均の大小と一致しないことがある(偏回帰係数と同じ)
  • Wilks の Λ\Lambda は小さいほうがよい。 決定係数と向きが逆
  • 「2次判別の境界は必ず曲線」ではない。 2次の項の固有値に0が混じると平行2直線になる。「2次式で表される図形」であって必ず曲がるわけではない
  • 共通の共分散行列は「平均も同じ」という仮定ではない。 平均は違ってよく、ばらつき方だけが共通
  • 平均が同じでも分散が違えば2次判別で分けられる。 線形判別だと w=S1(μ0μ1)=0w = S^{-1}(\mu_0-\mu_1) = 0 で判別不能になる
  • p>ngp > n-g だと共分散行列の逆行列が存在しない。 ランクが足りないため。正則化すれば回避できる

自分が間違えていたこと

① フィッシャーの判別とF値の関係を「似ている」で止めていた

「群間÷群内という形が分散分析と似ている」とは思っていましたが、定数倍で厳密に一致するとまでは思っていませんでした。(n2)(n-2) が方向によらない定数だから最大化の答えが変わらない、という一行が理解の核でした。似ているのではなく、同じ量を違う目的で使っていました。

② ユークリッド距離でも「だいたい合う」と思っていた

散らばりを無視しても大きくは外れないだろうと考えていました。実際は10人のうち2人(20%)を誤判別しました。相関が強いほど差が開き、この記事の設定では同じユークリッド距離の2点でマハラノビス距離が3.51倍違いました。相関が強いデータでは、距離の定義の選択が結果を左右します。

③ 「総誤判別率を最小にすれば良い判別」だと思っていた

事前確率を入れると総誤判別率が 6.68% → 0.63% に改善したので、これで良くなったと書きかけました。よく見ると感度が93.32%から48.74%に落ちていました。 病気の人の半分を見逃しています。総誤判別率の最小化は多数派を優先するので、少数派の見逃しが増える。目的関数が実務の目的と一致しているかを毎回確認する必要があるという教訓でした。誤判別コストが教科書に載っている理由がここで分かりました。

④ 「2次のほうが柔軟だから常に良い」と思っていた

実測すると、等分散が真のときは各群 n=10n=10 で2.27pt悪化しました。ただしそれ以上に重要だったのは非対称性です。「無駄に複雑」は標本を増やせば直るのに、「間違ったモデル」は標本を1000倍にしても直らない(21.97%のまま)。この非対称性を見るまでは、単に「2次は過学習しやすい」という浅い理解でした。

⑤ 「線形判別分析は外れ値に弱い」を検証せずに書こうとしていた

通説として知っていたので、そのまま書こうとしました。実際に測ったらロジスティック回帰も崩れました(20.4% → 53%)。片方だけが弱いという書き方は不正確でした。

さらに、この実験の読み方でもう一段間違えました。最初は「極端な外れ値でも両者が53%で同じだから差はない」と結論しかけたのですが、2値判別の53%は偶然水準(50%)そのもので、そこは差を測れない領域です。両方が壊れきった天井に張り付いているだけでした。差が測れる中程度の外れ値の行を見ると、ロジスティック回帰のほうが2pt良い。理屈でも、ロジスティック回帰の残差 yp^y-\hat p(1,1)(-1, 1) に有界なのに対し、線形判別分析は平均と共分散という有界でない量を通すので、通説の向き自体は正しかったわけです。

「測れない領域の数値を根拠に差がないと結論する」のは、⑧で自分が反省したことと同じ型の誤りでした。値が天井や床に張り付いていないかを先に確認する必要があります。

⑥ 誤判別コストの符号を逆に間違えた

これは査読で見つかった、この記事でいちばん恥ずかしい誤りです。「解約の見逃しを5倍重く見る」場合に log5=+1.6094\log 5 = +1.6094 を足すと書いていました。正しくは log(1/5)=1.6094\log(1/5) = -1.6094 です。

原因は logc(21)c(12)\log\frac{c(2 \mid 1)}{c(1 \mid 2)}添字の向きを取り違えたことです。「解約の見逃し」は真が解約(群2)なのに継続(群1)と判定することなので c(12)c(1 \mid 2)、つまり分母にあたります。分子と分母を逆にしたので、切片が反対方向に動きました。

しかも、その誤った数値で図まで描いていました。図では「解約の見逃しを重く見る」線が「解約が8割」の線と反対側に出ていて、2本が逆方向に開いていました。同じ「解約側に寄せる」意味の2つの調整が反対方向を向いていたら、それは誤りのサインだったのに気づけませんでした。

対策として、記事に検算のルールを書き足しました。符号を計算で決めず、意味で検算する。 「見逃しを重く見る=そちらと判定されやすくする=その領域が広がる」という向きを先に決めて、切片がどちらに動くべきかを確認する。log\log の中身の順序を暗記するより確実です。

⑦ 前提が崩れたら使えないと思っていた

スパム判定風の0/1データ(多次元正規から明らかに外れている)で線形判別分析が壊滅すると予想したのですが、実用的な精度が出ました。線形判別分析が実際に使うのは平均と共分散だけで、正規分布の仮定は「その2つで最適になる」ことの根拠づけでした。前提は最適性の保証であって動作条件ではない、という区別ができていませんでした。

⑧ 効率性の差が出る条件を確かめずに一般化しかけた

最初の実験で差が0.13ptしか出なかったので「実質的に差はない」と結論しかけました。条件(2群の隔たり DD)を振ったら、D=4D=4 では2.8〜4.4倍の差が出ました。「差がない」という結論は、差が出る条件を探したうえででないと言えません。 自分が選んだ1つの設定で一般化するところでした。

⑨ サポートベクターマシンのほうが速いと思っていた

「サポートベクターマシンは3点だけで境界が決まる」と知っていたので、使う点が少ないから速いのだろうと考えていました。逆でした。n=800n=800判別分析のほうが1743倍速いという結果です。

「どの点が効くのか」を突き止めるための最適化が重さの原因で、少数の点しか残らないのは計算し終わった後の結果でした。「結果として使う量」と「計算に要する量」を混同していたわけです。

さらに、この比較自体が判別分析に有利な条件(p=2p=2 固定)だったことにも後から気づきました。pp を動かすと p=1600p=1600 で逆転し、p>ngp > n-g では判別分析が計算不能になります。「どちらが速いか」は測る軸(nnpp か)で答えが変わるという、比較の設計そのものへの反省でした。

⑩ 前向き選択が最良の変数組を選ぶと思っていた

Wilks の Λ\Lambda で前向き選択したら、1番目に選ばれたのが x4x_4x1x_1 とほぼ同じ情報を持つ変数)でした。単独の成績が良かったからです。しかし x1x_1x4x_4 は相関0.95なので両方入れる意味がありません。貪欲法は組み合わせとしての最良を保証しないという、第16回の多重共線性の話がここでも効いていました。


要点まとめ

問い答え
判別分析は何のための道具か群が分かっているデータからグループ分けのルールを作る。1変数では分けられないものを、変数の組み合わせで分ける
線形判別関数の重みw=S1(xˉ1xˉ2)w = S^{-1}(\bar{x}_1 - \bar{x}_2)SS はプールした共分散行列(分母は ngn-g
係数の符号が直感と逆になる理由他の変数を固定したときの効き方を表すから。第16回の偏回帰係数と同じ構造
フィッシャーが最大化しているもの射影後の群間平方和÷群内平方和J(u)=uBu/uWuJ(u) = u^\top Bu / u^\top Wu
それは分散分析のF値と同じか同じ。 F=(群間/群内)×(n2)F = (\text{群間}/\text{群内}) \times (n-2) で、(n2)(n-2) は方向によらない定数。最大化の答えが一致(小数10桁で確認)
第20回との関係同じ量を、第20回は検定するために読み、今回は最大化して方向を探す。態度が違う
なぜマハラノビス距離かユークリッド距離は散らばりの向きを無視する。同じ距離2.50の2点でマハラノビス距離が1.84と6.45(3.51倍)に分かれる
3.51倍の出どころ固有値の比 1.85/0.15\sqrt{1.85/0.15}主軸方向に限れば「その方向の標準偏差いくつ分」。厳密には Σ1/2\Sigma^{-1/2} で等方化してからのユークリッド距離
ユークリッドだと本当に間違えるか10人の例で2人を誤判別(マハラノビスは0人)。距離の定義だけで結果が変わる
なぜ「線形」判別なのか共通の共分散行列を使うと、距離の差の xS1xx^\top S^{-1}x の項が両群で同じ形なので消える。1次式が残るから境界が直線
共通の共分散行列とは何の仮定か群の等確率楕円が合同(平行移動だけで重なる)。平均は違ってよく、ばらつき方だけが共通
実務で成り立ちやすいのは同じ母集団を条件で切った群(男女・地域)。崩れやすいのは階層や規模が違う群(新人と役員)
崩れ方と境界の形2次の項 Q=12(S11S01)Q=\frac{1}{2}(S_1^{-1}-S_0^{-1}) の固有値の符号で決まる。両方0=直線/同符号=楕円/異符号=双曲線/片方0=放物線・平行2直線
1次元で「2次」とは何が起きるか群0の領域が区間になり群1が左右に分断される(1.208<x<1.208-1.208<x<1.208)。1本の線では表せない
平均が同じでも判別できるか2次判別ならできる(分散の違いで分ける)。線形判別は w=S1(μ0μ1)=0w=S^{-1}(\mu_0-\mu_1)=0 で判別不能
多群への拡張判別分析は元から対応(各群のスコアの最大を選ぶ)。判別方向は min(g1,p)\min(g-1,p) 本。Λ\Lambda の多群検定は多変量分散分析と同じ枠組み
SVMの多群化2群専用なので1対1g(g1)/2g(g-1)/2個・多数決)か1対他gg個・スコア最大)。1対1はじゃんけん状態0.12%、1対他は全員否定1.79%が発生
SVMと判別分析の速度判別分析が圧勝n=800n=800 で1743倍)。O(np2+p3)O(np^2+p^3)O(n2)O(n^2)。「3点だけで決まる」のは計算後の結果で、探索には全点を使う
pp を増やすとどうなるか判別分析は O(p3)O(p^3) で重くなり p=1600p=1600 で逆転(p=800p=800 ではまだ1.7倍速い)。p>ngp>n-g では逆行列が存在せず計算不能(スパム判定で語彙198語が限界)
なぜ機械学習でSVMが使われたかカーネル法はppnn に置き換える(行列は常に n×nn\times n)。加えて境界の形の自由度(同心円で44%対0%)
pnp \gg n でも判別分析を使うにはリッジ判別分析S+λIS+\lambda I の逆行列)。p=1000,n=200p=1000,n=200 でSVMと同じ0.00%。ただし λ\lambda の調整が増える
無関係な列を足すとどうなるかSVMも同程度に悪化(11.94%→30.06%)。効く列を選ぶ作業は手法の選択では代替できない
事前確率はベイズの定理と同じか同じ。 対数を取ると log(π1/π2)\log(\pi_1/\pi_2)切片への足し算になる
事前確率とコストは何を動かすか切片だけ。 傾き ww は不変(w=(5,14)w=(5,-14) が3設定で完全に同一)
有病率1%での効果境界が 1.5 → 3.03 に動き、陽性的中率 12.36% → 80.19%。ただし感度は93.32%→48.74%に落ちる
総誤判別率の最小化の落とし穴多数派を優先するので少数派の見逃しが増える。だから誤判別コストが必要
見かけの誤判別率はどれくらい嘘か判別不可能なデータ(真の値50%)で、p=18p=18n=20n=20 のとき0.24%。「99.8%的中」と報告してしまう
なぜそうなるか20人に対し共分散行列だけで171個のパラメータ。偶然の凹凸を暗記している
交差確認法は正しく測れたかLOOもホールドアウトも全条件で50%前後を返した(LOOは 50.60〜52.17% とわずかに悲観側)
2次判別は常に良いかいいえ。等分散が真なら n=10n=10+2.27pt悪化。ただし n=1000n=1000 では +0.01pt に消える
線形判別の限界分散が本当に違うとき、標本を1000倍にしても改善しない(21.97%のまま。2次は14.08%)
判断基準間違ったモデルは標本で直らない/無駄に複雑なモデルは標本で直る。 2次判別には群ごとに p(p+1)/2p(p+1)/2 個の推定ができる標本が必要
Wilks の Λ\LambdaW/T\lvert W \rvert / \lvert T \rvert小さいほうがよい1R21-R^2 と同じ形)。1に近いと分かれていない
Λ\LambdaT2T^2 の関係Λ=1/(1+T2/(n2))\Lambda = 1/(1+T^2/(n-2))。2群なら厳密に対応(小数10桁で確認)
不要な変数を足すとΛ\Lambda はわずかに下がるがF値は下がる(80.733 → 60.100)。自由度を損する
LDAとロジスティック回帰の本質的な違いxx の分布までモデル化するか(生成モデル)/境界だけモデル化するか(識別モデル)
正規・等分散を仮定するとロジスティック回帰と同じ形の関数が導出される。違うのは係数の推定方法
精度の差は出るかD=1D=1 ではほぼ互角(0.99〜1.03倍)。D=4D=4 では線形判別分析が2.8〜4.4倍有利。差が出る条件は限定的
外れ値への強さ両者とも崩れた(20.4%→53%)。極端な外れ値では偶然水準(50%)に張り付いて差が測れない。差が見える中程度の外れ値ではロジスティック回帰が2pt良い(残差が有界だから)
完全分離のときロジスティック回帰は最尤推定量が存在せず係数が発散(Albert・Anderson)。標準誤差の爆発を通じてHauck-Donner効果が顕在化。LDAは有限の値を返す
前提が崩れたら使えないかいいえ。0/1データでも実用精度が出た。LDAが使うのは平均と共分散だけで、正規性は最適性の根拠
実務での選び方係数を説明したいならロジスティック回帰(オッズ比)。分類したい・群が3つ以上・標本が少ないなら判別分析
実務で最も効くこと手法選択より事前確率とコストの調整、そして誤判別率を交差確認法で測ること
サポートベクターマシンとの違い判別分析は群の中心(全点が効く)、SVMは群の境目(サポートベクターだけが効く。10点中3点)

次回

次回は第24章、クラスター分析です。今回との対比がそのまま入り口になります。

今回の判別分析は群のラベルが分かっているデータからルールを作りました。クラスター分析はラベルがないデータから群そのものを見つけます。教師ありと教師なしの違いです。前回の主成分分析(ラベルを使わない)と今回(ラベルを使う)に続いて、この軸がもう一度出てきます。

ただし「ラベルが1列なくなるだけ」ではありません。今回の記事でいちばん怖かったのは、見かけの誤判別率が0.24%まで下がる話でした。あれができたのは、正解ラベルがあったから「間違っている」と分かったからです。ラベルがなくなると、そもそも採点ができなくなります。 交差確認法という命綱が使えない世界に入るわけで、そこがクラスター分析のいちばん厄介なところになります。

そして今回の「距離の測り方で結果が変わる」という話が、さらに大きく効きます。マハラノビス距離とユークリッド距離の選択に加えて、群と群の距離をどう定義するか(最短距離法・ウォード法など)という選択肢が増えるからです。今回2人の誤判別で済んだ距離の定義の問題が、クラスター分析では「まったく違う分類結果が出る」規模で現れます。

この連載の全体像とこれまでの回は統計検定準1級・独学連載のまとめにあります。