더북(TheBook)

상관 계수(Correlation)

변수 간 높은 상관 계수가 존재한다는 것은 두 변수가 같이 커지거나 작아지는 경향이 있다는 의미다. 선형 모델, 신경망 등의 기계 학습 모델은 상관 계수가 큰 예측 변수들이 있을 경우 성능이 떨어지거나 모델이 불안정해진다.[8] 또, 기계 학습이란 결국 모델의 파라미터parameter를 측정하는 작업인데, 상관 계수가 높은 변수가 여럿 존재하면 파라미터 수가 불필요하게 증가하여 차원 저주Curse of Dimensionality에 빠질 우려가 있다.3

상관관계가 높은 변수들이 있다면 이들을 주성분 분석(9.2.1절 참고)과 같은 방법을 사용해 서로 독립된 차원으로 변환하거나, 상관 계수가 큰 변수들을 제거해 버릴 수 있다. 다음은 상관 계수가 높은 변수들을 찾는 함수를 정리한 것이다.

표 9-8 상관 계수를 사용한 변수 선택

caret::findCorrelation : 상관 계수가 높은 변수들을 찾는다.

caret::findCorrelation(
  x,         # 상관 계수 행렬
  cutoff=.90 # 상관 계수에 대한 컷오프
)

반환 값은 상관 계수가 너무 높아 제거해야 하는 변수들의 색인이다.

FSelector::linear.correlation : 피어슨 상관 계수를 고려한 변수의 가중치(weight)를 계산한다.

FSelector::linear.correlation(
  formula, # 모델에 대한 포뮬러 표현
  data     # 포뮬러를 적용할 데이터
)

반환 값은 예측하고자 하는 대상 값과 예측 변수 간의 피어슨 상관 계수를 고려했을 때 각 예측 변수를 얼마나 비중 있게 다루어야 하는지를 알려주는 가중치다. 이 값은 피어슨 상관 계수의 절댓값이다. 피어슨 상관 계수므로 예측 대상 값과 예측 변수는 모두 연속형 데이터(즉, 1, 2, 3 과 같은 숫자여야 하고 범주형 변수면 안 됨)여야 한다.

FSelector::rank.correlation : 스피어만 상관 계수를 고려한 변수의 가중치를 계산한다.

FSelector::rank.correlation(
  formula, # 모델에 대한 포뮬러 표현
  data     # 포뮬러를 적용할 데이터
)

반환 값은 linear.correlation과 유사하다. 단, 피어슨 상관 계수 대신 스피어만 상관 계수를 사용한다.

FSelector::cutoff.k : 순위가 매겨진 속성으로부터 k 번째 등수까지를 선택한다.

FSelector::cutoff.k(
  # 순위를 첫 번째 컬럼, 변수명을 행 이름(rownames)에 저장한 데이터 프레임
  # linear.correlation() 함수나 rank.correlation() 함수의 반환 값으로 지정하면 된다.
  attrs,
  k  # 양의 정수
)

FSelector::cutoff.k.percent(
  attrs,
  k  # 0 ~ 1 사이의 값
)

반환 값은 선택된 속성명을 저장한 문자열 벡터로, cutoff.k( )의 경우 k번째 등수까지의 속성, cutoff.k.percent( )의 경우 k*100%까지의 속성이다.


3 스택오버플로우에 실린 상관 계수가 큰 피처와 분류 정확성에 대한 질문과 답변(http://stackoverflow.com/questions/14813884/correlated-features-and-classification-accuracy)을 참조하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.