관리 메뉴

TEAM EDA

[Machine Learning Advanced] 6강. 머신러닝 강의 - 변수 선택 본문

EDA Study/Machine Learning Advanced

[Machine Learning Advanced] 6강. 머신러닝 강의 - 변수 선택

김현우 2023. 8. 7. 19:06

이번 강의에서는 변수의 선택 (Feature Selection)에 대해 알아보겠습니다. 변수의 선택은 파생 변수가 만들어진 이후에 진행되기도 하고, 모델의 학습이 끝난 이후에 진행되기도 합니다. 어떤 방법, 모델, 목적에 따라 다른 모습을 보이는데 이번 강의에서는 Feature Selection의 의미와 왜 해야 하는지, 어떤 방법들이 있는지 살펴보고 마지막으로 최근 대회에서 사용되는 실용적인 기법들을 보면서 마무리하겠습니다. 

 

Feature Selection이란 무엇이고 왜 해야하는 것일까요? 

Feature Selection (변수 선택)은 학습에 필요한 변수들을 선택하는 과정을 의미합니다. 이 과정을 통해서 변수를 줄이게 되면 얻는 장점은 

 

1. 차원의 저주 (Curse of Dimensionality) 해소: 변수가 많을 수록 데이터의 차원이 높아지며, 이는 모델의 학습에 더 많은 데이터를 요구하고 복잡성을 증가시킬 수 있습니다. Feature Selection을 통해 불필요한 변수를 제거하여 해당 문제를 해결할 수 있습니다. 

 

2. 모델의 성능 향상 : 불필요한 변수에 모델이 과적합(Overfitting)되는 문제를 완하할 수 있습니다. 그로인해, 모델의 성능 향상을 기대할 수 있습니다. 

 

3. 학습 및 추론 시간, 메모리 개선 : 일반적으로 변수의 수가 증가하면 모델의 학습 및 예측에 걸리는 시간이 증가하고, 더 큰 메모리를 요구하게 됩니다. 이때, 불필요한 변수를 제거하면 시간과 메모리 관점에서 효율적입니다. 

 

4. 해석 가능성: 변수가 많은 경우보다 적은 경우에 모델의 결과를 해석하기 더 용이합니다. 

 

Feature Selection을 수행하는 대표적인 3가지 접근법 

Feature Selection을 하게 되는 상황을 생각해보면, 학습 전에 주어진 변수들에 대해서 적용을 해볼 수가 있고 파생변수까지 만들고 학습한 이후에 적용해볼 수 있습니다. 일반적으로 대회에서는 극한의 성능을 내야하다보니 파생변수를 하나씩 만드는대로 추가 후 성능의 상승, 하락 유무를 파악한 뒤에 오르면 유지, 떨어지면 제거하는 방식을 사용합니다. 하지만, 실제 주어진 피쳐가 너무 많거나 파생변수를 한번에 많이 만든경우 모든 경우의 수 (2^N-1)를 조사하는 것은 무리입니다. 그렇기에, 아래의 3가지 접근법을 많이 활용합니다. 3가지 접근법의 차이는 이제 아래의 그림처럼 모델 학습 이전에 수행되는지, 반복되는지, 성능 평가가 진행되는지로 나뉩니다. 

 

3가지 형태의 변수 선택 방법

 

Filter method 

Filter 메서드는 변수들 간의 통계적 관계를 평가하여 변수의 중요도를 결정하는 방법입니다. 변수들 간의 상관관계나 분산을 기준으로 변수를 선택합니다. 주요 방법으로는 다음이 있습니다:

 

1. 상관관계: 변수들 간의 상관계수를 계산하여 상관관계가 높은 변수를 선택합니다. 

 

2. 분산 기준: 분산이 낮은 변수들을 제거하여 변동성이 낮은 변수를 제거합니다.

 

그 외에도 chi-square test, fisher score, information gain 등 여러 방법을 사용할 수 있습니다. 

 

일반적으로 상관관계나 분산 등의 정보가 모델에 좋은 피처를 선택하는 기준이라고는 할 수 없습니다. 하지만, 다른 기법들에 비해 계산속도가 빠르기에 데이터의 크기가 큰 경우에 대해서 사용하기 편할 수 있고, 상관성이 너무 높은 변수가 있다면 이를 제거하는 것도 충분히 유의미합니다. 실제 캐글의 IEEE-Cis Fraud Detection 대회에서도 Correlation을 기반으로 변수를 제거하는 방법들이 사용되었습니다. 

 

아래는 IEEE-CIS Fraud Detection 대회의 일부 변수들에 대해 Correlation을 기반으로 제거한 예시입니다. 해당 대회의 데이터는 변수만 거의 300개 이상으로 굉장히 많았습니다. 이때, V가 붙은 변수들은 유사한 모습을 보였는데 아래의 그림에서 블록 내에서 상관 된 (r> 0.75) 하위 집합을 찾을 수 있습니다.

 

