0에 가까운 분산(Near Zero Variance)
변수를 선택하는 기법 중 가장 단순한 방법은 변숫값의 분산을 보는 것이다. 예를 들어, 데이터 1,000개가 있는데 이 중 990개에서 변수 A의 값이 0, 10개에서 변수 A의 값이 1이라고 하자. 그러면 변수 A는 서로 다른 관찰을 구분하는 데 별 소용이 없다. 따라서 데이터 모델링에서도 그리 유용하지 않다. 이런 변수는 분산이 0에 가까우며, caret 패키지에서는 nearZeroVar( ) 함수를 사용해 이런 변수들을 쉽게 제거할 수 있게 해주고 있다.
caret::nearZeroVar : 데이터에서 분산이 0에 가까운 변수를 찾는다. |
caret::nearZeroVar( x, # 숫자를 저장한 행렬 또는 메트릭스(Metrics). 또는 숫자만 저장된 데이터 프레임 # 변수에서 가장 많이 관찰되는 값의 개수와 두 번째로 많이 관찰되는 값의 개수의 비에 대한 컷오프 freqCut=95/5, uniqueCut=10, # 전체 데이터의 개수와 서로 다른 값의 개수의 비에 대한 컷오프 # FALSE면 분산이 거의 0인 변수의 위치가 반환되고, # TRUE면 변수에 대한 정보가 저장된 데이터 프레임이 반환된다. saveMetrics=FALSE ) 분산이 거의 0인 경우로는 변수에 저장된 서로 다른 값의 개수가 1인 경우를 들 수 있다. 또, freqCut과 uniqueCut이 만족되지 않을 경우에도 분산이 거의 0인 경우로 본다. 반환 값은 saveMetrics 인자에 대한 설명을 참고하기 바란다. |
mlbench 패키지의 콩Soybean 질병 데이터에 nearZeroVar( )를 적용해보자. 콩 질병 데이터에는 질병 분류를 저장한 Class 변수와 콩에 대해 조사한 35개 변수가 저장되어 있다.
> library(caret) > library(mlbench) > data(Soybean) > nearZeroVar(Soybean, saveMetrics=TRUE) freqRatio percentUnique zeroVar nzv Class 1.010989 2.7818448 FALSE FALSE date 1.137405 1.0248902 FALSE FALSE plant.stand 1.208191 0.2928258 FALSE FALSE precip 4.098214 0.4392387 FALSE FALSE temp 1.879397 0.4392387 FALSE FALSE hail 3.425197 0.2928258 FALSE FALSE crop.hist 1.004587 0.5856515 FALSE FALSE area.dam 1.213904 0.5856515 FALSE FALSE sever 1.651282 0.4392387 FALSE FALSE seed.tmt 1.373874 0.4392387 FALSE FALSE germ 1.103627 0.4392387 FALSE FALSE plant.growth 1.951327 0.2928258 FALSE FALSE leaves 7.870130 0.2928258 FALSE FALSE leaf.halo 1.547511 0.4392387 FALSE FALSE leaf.marg 1.615385 0.4392387 FALSE FALSE leaf.size 1.479638 0.4392387 FALSE FALSE leaf.shread 5.072917 0.2928258 FALSE FALSE leaf.malf 12.311111 0.2928258 FALSE FALSE leaf.mild 26.750000 0.4392387 FALSE TRUE stem 1.253378 0.2928258 FALSE FALSE lodging 12.380952 0.2928258 FALSE FALSE stem.cankers 1.984293 0.5856515 FALSE FALSE canker.lesion 1.807910 0.5856515 FALSE FALSE fruiting.bodies 4.548077 0.2928258 FALSE FALSE ext.decay 3.681481 0.4392387 FALSE FALSE mycelium 106.500000 0.2928258 FALSE TRUE int.discolor 13.204545 0.4392387 FALSE FALSE sclerotia 31.250000 0.2928258 FALSE TRUE fruit.pods 3.130769 0.5856515 FALSE FALSE fruit.spots 3.450000 0.5856515 FALSE FALSE seed 4.139130 0.2928258 FALSE FALSE mold.growth 7.820896 0.2928258 FALSE FALSE seed.discolor 8.015625 0.2928258 FALSE FALSE seed.size 9.016949 0.2928258 FALSE FALSE shriveling 14.184211 0.2928258 FALSE FALSE roots 6.406977 0.4392387 FALSE FALSE
위 표에서 nzv 컬럼은 Near Zero Variance를 뜻하므로, nzv 컬럼에 TRUE로 표시된 변수들을 제거하면 된다.
nearZeroVar( ) 호출 시 saveMetrics를 지정하지 않으면 분산이 0에 가까운 변수에 해당하는 컬럼 번호를 곧바로 출력해준다. 따라서 이를 사용해 손쉽게 분산이 0에 가까운 컬럼들을 제거할 수 있다.
> nearZeroVar(Soybean) [1] 19 26 28 > mySoybean <- Soybean[, -nearZeroVar(Soybean)]