GIL's LAB

랜덤포레스트와 다중공선성 본문

데이터사이언스/머신러닝

랜덤포레스트와 다중공선성

GIL~ 2022. 7. 24. 13:04

최근 다중공선성에 대한 논의를 봐서 여기에 숟가락을 한 번 얹어보도록 하겠습니다.
관련 논의는 이 블로그들을 보시기를 바랍니다.
특히, 위의 글은 굉장히 잘 정리된 글으로 일독을 추천합니다.

https://brunch.co.kr/@gimmesilver/76

다중공선성은 생각하지 마라

선형 회귀 관련 교재나 설명 자료를 보면 꼭 빠지지 않고 나오는 주제 중 하나가 다중공선성입니다. 다중공선성이란 회귀 모델의 독립변수들이 서로 강한 상관 관계를 갖고 있는 상태를 말합니

brunch.co.kr


https://blog.pabii.co.kr/multicollinearity-famous-but-stupid/

다중공선성과 Random Forest에 대한 "업계 유명한" 사람의 글 – 파비블로그

우리 학교 게시판에 TA 중 한 분이 어디선가 글을 퍼 오셨는데, 학교 게시판에만 답을 쓸 내용이 아니라, 외부에 공유드리는 편이 더 도움이 될 것 같아 평소 수업 시간에 설명한 내용들을 추가해

blog.pabii.co.kr


다중공선성이 무엇이고 이게 왜 선형회귀에서 문제가 되고, 결정나무 기반의 앙상블에서는 문제가 되지 않는지 살펴보겠습니다.
최대한 수학적인 내용을 제외하고 직관적으로 접근해보겠습니다.

다중공선성이란?

다중공선성은 독립변수 혹은 특징 간 상관성이 커서 발생하는 문제라고 할 수 있습니다.
여기서 중요한 것은 어떤 문제가 발생하느냐입니다.
머신러닝에서 관심을 두는 모델의 성능 저하 문제가 아니라, 통계학에서 관심을 두는 독립변수와 종속변수 간 부적절한 관계 파악이 문제입니다.
즉, 다중공선성이 있으면 독립변수와 종속변수 간 관계를 부적절하게 파악하게 됩니다.
또한, 전통적인 방법(즉, 오차제곱합을 각 계수로 편미분한 값이 0이 되는 연립방정식을 구하는 방식)으로 회귀 모델을 학습하는 경우에는 역행렬을 구할 수 없어서 적절한 계수 추정이 불가능합니다.

간단한 예시를 통해 살펴보겠습니다.
종속 변수 y와 독립 변수 x1, x2가 있고, 다음과 같은 관계가 있음을 우리가 아래와 같이 이미 알고 있다고 해보겠습니다 (물론 비현실적인 가정이지만, 설명을 위한 것입니다).

  • y = 2x1
  • x1 = x2

즉, x1이라는 독립변수에 2를 곱하면 y를 정확히 알 수 있고, x1과 x2는 같습니다.
이 상황에서 회귀 모델(종속변수: y, 독립변수: x1, x2)로 학습한다고 해보겠습니다.
그러면 아래 식에서 계수 b1과 b2를 추정하는 것이 됩니다.

y = b1x1 + b2x2

그런데 이미 우리는 x1과 x2가 같다는 사실을 알고 있습니다.
그러면 위 식은 다음과 같이 정리할 수 있습니다.

y = (b1+b2)x1 = (b1+b2)x2

또한, y = 2x1이라고 했으므로, b1+b2 = 2만 성립하면 됩니다.
그런데 계수에 대한 제약이 없으므로, b1+b2 = 2를 만족하는 (b1, b2)의 개수가 무한하다는 문제가 있습니다.
즉, (2, 0), (1, 1), (0, 2), (-1, 3), .... 등이 모두 위 식을 만족합니다.
그러면 이 가운데 가장 적절한 계수는 무엇일까요? 판단할 수 없습니다.

통계학에서 관심을 두는 것은 (x1, x2) ~ y의 관계입니다.
그런데 위와 같은 상황에서는 어떠한 관계가 있는지를 알기 어렵습니다.
즉, y = 2x1, y = x1 + x2, y = 3x1 - x2 중에 어느 것이 가장 좋은 설명인지 알기 어렵습니다.
두 독립 변수가 같다는 극단적인 예시이긴 하지만, 두 변수가 선형 관계에 있으면 유사한 문제가 발생합니다.

이처럼 다중공선성이 있으면 독립변수와 종속변수 간 적절한 관계를 파악하는게 매우 힘들어지거나 불가능해집니다.

다중공선성이 선형 회귀 모델 성능에 영향을 주는가?