[[279,280,293,294,295,298,299],[284],[285,287],[286],[290,291,292],[297],[302,303,304],[305],[306,307,308,316,317,318],[309,311],[310,312],[319,320,321]]

 

이때, 해당 각 하위 블록에서 가장 원소의 갯수가 많은 변수 (설명력이 가장 높은 변수)를 선택해서 변수 선택을 진행했습니다. 예를들어, [279,280,293,294,295,298,299] 블록은 각각 원소의 갯수가 [881, 975, 870, 1286, 928, 94, 50]이고 가장 큰 1286을 가지는 294 변수가 남게 됩니다. 이를 모든 하위 블록에 대해서 진행하면 [294, 284, 285, 286, 291, 297, 303, 305, 307, 309, 310, 320]이 됩니다. 

 

 

Wrapper method 

Wrapper 메서드는 실제 모델의 성능을 활용하여 변수를 선택하는 방법입니다. 모델을 반복적으로 학습시키고 검증하는 과정에서 변수를 선택합니다. 주요 방법으로는 다음이 있습니다: 

 

1. 순차적 특성 선택 (Sequential Feature Selection): 변수를 하나씩 추가하거나 제거하여 최적의 변수 조합을 찾는 방법입니다.

 

2. 재귀적 특성 제거 (Recursive Feature Elimination): 모든 변수를 포함한 상태에서 중요하지 않은 변수들을 제거해 나가면서 모델의 성능을 평가하는 방법입니다.

 

대표적인 Wrapper method로는 Forward Selection(전진 선택), Backward Elimination(후방 제거), Stepwise Selection(단계별 선택)가 유명합니다. Forward Selection은 이름에서 알 수 있듯이 변수를 하나씩 추가하면서 모델의 성능을 측정하는 방법입니다. 

 

한번 예시를 통해서 해당 방법을 이해해보겠습니다. 상황은 아래와 같습니다.

 

변수: x0, x1, x2, x3

모델: Linear Regression

평가 지표: 수정된 결정 계수(R^2_adj)

 

[Forward Selection]

이전 모델과 비교하였을때, 평가지표가 안좋아졌으므로 정지합니다. 마찬가지로 Backward Elimination는 전체 변수가 모두 있는 경우부터 시작해서 한개씩 빼는 것을 의미하고, Stepwise Selection은 전진과 후진을 반복해서 사용하는 것을 의미합니다. 일반적으로 모형 적합도 (AIC)라는 퍼포먼스 측정값을 만들고 진행을 하며, 정확성은 많이 높일 수 있지만 비용이나 시간이 많이 발생하는 단점이 있습니다. 

 

Embedded method 

Embedded 메서드는 모델 훈련 과정에서 변수의 중요도를 평가하며, 모델에 포함된 변수 중요도를 기반으로 변수를 선택합니다. 이 방법은 모델의 특성을 잘 반영하며, 변수의 중요도와 모델의 복잡성을 고려합니다. 주요 방법으로는 다음이 있습니다: 

 

1. 랜덤 포레스트 변수 중요도: 랜덤 포레스트 모델을 사용하여 변수 중요도를 평가하고 중요한 변수를 선택합니다. 

 

2. L1 규제 (Lasso Regression): L1 규제를 사용하는 선형 회귀 모델에서 변수의 계수를 줄여줌으로써 중요한 변수를 선택합니다. L1 규제의 경우 변수의 계수를 0으로 보내는 효과가 있기에 자동으로 변수가 제거되는 효과가 있습니다. 

 

출처 : Zou, H., & Hastie, T. (2005). Regularization and variable selection via the elastic net.

 

대회에서 활용된 방법 

위의 방법들 이외에도 결측치가 너무 많은 변수를 제거할 수도 있고, unique value의 값이 1인 값을 제거할 수도 있습니다. 혹은, 대회에서 많이 활용되는 방법으로 Adversarial Validation이라는 방법도 존재합니다. 해당 방법은 제가 Recsys2023 challenge, IEEE Cis Fraud Detection 대회에서도 활용했고 저 외의 많은 캐글러들도 활용하는 방법입니다. 

 

Adversarial Validation

해당 방법은 학습 셋과 평가 셋을 구분하는 변수를 하나 만들어서 모델이 이를 분류를 잘 하는지 확인을 통해, 평가와 학습 셋에서 다른 분포를 보이는 변수를 제거하는 방법입니다. 

 

1. 학습 셋에 새로운 변수를 만들어 0을 주고, 평가 셋에 새로운 변수를 만들어 1을 준 후 합칩니다. 

 

