対角LDAと最近傍縮小重心 — 2万遺伝子から本物の手がかりを見つける

がん患者63人から2,308個の遺伝子を測定した。診断に本当に役立つ遺伝子はそのうち何個か? 「対角LDA」と「最近傍縮小重心」は、p >> N という高次元の壁を突破しながら、 重要な特徴を自動的に選び出す。正則化の思想を分類問題に応用した、エレガントな解法だ。

針小棒大の問題 — 2万の変数で60人を分類する

2003年、スタンフォードの研究者が面白い実験をした。がん患者63人から、2,308個の遺伝子の発現量を測定した。 そしてこれを使って、4種類のがんを正確に分類しようとした。

ここで立ち止まって考えてほしい。

少数の点と大量の棒の対比でp >> Nを視覚化
上:63個のデータ点。下:2,308個の特徴(遺伝子)。変数がサンプルの40倍以上。

p >> N。変数がサンプルより40倍以上多い。これが高次元問題の典型だ。

なぜこれが問題なのか?第4章で学んだ線形判別分析(LDA)を思い出してほしい。 LDAはクラス内共分散行列 Σ を推定する必要がある。 しかし2,308個の変数があれば、Σ は2,308×2,308 = 約530万個のパラメータを持つ。 63個のデータ点でこれを安定的に推定することは不可能だ。

では、どうすればいいのか?

鍵は「問いを変えること」だ。

「全遺伝子が互いに相関している」という難しい仮定をやめ、「各遺伝子は独立に働く」というシンプルな仮定に切り替える。 この仮定のもとでLDAを行うのが対角LDA(Diagonal LDA)だ。

対角LDA — 「独立仮定」という合理的な妥協

対角LDAの判別スコアを見てみよう。少し難しそうに見えるが、実は単純なアイデアだ。

2クラスの重心への距離を視覚化
青と赤の2つのクラス。テスト点(緑の星)から各クラスの重心(大きな丸)への距離を計算する。近い方のクラスに分類される。

アニメーションで見た通り、「テスト点がどちらのクラスの重心に近いか」——これが判別の本質だ。 この考えを数式にすると:

$$\delta_k(x^*) = -\sum_{j=1}^{p} \frac{(x_j^* - \bar{x}_{kj})^2}{s_j^2} + 2\log\pi_k$$

この式は「テスト点 x* がクラス k の中心からどれだけ離れているか」を計算している。各特徴 j について:

$s_j$ で割ることで、スケールが違う特徴を公平に比較している。 例えば「体重(kg)」と「血糖値(mg/dL)」を同じ土台で比べるようなものだ。

重要なのは、この式には特徴間の相関項がないこと。 従来のLDAでは $\Sigma^{-1}$ の逆行列が必要で、これが530万個のパラメータを要求した。 対角LDAは「特徴は独立」と仮定することで、 必要なパラメータを p 個(各特徴の分散)だけに削減した。

これは近似だが、p >> N では「正確な方程式を解けない」より 「近似でも安定的に解く」方が実用的に優れる。

縮小の魔法 — 重心を「引き寄せる」

対角LDAだけでは、まだ問題がある。

2,308個の遺伝子のうち、診断に本当に関係あるのはごく一部かもしれない。 残りの遺伝子は「ノイズ」だ。もしノイズだらけの遺伝子を全部使って分類すれば、精度は下がる。

最近傍縮小重心(Nearest Shrunken Centroids)はこの問題に対処する。 アイデアはシンプル:

各クラスの重心を、全体の平均に向かって「引き寄せる」

クラス重心が全体平均に向かって縮小する様子
白い点が全体平均。色付きの点が各クラスの重心。グレー領域(Δ以内)に入った重心は全体平均に吸収され、遠い重心は縮小しながらも残る。

どれくらい引き寄せるかは、以下のスコアで決まる:

$$d_{kj} = \frac{\bar{x}_{kj} - \bar{x}_j}{m_k(s_j + s_0)}$$

$d_{kj}$ が大きいほど、その遺伝子はクラスを区別する力が強い。 小さいほど、クラス間でほとんど差がない(ノイズに近い)。

次に、ソフトしきい値処理を適用する:

