3.3 変数選択 - 最適な変数の組み合わせを見つける
住宅価格を予測したいとしましょう。面積、築年数、駅からの距離、部屋数、階数、日当たり...データには50個もの変数があります。
さて、全部使うべきでしょうか?
前章で学んだ最小二乗法なら、50個全部を使ってモデルを作れます。でも、それが最良とは限りません。 実は、変数を「選ぶ」ことが予測精度を上げる鍵になることがあります。
この章では、どの変数を使い、どの変数を捨てるべきかという問題に取り組みます。 最良部分集合選択、ステップワイズ選択など、様々なアプローチを視覚的に理解していきましょう。
なぜ変数選択が必要なのか?
前章で学んだ最小二乗法。データさえあれば、係数が一発で求まる便利な手法でした。
でも、ちょっと待ってください。
入力変数が100個あったとします。全部使うべきでしょうか?
実は、最小二乗法には弱点があります。変数が増えすぎると、訓練データにはぴったり合うのに、新しいデータではうまく予測できないという現象が起きます。
これを過学習(overfitting)と呼びます。
たとえるなら、試験問題の答えを丸暗記した学生のようなもの。過去問はすらすら解けるのに、少し形式が変わると手も足も出ない...。
逆に、変数が少なすぎると、データの本質的なパターンを捉えられません。これを過少適合(underfitting)と呼びます。
変数選択の目標は、この「ちょうどいい複雑さ」を見つけることです。
もう一つの重要な理由があります。それは解釈のしやすさです。
10個の変数で予測できるなら、100個より10個の方が理解しやすい。どの要因が重要なのか、一目でわかります。
下のアニメーションで、過学習と過少適合、そして「ちょうどいい」モデルの違いを見てください。

最良部分集合選択 - 全組み合わせを試す
変数選択の最も直接的なアプローチは、すべての組み合わせを試すことです。
これを最良部分集合選択(Best-Subset Selection)と呼びます。
$p$ 個の変数があるとき、「変数を使う/使わない」の選択肢が各変数にあります。 すると、可能な組み合わせは $2^p$ 通りです。
たとえば10変数なら $2^{10} = 1024$ 通り。まだ計算できそうですね。
でも40変数なら? $2^{40} \approx 1兆$ 通り。これは現実的ではありません。
そこで、変数の個数 $k$ ごとに最良のモデルを選ぶという戦略を取ります。
- $k = 1$: 1変数モデルの中で最良のものを選ぶ($p$ 個を比較)
- $k = 2$: 2変数モデルの中で最良のものを選ぶ($\binom{p}{2}$、つまり「$p$個から2個選ぶ組み合わせ」通りを比較)
- ...以下同様
各 $k$ について、前章で学んだ残差二乗和(RSS)を最小にするモデルを選びます。 (RSSは「予測の外れ具合の合計」でしたね)
すると、変数の個数が増えるほど RSS は必ず減少します(変数を増やせば、訓練データへのフィットは必ず良くなる)。
でも、RSS が小さいほど良いモデルとは限りません。過学習しているかもしれないからです。
(このトレードオフについては、後のセクションで詳しく扱います)
つまり、「選んだ変数 $S$ だけを使って、予測誤差の二乗和を最小にする」ということです。
- $N$: データ数
- $\beta_0$: 切片
- $S$: 選ばれた変数の集合
- $x_{ij}$: $i$番目のデータの$j$番目の変数

