機械学習における多重共線性とは?原因や対策

機械学習における多重共線性とは?原因や対策

機械学習のモデルを作成する際に、「多重共線性」という問題が発生することがあります。多重共線性を放置すると、モデルの解釈性が損なわれたり、予測精度が低下したりする可能性があります。本記事では、多重共線性の概念をわかりやすく解説し、その原因や影響、そして実践的な対策方法についてPythonコードを交えて紹介します。

多重共線性とは?

多重共線性(Multicollinearity)とは、説明変数(特徴量)同士に強い相関がある状態のことを指します。つまり、ある特徴量が他の特徴量によってほぼ説明できてしまう場合、多重共線性が発生します。

例えば、以下のようなデータを考えてみましょう。

ID身長 (cm)体重 (kg)BMI
11706522.5
21605521.5
31807523.1
41757223.5
51655821.3

このデータでは、BMI(体格指数)が身長と体重から計算されているため、これらの間に強い相関が生じます。
もしこのデータを使って回帰分析を行うと、多重共線性による問題が発生する可能性があります。

なぜ多重共線性が問題なのか?

多重共線性があると、以下のような問題が発生します。

  1. 回帰係数の解釈が難しくなる
    特徴量同士の相関が強いため、どの変数が本当に影響を与えているのかが分かりにくくなります。
  2. 回帰係数が不安定になる
    多重共線性の影響で、わずかなデータの変動によって係数が大きく変化し、モデルの信頼性が低下します。
  3. 予測精度が低下する可能性がある
    訓練データに対する過剰適合(オーバーフィッティング)が発生し、未知のデータに対する一般化能力が損なわれる可能性があります。

多重共線性の原因

多重共線性が発生する主な原因には以下のようなものがあります。

  • 特徴量同士が強い相関を持っている(例:身長・体重・BMIのように、数学的に関連しているもの)
  • 特徴量が線形結合している(例:売上合計と個別商品の売上)
  • ダミー変数の過剰な導入(例:カテゴリ変数をダミー変数化した際に、全てのカテゴリを含める)
  • データの不足やサンプル数が少ない

多重共線性の検出方法

1. 相関係数を確認する

まず、相関係数を計算して、多重共線性の可能性を探ります。

import pandas as pd
import numpy as np

# サンプルデータ作成(身長と体重の相関を現実的に調整)
data = {
    '身長': [170, 160, 180, 175, 165, 172, 168, 177, 159, 182],
    '体重': [65, 55, 75, 72, 58, 67, 63, 74, 54, 78],
    'BMI': [22.5, 21.5, 23.1, 23.5, 21.3, 22.7, 22.3, 23.8, 21.1, 24.0]
}

df = pd.DataFrame(data)

# 相関係数を計算
correlation_matrix = df.corr()
print("相関行列:")
print(correlation_matrix)
相関行列:
           身長        体重       BMI
身長   1.000000  0.993407  0.939691
体重   0.993407  1.000000  0.969454
BMI  0.939691  0.969454  1.000000

身長と体重は、BMIと高い相関を持っています。

2. VIF(分散膨張係数)を計算する

VIF(Variance Inflation Factor)は、多重共線性の強さを測る指標です。VIFが 10以上 の場合、多重共線性が強いと判断されます。

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# VIFの計算
df_with_const = sm.add_constant(df)  # 定数項を追加
vif_data = pd.DataFrame()
vif_data["Feature"] = df_with_const.columns
vif_data["VIF"] = [variance_inflation_factor(df_with_const.values, i) for i in range(df_with_const.shape[1])]

print("\nVIF:")
print(vif_data)
VIF:
  Feature            VIF
0   const  107270.421548
1      身長     246.037896
2      体重     478.422455
3     BMI      53.753088

多重共線性の対策

1. 相関の高い変数を削除する

多重共線性の原因となる特徴量を削除することで、モデルをシンプルにできます。

df_reduced = df.drop(columns=['BMI'])  # BMIを削除

2. 主成分分析(PCA)を活用する

PCAを使うことで、相関の高い特徴量を統合し、新しい特徴量を作成できます。

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

pca = PCA(n_components=2)  # 2次元に圧縮
df_pca = pca.fit_transform(df_scaled)

print(df_pca)
[[-0.18644018  0.02408769]
 [-2.24890576  0.2411337 ]
 [ 1.64384135 -0.51118727]
 [ 1.27797556  0.26852413]
 [-1.76694794 -0.37946322]
 [ 0.22605294 -0.01932151]
 [-0.5989333   0.0674969 ]
 [ 1.74851468  0.30467217]
 [-2.62929035  0.02416659]
 [ 2.53413299 -0.02010918]]

3. 正則化回帰(リッジ回帰・ラッソ回帰)を使う

リッジ回帰やラッソ回帰を適用することで、多重共線性の影響を軽減できます。

from sklearn.linear_model import Ridge

ridge = Ridge(alpha=1.0)  # α値を調整
ridge.fit(df[['身長', '体重']], df['BMI'])
print(ridge.coef_)
[-0.17528627  0.27737557]

まとめ

多重共線性は、機械学習や統計モデリングにおいて注意すべき問題の一つです。特に回帰分析では、解釈性や予測精度に大きな影響を与えるため、事前に検出し、適切な対策を講じることが重要です。

今回紹介したように、相関係数やVIFを活用して多重共線性を検出し、特徴量の削除やPCA、正則化回帰を適用することで、適切に対処することができます。

機械学習のモデル構築において、データの前処理をしっかりと行うことで、より信頼性の高いモデルを作成できるようになるでしょう。