メインコンテンツへスキップ

多重共線性(マルチコ)の直観的説明

·953 文字·2 分
目次

はじめに
#

説明変数が2つ以上ある回帰モデル(重回帰モデル)を作成するとき、相関が強い説明変数があると、推定結果が不安定になる。この問題は多重共線性、あるいは英語のmulti-collinearityからマルチコと呼ばれる。 本記事では、多重共線性が生じる原因について、数学的な厳密さを省いて直観的に説明する。

多重共線性が発生する原因
#

3つの変数\(x_1, x_2, x_3\)を用いて、変数\(y\)を予測する重回帰モデルを考える。 すなわち、回帰式は以下で表される。

$$ y=ax_1+bx_2+cx_3+d $$

ただし、\(a, b, c\)は回帰係数、\(d\)は定数項である。

次に、データが下図のように与えられたとする。 図より、\(y\)は\(x_1\)と相関が高い一方で、\(y\)は\(x_2, x_3\)との相関は非常に低い。 すなわち、\(y\)の変化は\(x_1\)によってほぼ説明できる。 \(y\)の変化と\(x_1\)の変化は1:1であるので、回帰係数\(a\)は1である。

multi-collinearity
multi-collinearity

問題となるのは、相関の高い\(x_2, x_3\)の回帰係数\(b, c\)である。\(x_2\)の変化を\(x_3\)により打ち消せれば\(b, c\)の値は何でも良いので、\((b, c)=(1, -1)\)でも、極端な話、\((b, c)=(100, -100)\)でも良い。

すなわち、以下の回帰式が得られることもあり得る(簡単のため、定数項は無視した)。

$$ y= x_1+ 100 x_2 - 100 x_3 $$

このような係数が大きい回帰式を用いてしまうと、\(x_2\)または\(x_3\)にノイズが入った場合、\(y\)の推定値が非常に大きく変化してしまう。 以上が、多重共線性により重回帰モデルの推定結果が不安定になる原因である。

多重共線性への対策
#

多重共線性への対策として正則化 (regularization) が挙げられる。正則化とは係数の大きさに対して罰則を加え、係数の絶対値をなるべく小さくする方法である。 すなわち、上記の例では係数\(b, c\)をともに0に近づけて、推定結果を安定させることができる。

正則化の方法にはいくつか種類があり、リッジ (Ridge) 回帰、ラッソ (Lasso) 回帰、Elastic Netと呼ばれるモデルが良く用いられる。 これらのモデルはscikit-learnに実装されており、以下の記事で使い方を解説している。

Scikit-learnの正則化付き重回帰モデル

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

ベイズ推論による多次元ガウス分布の学習
·2698 文字·6 分
ベイズ推論(ベイズ推定)への理解を深めるため、多次元ガウス分布の学習をPythonで実装した。
BaggingClassifierの使用例
·1426 文字·3 分
BaggingClassifierクラスの使用例を示す。
scikit-learnのBaggingClassifierでバギングする
·2756 文字·6 分
BaggingClassifierを用いた学習(バギング、ペースティング、ランダムサブスペース、ランダムパッチ)について解説する。
Scikit-learnの主成分分析 (PCA)
·1432 文字·3 分
Scikit-learnのPCAクラスのパラメータ、属性とメソッドについて解説する。
Scikit-learnの正則化付き重回帰モデル
·2498 文字·5 分
Scikit-learnに実装されている重回帰、Ridge回帰、Lasso回帰、Elastic Netのロジックと使用方法をまとめた。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。