前向きステップワイズ選択 - 貪欲に変数を追加
最良部分集合選択は理想的ですが、変数が多いと計算量が爆発します。
40変数で1兆通り...すべて試すのは非現実的ですね。
では、もっと賢い方法はないでしょうか?「すべてを試す」のではなく、「良さそうな方向に進む」アプローチです。
前向きステップワイズ選択(Forward Stepwise Selection)は、次のように進みます:
- スタート: 何も変数がないモデル(切片のみ)から始める
- 追加: 現在のモデルに1つ変数を追加したとき、最も RSS を減らす変数を選ぶ
- 繰り返し: ステップ2を繰り返し、変数を1つずつ追加していく
これは貪欲(greedy)なアルゴリズムです。各ステップで「今この瞬間に最良」な選択をします。
最良部分集合選択との違いは何でしょうか?
前向きステップワイズは、一度追加した変数を削除しません。そのため、真の最良部分集合を見逃す可能性があります。
たとえば、変数 A と B を一緒に使うと素晴らしい予測ができるのに、単独では A も B もパッとしない...という場合。前向きステップワイズは A も B も選ばないかもしれません。
しかし、計算量は劇的に減ります。$2^p$ 通りだったのが、たった $p(p+1)/2$ 回の比較で済みます。
40変数なら、1兆通りが820回に。これなら十分計算できます。

後向きステップワイズ選択 - 変数を削除していく
前向きステップワイズは「何もない状態から始めて追加する」アプローチでした。
では逆に、「全部入りから始めて削除する」アプローチはどうでしょう?
後向きステップワイズ選択(Backward Stepwise Selection)は:
- スタート: すべての変数を使ったモデルから始める
- 削除: 現在のモデルから1つ変数を削除したとき、最も RSS の増加が小さい変数を除く
- 繰り返し: ステップ2を繰り返し、変数を1つずつ減らしていく
つまり、「なくても困らない変数」を順番に取り除いていくのです。
この方法には1つ制約があります。データ数 $N$ が変数数 $p$ より大きくないと使えません。
なぜなら、$N < p$ のとき、すべての変数を使ったモデルは「解けない」からです(方程式の数より未知数の方が多い状態)。
前向きと後向き、どちらが良いのでしょうか?
一般的には、どちらも同じような結果を出すことが多いです。ただし、理論的には異なる解に到達する可能性があります。
実務では、両方を試して比較することもあります。

前向きステージワイズ回帰 - より慎重なアプローチ
ここまでのステップワイズ手法には、1つの共通点がありました。
変数を追加/削除したら、その変数の係数は最小二乗法でぴったりフィットさせます。 つまり、「0から一気に最適値へジャンプ」するのです。
でも、この「一気にジャンプ」が問題を引き起こすことがあります。 特に変数が多い場合、一度に大きく係数を動かすと過学習しやすくなります。
そこで、もっと「慎重な」方法を考えましょう。
前向きステージワイズ回帰(Forward Stagewise Regression)です。
この方法は次のように進みます:
- スタート: すべての係数を0で初期化(切片のみのモデル)
- 小さな更新: 残差と最も相関の高い変数を見つけ、その係数を「少しだけ」更新
- 繰り返し: ステップ2を何度も繰り返す
ポイントは「少しだけ」という部分です。
前向きステップワイズは、変数を追加したら最小二乗でぴったりフィットします。 一方、ステージワイズは係数を少しずつ、ゆっくりと調整します。
このため、収束までに多くのステップが必要です。でも、この「遅さ」が実は利点になることがあります。
なぜでしょう?
係数を急激に変えないことで、過学習を防ぐ効果があるのです。
これは後の章で学ぶ正則化と深い関係があります。 正則化とは「係数を小さく抑えることでモデルを安定させる手法」です。 ステージワイズの「ゆっくり更新」は、結果的に係数を抑える効果を持つのです。
詳しくは次の章(リッジ回帰、Lasso)で扱いますが、今は「急がば回れ」の精神と覚えておいてください。

各手法の比較
ここで、3つの手法を比較してみましょう。
| 手法 | 特徴 | 計算量 | 制約 |
|---|---|---|---|
| 最良部分集合 | 最適解を保証 | $O(2^p)$ | $p \lesssim 40$ |
| 前向きステップワイズ | 高速、実用的 | $O(p^2)$ | なし |
| 後向きステップワイズ | 高速、実用的 | $O(p^2)$ | $N > p$ |
| 前向きステージワイズ | 過学習に強い | $O(p \cdot \text{反復数})$ | 収束が遅い |
どれを使えばいいのでしょうか?
一般的なガイドラインは:
- 変数が少ない(~40個)なら、最良部分集合選択が可能
- 変数が多いなら、前向きステップワイズが現実的
- $N < p$ なら、後向きは使えないので前向きを使う
- 過学習が心配なら、ステージワイズまたは正則化を検討
実際には、複数の手法を試して結果を比較することが多いです。
下のアニメーションで、3つの手法が同じデータに対してどのような「経路」をたどるかを見てください。