전혀 주지 않는다고 단언하긴 어렵지만, 주지 않는다고 보는 것이 적절합니다.
위의 예시에서 (b1, b2)를 어떻게 추정하든 x1과 x2로 y를 잘 설명하는데 아무런 어려움이 없기 때문입니다.
간단한 코드 예시를 보겠습니다.

먼저, 난수 1000개로 구성된 x1=x2를 만들고, y=2x1를 만들겠습니다.

import numpy as np
x1 = np.random.random((1000, 1))
x2 = x1
X = np.hstack([x1, x2])
y = 2 * x1

그리고나서 사이킷런으로 선형회귀 모델을 학습해보고 그 결과를 확인해보죠.

from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(X, y)
print(model.coef_)

[실행 결과]

[[1, 1]]

각 특징에 대한 계수가 1, 1로 정상적으로 추정됨을 알 수 있습니다.

결정 나무에서는 어떠한 영향을 주는가?

결정 나무의 학습 방식을 고려하면 다중공선성이 어떠한 영향도 주지 않음을 알 수 있습니다.
랜덤포레스트도 결정 나무를 배깅방식으로 앙상블한 것이므로 같습니다.

이론적으로 결정 나무는 한 노드에서 분지 가능한 모든 규칙 가운데 불순도를 최대로 감소시키는 규칙을 선택해서 분지하는 방식으로 학습됩니다. 이론적으로라는 표현을 쓴 이유는 모든 규칙을 따지는 것이 현실적으로 쉽지 않아, 일부 규칙에 대해서만 불순도 감소량을 측정하기 때문입니다.
가령 위의 예시에서는 다음과 같은 후보 규칙 가운데 불순도를 가장 많이 감소시키는 규칙을 선택할 것입니다.

후보 규칙

  • x1 <= 0.01
  • x1 <= 0.02
  • x1 <= 0.03
  • ...
  • x1 <= 1.00
  • x2 <= 0.01
  • x2 <= 0.02
  • ...
  • x2 <= 1.00

특징이 많아지면 x1과 x2 중 하나는 후보 규칙을 만드는 데 사용되지 않을 수 있습니다.

아무튼 후보 규칙 가운데 하나를 선택해서 분지하고, 또 분지된 노드에서 후보 규칙을 선택할 것입니다.
여기서 결정 나무가 왜 다중공선성과는 무관한지를 알 수 있습니다.
만약 x1 <= 0.20이 규칙으로 선택됐다고 해보겠습니다.
그러면 x1 <= 0.2, x1 > 0.2를 만족하는 두 개의 노드가 생기고 각 노드에서 규칙을 또 선택할 것입니다.
그런데 x1 <= 0.2가 사용됐으므로, x2 <= 0.2가 사용될 가능성은 없습니다.
왜냐하면 x1 <= 0.2로 분지하면, x1 <= 0.2와 x2 <= 0.2가 같다는 점을 고려했을 때 x2 <= 0.2로는 불순도를 감소시킬 수 없기 때문입니다.
그래서 상관성이 높은 특징이 사실상 무시됩니다.


x1과 x2 외에도 다른 특징이 매우 많다면 그저 x1과 x2가 다른 특징에 비해 선택될 가능성이 클 뿐, 다른 차이는 없습니다. 각 노드에서 후보 규칙을 만드는데 사용할 특징을 선택하는 과정에서 x1는 다른 특징보다 2배 많다고 볼 수 있기 때문입니다.

그래도 제거해야 하는가?

파비 블로그에서 이야기했듯, 상관성이 높은 특징을 제거하면 불필요한 컴퓨팅 자원 낭비를 막을 수 있습니다.
데이터가 어마무시하게 많으면 각 후보 규칙을 평가하는데 자원이 많이 소요되므로 상관성이 높은 특징을 제거하는 것이 계산 효율성 측면에선 유리합니다. 그리고 완벽한 상관성이 있다면 상관성이 높은 특징 한 개만 보면 되므로 더더욱 그렇습니다.

그러면 상관성이 높은 특징을 제거하는 작업을 반드시 해야할까요?
사실 저는 여기에 동의하지 않습니다.
완벽한 상관성이 있는 특징이 있는 경우도 흔치 않을 뿐만 아니라, 이 특징을 파악할 시간에 모델을 먼저 돌리는 것이 현실적으로 더 효율적입니다. 컴퓨터를 고생시키는게 조금 더 낫죠.
게다가 완벽한 상관성이 있는 경우가 아니라고 해보겠습니다.
즉, x2 = x1 + e (e는 잔차)라고 해보죠.
잔차에 따라 다르겠지만, 이러한 상황에서는 x1만 쓰는 것과 x1, x2를 쓰는 것은 다른 결과를 낼 가능성이 조금이나마 존재합니다.

그렇기 때문에 브런치 글처럼 결정나무 혹은 결정나무 기반의 앙상블을 쓸 때 굳이 다중공선성을 고려할 필요가 없습니다.


Comments