$$\tilde{d}_{kj} = \text{sign}(d_{kj})(|d_{kj}| - \Delta)_+$$

Δ はチューニングパラメータ。$|d_{kj}| < \Delta$ の遺伝子はゼロになる—— つまり、「この遺伝子は分類に関係ない」と自動判定される。

ソフトしきい値の幾何学 — 「なだらかなゼロ化」

では、どうやって重心を「引き寄せる」のか?その答えが「ソフトしきい値(soft thresholding)」というトリックだ。

「ソフトしきい値」という名前、何が「ソフト」なのだろうか? 比較のために「ハードしきい値」を考えてみよう。

ソフトしきい値(青)とハードしきい値(赤の点線)の比較グラフ
横軸が入力値、縦軸が出力値。黄色の線がしきい値Δ。青(ソフト)は滑らかに変化するが、赤の点線(ハード)はΔで急に変わる。

違いは「段差」だ。ハードしきい値は Δ のところで値が突然変わる(不連続)。 ソフトしきい値は滑らかに変化する(連続)。

なぜソフトの方が良いのか?予測の安定性だ。 ハードしきい値では、$d_{kj}$ が Δ のわずか上か下かで結果が激変する。 ソフトしきい値では、入力が少し変わっても出力は少しだけ変わる。 これが予測モデルの「頑健性」に繋がる。

縮小後の重心は元の空間に戻す:

$$\tilde{x}_{kj} = \bar{x}_j + m_k(s_j + s_0)\tilde{d}_{kj}$$

$\tilde{d}_{kj} = 0$ の遺伝子については、縮小後の重心は全体平均$\bar{x}_j$ と一致する。 クラス間で差がなくなるので、分類に使われなくなる——これが自動的な特徴選択だ。

実際の効果 — 2,308個から43個へ

この手法をスタンフォードの遺伝子データに適用してみよう。

Δ(しきい値)を少しずつ大きくしながら、使用する遺伝子数とテストの正確さを調べる。 Δを大きくするほど「この遺伝子はどのクラスでも同じ」と判断される遺伝子が増え、選ばれる遺伝子数が減る。

Δの増加に伴い、使用される遺伝子(黄色の棒)が減少してグレーになる様子
黄色の棒が「選ばれた遺伝子」、グレーが「除外された遺伝子」。Δが増えるにつれ、本当に重要な特徴だけが残る。

元の2,308個から、わずか43個の遺伝子を選択したとき、 テストデータでの誤り率は20サンプル中5件(25%)だった。 全遺伝子を使っても精度はほとんど変わらず、むしろシンプルなモデルの方が安定することが多い。

これが最近傍縮小重心の力だ:

Δの選び方

Δが小さすぎると全遺伝子を使うことになり、ノイズの影響を受ける(高バリアンス)。 Δが大きすぎると重要な遺伝子まで除外してしまい、判別力が落ちる(高バイアス)。 最適なΔは交差検証で見つける——訓練データで何種類かのΔを試し、 検証データで最も良い結果を示したΔを選ぶ。

まとめ — なぜこれが「正則化」なのか

振り返ると、最近傍縮小重心は第3章で学んだ正則化の思想を高次元問題に応用したものだ。

LASSOが回帰係数をゼロに引き寄せたように、 最近傍縮小重心はクラス重心の「差分」をゼロに引き寄せる。 効果は同じ:不要な特徴を自動的に除去する。

Δとエラー率のU字カーブ。青が訓練誤差、赤がテスト誤差、黄色の縦線が最適Δ
横軸がΔ(正則化の強さ)、縦軸がエラー率。テスト誤差(赤)はU字型を描き、最適なΔが存在する。
手法正則化の対象正則化の効果
Ridge回帰回帰係数係数を縮小
LASSO回帰係数係数をゼロ化(特徴選択)
最近傍縮小重心クラス重心の差分差分をゼロ化(特徴選択)

高次元問題では、「全ての特徴を使う」ことが必ずしも正しくない。 本当に重要な特徴だけを選び、それに集中することで、 より安定した、解釈可能な予測が可能になる。

これが、p >> N の世界で機械学習が生き残るための戦略だ。