이번 글은 이전 글에서 작성한 개념을 적용한 실전 사례 중심 내용이다. 그러니 이전 글을 읽고 오면 좋다.
머신러닝 프로세스에서 변수 선택 방법 - Filter methods, Wrapper methods, Embedded methods
실전 사례 1 - Correlation 기반 selection
Kaggle IEEE-CIS Fraud Detection 대회에서 일부 변수들을 상관계수(Correlation) 기반으로 제거했다. 실제로 feature들이 V299 ~ V321같이 무의미한 변수명을 사용해서 해당 데이터가 무슨 데이터인지 파악하기 어려웠다.
데이터를 뭘 써야할지, 하나하나 분석하기도 좀 그렇고, 데이터가 많다 보니 오버피팅도 일어났었다.
이때 솔루션에서 제공한 게 어떻게 변수를 선택할지에 대한 제안으로 correlation 기반 selection 제거 방법을 제안했었다. 근데 이때 단순하게 correlation 기반으로 제거하는 게 아니라, 변수의 상관성이 높은 집단을 먼저 찾은 후에 집단에 속한 원소가 많은, cardinality가 가장 높은 변수가 이 데이터중에 가장 설명이 잘될것이다. 라고 해서 그거 하나를 선택해서 대표변수로 설정한 전적이 있다.
상관계수 기반 변수 선택
- 상관도가 높은 변수가 많을 때 유용
- 변수 집합 중 상관계수가 높은 하위 집합을 찾아, 가장 원소의 개수가 많은 변수를 대표 변수로 선택
실전 사례 2 - Feature importance 기반 selection
모델에서 자체적으로 중요도가 낮은걸 알고 기여도를 줄이기는 하지만, 변수 중요도가 아예 0이거나, 너무 낮다 싶은 변수를 그냥 제거를 해주는 솔루션도 존재했었다.
임베디드가 알아서 기여한거랑 다르게, 변수 중요도를 보고 중요도가 낮은걸 강제로 삭제하고 다시 학습시킨 경우도 있다.
학습된 트리 모델의 중요도를 기반으로 중요도가 낮은 변수들을 제거하는 방법
- Feature importance가 낮을수록 모델 성능 향상에 상대적으로 적은 기여를 할 것이라는 가정
- 트리 모델의 성능에 따라 최적의 변수 조합을 선택
실전 사례 3 - Permutation Importace 기반 selection
이 방법은 실제 Kaggle 대회에서 많이 사용된 기법 중 하나다.
Permutation Importance는 모델이 어떤 피처(feature)에 얼마나 의존하는지 평가하는 방법이다. 이 방법을 사용하면 모델의 예측 성능이 특정 피처에 의해 얼마나 좌우되는지 알 수 있다.
학습된 모델을 활용하여 검증 데이터셋(Valid Dataset)을 예측한 결과를 바탕으로, 각 피처(feature)를 하나씩 랜덤하게 섞은 후 그 결과를 비교해 보는 방식이다. (여기서 피처를 섞는다는 것은, 검증 데이터셋의 각 피처(예: 나이, 성별, 몸무게 등)의 값을 랜덤하게 바꾸는 것을 의미한다. 예를 들어, “나이” 피처를 섞는다면, 검증 데이터셋의 모든 “나이” 값이 무작위로 섞여서 원래의 순서가 뒤바뀌는 것이다.)
피처를 섞는 이유는, 랜덤하게 섞인 피처는 더 이상 의미 있는 정보가 아니라는 것을 가정하기 때문이다. 학습된 모델이 정상적인 데이터와 랜덤하게 섞인 데이터를 비교할 때, 만약 섞은 피처로 인해 모델 성능이 크게 하락한다면, 해당 피처는 모델에 중요한 역할을 했다는 의미다. 반대로 성능 변화가 거의 없다면, 그 피처는 모델에 큰 기여를 하지 않았다는 뜻이다.
이 과정에서 피처를 제거하거나 값을 0으로 채우는 방법도 생각할 수 있지만, 이 경우 실제로 피처를 사용한 예측이 불가능해지거나, 실제로 피처 값이 0인 경우와 혼동될 수 있다. 따라서 피처를 무작위로 섞어 의미 없는 데이터로 만들어 모델 성능 변화를 관찰하는 방법이 효과적이다.
검증 데이터셋의 Feature를 하나하나 shuffle 하며 성능 변화를 관찰하는 방법
- Shuffle의 의미 = 해당 Feature를 Noise(의미 없는 변수)로 만드는 과정
만약 해당 Feature가 중요한 역할을 하고 있었다면, 모델 성능이 크게 하락할 것
- 검증 데이터셋 Feature의 shuffle로 인해 모델이 학습했던 분포와 크게 달라져 모델의 예측 성능이 하락
👉 해당 Feature가 상대적으로 모델 성능에 기여를 많이 했을수록 성능 하락폭이 큼
적용 과정 예시
1-1. 먼저 원본 데이터가 있을 때, 학습 데이터와 검증 데이터로 나눈다.
1-2. 학습 데이터로 학습한 모델에게 이름, 나이, 성별 데이터를 주고 몸무게(Y) 값을 추론을 하게 한다.
1-3. 실제 Y값과 Y_Pred 값의 차이를 계산한다.
👉 먼저 기존의 학습 데이터셋을 이용해 학습된 모델로 검증 데이터셋에 대한 예측값을 산출한 후, Target과 비교해 원본 평균 성능을 산출한다.
- Target은 모델이 예측하고자 하는 실제 값을 의미한다. 여기서는 ’몸무게 (Label)’가 Target이다. 모델은 입력 데이터(이름, 나이, 성별)를 사용해 이 Target 값을 예측하려고 한다.
2-1. '이름' feature를 무작위로 섞어주고 (루루, 라라, 티티 -> 라라, 티티, 루루)
2-2. 이제 섞인 데이터를 모델에 입력하여 예측을 수행한다. 그리고 섞기 전과 후에 예측 결과가 어떻게 달라졌는지 비교한다.
2-3. 원본 평균 성능 값과, Permute 이후 평균 성능 값과 비교해서 얼마나 큰 차이가 생겼는지에 따라 이름 feature가 얼마큼 기여했는지 평가를 내리게 된다. (여기서 예측 성능이 크게 떨어진다면, “이름” 피처가 중요한 역할을 했다는 것을 의미한다.)
해당 데이터에서는 값이 크게 차이 나기 때문에(2.83, 5.60 -> 5.56, 2.90) 이름이라는 변수는 꽤 높은 기여를 하고 있구나.라고 생각할 수 있다.
더 나아가 나이, 성별들도 섞어서 동일하게 진행했을 때 이 차이가 어떤 순위를 가지는지에 따라 누구를 변수를 선택하고, 아니면 제거할지 결정 내릴 수 있다.
👉 검증 데이터셋의 특정 변수들을 무작위로 Permutation을 통해 Noise로 작용하게 만들고, 이에 따른 예측값을 산출해 Target과 비교 후 Permutation 이후 성능을 산출
3. Permutation 전 원본 성능과 Permutation 후 성능의 차이를 통해 변수의 중요도를 판단한다.
👉 성능 차이가 클수록 모델이 해당 Feature의 Permutation에 영향을 많이 받은 것을 의미
👉 해당 변수가 상대적으로 중요하다고 해석 가능
Permutation importance의 해석
Permutation으로 인해 random성이 존재하므로, N번 반복해 중요도를 산출한다. - N번 반복에 따른 평균 ± 분산으로 표시
Permutation 성능 감소량이 양수의 값을 가지는 변수들은 상대적으로 중요하다.
- 중요할수록 위로 올라오고 중요하지 않을수록 아래로 내려감 (F-13, f_42는 중요한 변수)
- Permutation이 모델에 상대적으로 큰 영향을 미친다는 의미
주의할 점
- Feature 개수가 많다면 효율적이지 못할 가능성이 존재한다.
- Random permutation에 의존하기 때문에, 실행마다 Feature importance 결과가 상이할 수 있는 문제가 있다.
Target permutation
위 방법과 유사한 기법으로 Target permutation이라는 기법도 있다.
Target Permutation은 피처가 아닌 타겟 변수(Target Variable)를 셔플하여 모델의 중요도를 평가하는 기법이다. 이 방법은 모델이 타겟 변수와 피처 간의 관계를 얼마나 잘 학습하는지를 평가하는 데 사용된다.
👉 Shuffle 된 Target 변수 모델을 학습시킨 후, Feature importance와 Actual feature importance를 비교해 변수를 선택한다.
- 기존의 Permutation Importance: 피처를 셔플 하여 피처의 중요도를 평가
- Target Permutation: 타겟 변수를 셔플하여 피처 중요도를 평가. 즉, 타겟 변수와 피처 간의 관계가 얼마나 강한지를 알아보는 방법
진행 과정
- Null Importance 도출:
- Target 변수를 여러 번 임의로 Shuffle. 즉, 타겟 값들이 원래의 데이터 순서에서 무작위로 섞이게 된다.
- 이 섞인 타겟 변수로 모델을 학습시킵니다. 이때, 타겟 변수는 피처들과 원래의 관계를 잃어버리게 된다.
- 그런 후, 이 학습된 모델로부터 피처 중요도를 계산한다. 이 중요도를 Null Importance라고 부른다.
- Null Importance는 모델이 타겟과 무관한 데이터에서 피처를 얼마나 중요하게 여기는지를 보여준다. 사실상, 피처와 타겟 간의 관계가 없기 때문에, 이 중요도는 무작위적인 값에 가까워야 한다.
- Original Importance 도출:
- 타겟 변수를 셔플하지 않고, 원래 데이터셋을 사용하여 모델을 학습하고 피처 중요도를 계산한다. 이 중요도가 Original Importance
- Original Importance는 모델이 원래의 타겟과 피처 간의 관계를 학습한 결과로 얻은 피처 중요도를 의미한다.
- 중요도 비교:
- Null Importance와 Original Importance를 비교하여, 실제로 타겟 변수와 관계가 깊은 중요한 피처들을 선택할 수 있다.
- 만약 어떤 피처의 Original Importance가 Null Importance보다 크게 나타난다면, 그 피처는 타겟 변수와 강한 관계를 가진 중요한 피처로 판단할 수 있다.
장점
- Feature들끼리의 상호작용을 고려 가능
- 높은 분산을 가지거나, Target 변수와 관련 없는 변수들을 쉽게 도출 가능
실제로 오른쪽 두 개의 그래프처럼 real target의 importance와 target을 셔플 했을 때 나오는 importance의 차이가 많이 나면, 유의미한 변수다.라는 판단이 된다.
Target permutation에서의 변수 선택 -> Scoring
1) Actual importance와 Null importance distribution이 떨어진 표본수 계산
2) Actual/Null Max, Mean 등의 비율을 계산해 선택
Adversarial Validation
학습 데이터셋과 검증 데이터셋(굳이 이 두 개뿐만 아니라 df1, df2도 가능)이 얼마나 유사한지 판단하는 방법
- 학습 데이터셋의 Target 값은 1로, 검증 데이터셋은 0으로 지정 후 Binary classification 모델링
- 만약 학습 데이터셋과 검증 데이터셋의 경향이 비슷하다면, 위 모델의 분류 성능은 낮을 것
- 만약 학습 데이터셋과 검증 데이터셋의 경향이 다르다면, 위 모델의 분류 성능은 높을 것
👉 이 모델의 분류에 도움이 되는 Feature를 찾을 수 있다면 그 Feature는 과적합을 유발할 수 있으므로 제거하는 방식
진행 과정
학습과 검증 데이터셋에서 상이한 분포를 갖는 변수를 제거하는 방법
- 학습 데이터셋은 0, 검증 데이터셋은 1로 변수 설정
- 학습 데이터셋 df1, 검증 데이터셋 df2
- df1[train_label] = 0, df2[train_label] = 1
- pd.concat([df1, df2])
- 학습 + 검증의 데이터셋을 무작위로 분할
- pd.concat([df1, df2]) 이 데이터를 무작위로 분할
- random_train, random_valid 생성
- 위 2번 데이터로 1번의 Target을 분류하도록 모델 학습
- random_train을 통해서 df1인지 df2인지 학습해서 해당 부분을 검증
- 3.의 모델 결과를 AUC나 Feature importance를 해석
- 3의 결과로 검증이 손쉽게 모델이 분류를 했다(df1, df2 분류)하면 이건 둘이 다르다는 의미
- AUC나 Feature importance를 통해서 잘했는지, 못했는지 검증. 잘했으면 feature importance를 봐서 어떤 피쳐가 큰 영향을 가졌는지 해석
AUC는 “Area Under the Curve”의 약자로, 주로 이진 분류(Binary Classification) 문제에서 모델의 성능을 평가하는 데 사용된다. AUC는 ROC 곡선 (Receiver Operating Characteristic Curve) 아래의 면적을 의미하며, 모델이 분류 작업에서 얼마나 잘 작동하는지를 나타낸다.
- AUC는 이진 분류 문제에서 모델의 성능을 평가하기 위한 지표
- AUC가 높을수록 모델이 두 데이터셋을 잘 구분할 수 있다는 의미이며, Adversarial Validation에서 AUC가 높은 피처는 학습과 검증 데이터셋 간의 차이를 잘 드러내는 변수
- Adversarial Validation에서 AUC가 높은 피처는 모델 성능에 악영향을 미칠 수 있으므로 주의가 필요하다.
실전 사례
위에서 설명한 Adversarial validation은 한번에 결합해서 진행한거면, 아래 그래프 자료는 Adversarial validation를 feature 단위로 진행해서 feature가 끼치는 영향도를 파악한 자료다.
아까완 다르게 df1[feat1], df2[feat1]처럼 feature 하나만 뽑아서 feature1이 이 둘 구별을 얼마나 잘하는지 AUC score를 뽑는다. 그리고 마찬가지로 feat2, feat3 등등 모든 feature를 진행해서 AUC를 뽑아서 각 feature가 얼마나 영향력이 있는지 그 영향도를 파악할 수 있다.
그에 따라 직접적으로 변수제거에 용이하다.
AUC가 높은 변수의 경우, 학습과 검증 데이터셋이 다른 분포를 가진 변수들이므로 성능에 악영향을 끼칠 가능성 존재한다는 판단을 할 수 있다.
'ML' 카테고리의 다른 글
데이터 저장소 Data Source, Data Lake, Data Warehouse, Data Mart 기본 개념 (0) | 2024.10.24 |
---|---|
p-value, R²(결정 계수), β(베타 계수) 해석 (3) | 2024.09.25 |
선형회귀분석과 머신러닝의 차이 (0) | 2024.09.20 |
선형 회귀모델과 상관관계 분석 (1) | 2024.09.04 |
머신러닝 프로세스에서 변수 선택 방법 - Filter methods, Wrapper methods, Embedded methods (0) | 2024.09.03 |