2. 1번 이후, 합쳐진 데이터를 랜덤하게 분할합니다.

 

3. 2에서 분할된 데이터 중 하나를 학습 셋으로, 다른 하나를 평가 셋으로 하여 1에서 만든 레이블을 분류하도록 학습시킵니다. 

 

4. 3의 과정에서 AUC 등의 분류 스코어와 모델의 피처 중요도를 보고 해석을 진행합니다. (AUC가 높으면 0과 1을 잘 구분한 것으로 학습 셋과 평가 셋의 차이가 높다는 의미이고, 이때 어떤 변수가 중요하게 영향을 끼쳤는지 확인하여 변수를 제거할 수 있습니다) 

 

알고리즘은 위의 4가지로 설명이 가능합니다. 이렇게 되면 모델은 학습 셋과 평가 셋을 잘 구분하려고 노력할 것이고, 만일 모델이 잘 구분한다고 하면 어떤 변수들의 상호작용에 의해 학습 셋에서 평가 셋으로 넘어오는 기간 데이터의 특성이 달라진 부분이 있다는 의미입니다. 이때, 한번에 모든 변수를 사용하게 되면 변수들간의 상호작용을 볼 수 있고 변수를 하나씩 넣어서 변수 자체의 분포가 학습 셋과 평가 셋이 같은지 볼 수도 있습니다. (3번 과정에 변수를 전체를 쓰는게 아닌 1개씩 모든 변수에 대해 반복하는 것입니다) 

위의 그림은 제가 예전에 했던 대회에서 변수 하나씩에 대해 Adversarial Validation을 진행한 것입니다. AUC를 보면 일부 변수들이 굉장히 높은 값을 가지고 있고 해당 변수의 경우 Train과 Test가 다른 분포를 가지고 있다라고 해석할 수 있습니다. 그리고, 이러한 변수는 성능에 악영향을 끼치니 제거해야합니다. 

 

Permutation Importance를 통한 변수 제거 

이제까지 봤던 변수 중요도의 경우 0 이상의 값을 가지는 중요도들입니다. 그로인해 해당 변수가 실제로 얼마나 나쁜 영향을 끼치는지에 대한 영향은 파악하기 어렵고, 상대적으로 다른 변수들대비 얼마나 좋냐 나쁘냐의 정도만 파악할 수 있습니다. 그러한 단점을 극복한 방법이 Permutation Importance 입니다. 

 

 

Permutation Importance의 계산 크게 2단계로 진행이 됩니다. 첫번째 단계에서는 원본 데이터를 학습 데이터와 검증 데이터로 나눈 후, 학습 데이터로 기존의 모델을 학습하는 과정을 거칩니다. 이후, 두번째 단계에서는 검증 데이터를 기반으로 Permutation Importance를 계산합니다. 이때, 계산의 경우 검증 데이터에 대한 점수와 "특정 변수를 섞은 이후"의 점수를 비교해서 성능 차이가 얼마나 났는지를 기반으로 중요도를 매깁니다. 이러한 방법은 해당 변수를 노이즈로 만들어 해당 변수의 유무에 따라 (노이즈가 있는 경우 없는 변수처럼 생각할 수 있습니다) 얼마나 모델이 영향을 받는지를 확인함으로서 해당 변수의 중요도를 파악하는 기법입니다. 

 

Permutation 변수 중요도 계산 결과

 

이렇게 하면 어떤 장점이 있을까요? 일단, 성능이 증가했는지 감소했는지 절대적인 의미의 중요도를 알 수 있습니다. 그로인해, 음의 중요도를 가지는 변수들은 삭제를 한다는 판단을 내리기 좋습니다. 그리고, 학습된 모델을 가지고 중요도를 매기기에 Inference만 변수들에 대해 반복할 뿐 학습은 한번만 수행해도 무방합니다. 하지만, 랜덤한 요소인 Permute가 어떻게 되었는지에 따라 변수 중요도가 많이 다를 수 있는 한계가 있습니다. 이걸 보완하기 위해 여러번의 반복실험을 통해 결과를 계산하고 평균과 편차를 낼 수도 있습니다. 실제 대회에서 가장 많이 언급되는 방법 중에 하나인 방법으로 Kaggle에서 많이 사용되니 참고하시기 바랍니다. 

 

Null Importance를 통한 변수 제거

Null Importance 방법

 

그 외에도 Target 변수를 섞는 Null Importance를 통해 변수를 제거하는 방법도 있으니 해당 글을 참고하시기 바랍니다. 해당 방법도 캐글의 HomeCredit 대회와 American Express 대회의 솔루션에서 사용된 방법으로 실무에서 활용하기 좋은 방법 중 하나입니다. 

 

참고자료 

- Dimensionality Reduction: Supervised Variable Selection