caret의 findCorrelation( )의 동작 방식은 다음과 같다.[9] (1) 상관 계수 행렬을 입력으로 받아 상관 계수가 cutoff를 넘는 변수 쌍 A, B를 찾는다. (2) A와 B 중 둘을 제외한 다른 변수와의 상관 계수가 큰 변수 하나를 삭제한다. (3) 1 ~ 2를 계속 반복하면서 상관 계수가 높은 변수들을 제거해나간다.
4가지 종류의 자동차에 대한 속성을 나열한 데이터인 mlbench의 Vehicle에 대해 findCorrelation( )을 적용해보자. 다음 코드에서 subset( )은 분류에 해당하는 Class 컬럼을 제거하는 목적으로 사용되었고, cor( )은 상관 계수 행렬을 계산하는 함수다.
> library(mlbench) > library(caret) > data(Vehicle) > findCorrelation(cor(subset(Vehicle, select=-c(Class)))) [1] 3 8 11 7 9 2
실행 결과 3, 8, 11, 7, 9, 2번째 컬럼의 상관 계수가 높은 것으로 나타났다. 상관 계수 값들이 어떤지 직접 살펴보면 대부분 0.7을 넘는 상당히 큰 값임을 알 수 있다.
> cor(subset(Vehicle, select=-c(Class)))[c(3, 8, 11, 7, 9, 2), c(3, 8, 11, 7, 9, 2)]
D.Circ Elong Sc.Var.Maxis Scat.Ra Pr.Axis.Rect Circ
D.Circ 1.0000000 -0.9123072 0.8644323 0.9072801 0.8953261 0.7984920
Elong -0.9123072 1.0000000 -0.9383919 -0.9733853 -0.9505124 -0.8287548
Sc.Var.Maxis 0.8644323 -0.9383919 1.0000000 0.9518621 0.9382664 0.8084963
Scat.Ra 0.9072801 -0.9733853 0.9518621 1.0000000 0.9920883 0.8603671
Pr.Axis.Rect 0.8953261 -0.9505124 0.9382664 0.9920883 1.0000000 0.8579253
Circ 0.7984920 -0.8287548 0.8084963 0.8603671 0.8579253 1.0000000
따라서 이들 변수를 제거하여 상관 계수가 낮은 변수들만 사용하도록 할 수 있다.
> myVehicle <- Vehicle[, -c(3, 8, 11, 7, 9, 2)]
caret::findCorrelation( )이 제거해야 할 변수들을 알려준다면, FSelector 패키지에는 선택해야 할 변수들을 알려주는 함수들이 있다. linear.correlation( )과 rank.correlation( )은 상관 계수로부터 변수의 중요도를 구하는 함수로, 각각 피어슨 상관 계수Pearson Correlation와 스피어만 상관 계수Spearman’s Correlation를 사용한다. 이들 함수는 예측 대상이 되는 분류와 예측 변수 간의 상관 계수를 계산하고 상관 계수가 높은 변수들을 사용하도록 추천한다.
다음은 mlbench의 Ozone 데이터에서 예측 대상이 되는 변수인 V4와 나머지 변수들 간의 피어슨 상관 계수를 구하고, 피어슨 상관 계수의 절댓값으로 변수의 중요도를 평가한 예다. V1, V2, V3은 팩터형 변수므로 계산에서 제외되었다.
> install.packages("FSelector") > library(FSelector) > library(mlbench) > data(Ozone) > (v <- linear.correlation(V4 ~ ., + data=subset(Ozone, select=-c(V1, V2, V3)))) attr_importance V5 0.58414447 V6 0.00468138 V7 0.44356639 V8 0.76986408 V9 0.72317299 V10 0.58026757 V11 0.22990285 V12 0.73194978 V13 0.41471463
실행 결과 V8, V12, V9 등이 V4와 상관 계수가 큰 것으로 보인다. cutoff.k( )를 사용하면 V4와 상관 계수 값이 큰 변수들을 손쉽게 찾을 수 있다. 다음은 상관 계수가 큰 변수 3개를 찾은 예다.
> cutoff.k(v, 3)
[1] "V8" "V12" "V9"