機械学習のモデルを作成する際に、「多重共線性」という問題が発生することがあります。多重共線性を放置すると、モデルの解釈性が損なわれたり、予測精度が低下したりする可能性があります。本記事では、多重共線性の概念をわかりやすく解説し、その原因や影響、そして実践的な対策方法についてPythonコードを交えて紹介します。
目次
多重共線性とは?
多重共線性(Multicollinearity)とは、説明変数(特徴量)同士に強い相関がある状態のことを指します。つまり、ある特徴量が他の特徴量によってほぼ説明できてしまう場合、多重共線性が発生します。
例えば、以下のようなデータを考えてみましょう。
ID | 身長 (cm) | 体重 (kg) | BMI |
---|---|---|---|
1 | 170 | 65 | 22.5 |
2 | 160 | 55 | 21.5 |
3 | 180 | 75 | 23.1 |
4 | 175 | 72 | 23.5 |
5 | 165 | 58 | 21.3 |
このデータでは、BMI(体格指数)が身長と体重から計算されているため、これらの間に強い相関が生じます。
もしこのデータを使って回帰分析を行うと、多重共線性による問題が発生する可能性があります。
なぜ多重共線性が問題なのか?
多重共線性があると、以下のような問題が発生します。
- 回帰係数の解釈が難しくなる
特徴量同士の相関が強いため、どの変数が本当に影響を与えているのかが分かりにくくなります。 - 回帰係数が不安定になる
多重共線性の影響で、わずかなデータの変動によって係数が大きく変化し、モデルの信頼性が低下します。 - 予測精度が低下する可能性がある
訓練データに対する過剰適合(オーバーフィッティング)が発生し、未知のデータに対する一般化能力が損なわれる可能性があります。
多重共線性の原因
多重共線性が発生する主な原因には以下のようなものがあります。
- 特徴量同士が強い相関を持っている(例:身長・体重・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、正則化回帰を適用することで、適切に対処することができます。
機械学習のモデル構築において、データの前処理をしっかりと行うことで、より信頼性の高いモデルを作成できるようになるでしょう。