モデルサイズの選び方
ここまで、変数の組み合わせを探索する方法を見てきました。
でも、重要な問題が残っています。何個の変数を使うべきかです。
変数を増やせば、訓練データへのフィット(RSS)は必ず良くなります。 でも、それは過学習かもしれません。
では、どうやって「ちょうどいい」個数を決めるのでしょうか?
いくつかのアプローチがあります:
- 交差検証(Cross-Validation): データを分割し、一部で訓練、残りで評価を繰り返す
- 情報量規準(AIC, BIC): RSSに「変数の数に応じたペナルティ」を加える
- 調整済み $R^2$: 変数の数で補正した決定係数
たとえば、AIC(赤池情報量規準)は次のような形をしています:
つまり、「予測誤差 + 変数の数に応じたペナルティ」という構造です。
- $N$: データ数
- $d$: 使っている変数の数
- $\hat{\sigma}^2$: 誤差分散の推定値(予測がどれくらい外れるかの目安)
第2項 $2d\hat{\sigma}^2$ がペナルティ項です。変数を増やすとRSSは減りますが、ペナルティが増えます。
このバランスが最適なところで、AICは最小になります。
今は「変数を増やしすぎるとペナルティがかかる」というアイデアを押さえておけばOKです。

実例 - 前立腺がんデータ
具体的な例を見てみましょう。
前立腺がんの進行度を予測する問題です。8つの予測変数(腫瘍体積、前立腺重量、年齢など)から、PSA値(前立腺特異抗原の対数値)を予測します。
まず、最良部分集合選択を行うと、各サイズ $k$ について最良のモデルが得られます。
- $k = 1$: 腫瘍体積だけ使う
- $k = 2$: 腫瘍体積 + 前立腺重量
- ...以下同様
そして、交差検証で最適な $k$ を選びます。
この例では、$k = 2$ または $k = 3$ あたりが最適という結果になりました。
驚くべきことに、8個の変数のうち、たった2~3個で十分な予測ができたのです! 具体的には「腫瘍体積」と「前立腺重量」だけで、ほぼ最高の予測精度が得られました。
これが変数選択の力です。すべての変数を使う必要はなく、本当に重要なものだけを選べばいい。
また興味深いのは、すべての手法(最良部分集合、前向き、後向き)が似たような結果を出したことです。 変数が8個と少ないため、どの手法も最適解を見つけられたのです。
もし変数が100個だったら?その場合は手法間の差が大きくなり、最良部分集合選択は使えなくなります。

まとめ - 変数選択の全体像
この章で学んだことを振り返りましょう。
なぜ変数選択が必要か:
- 過学習を防ぐ(予測精度の向上)
- モデルを解釈しやすくする
主な手法:
- 最良部分集合選択: すべての組み合わせを試す(最適だが計算量大)
- 前向きステップワイズ: 変数を1つずつ追加(高速で実用的)
- 後向きステップワイズ: 変数を1つずつ削除(N > p が必要)
- 前向きステージワイズ: 係数を少しずつ更新(過学習に強い)
モデルサイズの選び方:
- 交差検証、AIC、BICなどを使う
- 変数を増やしすぎると過学習、少なすぎると過少適合
変数選択は、「すべての変数を使う」最小二乗法からの重要な拡張です。
次の章では、変数選択の代わりに係数を縮小するアプローチ(リッジ回帰、Lasso)を学びます。 変数を「選ぶ」のではなく、「弱める」という発想です。
