콘텐츠로 이동

피처 선택 · 파생변수

7.1 피처 선택 (Feature Selection)

출발점은 단변량 분석이다

ML 모형이라고 해서 변수를 무작정 넣고 Feature Importance만 보는 것은 아니다. 개별 변수의 유의성과 타당성을 먼저 확인하는 것이 출발점이다.

저자의 경우, ML 기반 모델링에서도 후보 변수에 대해 binning(구간화)을 수행한다. 구간별 Bad Rate 패턴을 눈으로 확인하면, 그 변수가 타겟과 어떤 관계를 가지는지 — 단조적인지, 비선형인지, 특정 구간에서만 유효한지 — 를 직관적으로 파악할 수 있다. 이 과정은 전통 스코어카드의 Fine Classing과 본질적으로 같다.

이렇게 하는 이유는 두 가지다.

  1. 도메인 타당성 검증: Feature Importance가 높더라도, 변수의 패턴이 비즈니스 로직에 반하면 투입해서는 안 된다. binning을 통해 "이 변수가 왜 유의한지"를 사전에 이해하고 설명할 수 있어야 한다.
  2. 노이즈 변수 사전 제거: IV가 극히 낮거나 패턴이 불안정한 변수를 미리 걸러두면, 이후 ML 학습의 효율성과 안정성이 높아진다.

단변량 분석으로 후보 풀을 정리한 뒤에, 변수 간 교호작용(interaction) 탐색을 거쳐, ML 기반 중요도 지표들을 활용하여 최종 변수를 선별한다.

2-way Interaction 탐색 — Joint IV

단변량 스크리닝으로 50~100개의 좋은 후보를 추렸다면, 그다음으로 확인할 것은 변수 간 교호작용이다. 변수 A 단독으로는 변별력이 보통이지만, 변수 B와 조합하면 특정 세그먼트에서 불량률이 급격히 달라지는 경우가 있다. 이런 조합 효과를 사전에 파악하면 변수 선정의 질이 높아진다.

가장 직관적인 방법은 Joint IV다:

개념 정의 의미
단변량 IV(X1) X1 단독의 Information Value X1 혼자의 변별력
단변량 IV(X2) X2 단독의 Information Value X2 혼자의 변별력
Joint IV(X1, X2) X1 × X2 cross-tabulation의 IV 두 변수 조합의 총 변별력
Marginal IV Joint IV − 단변량 IV 조합으로 인한 추가 변별력

Marginal IV가 크다는 것은, X2가 X1과 결합했을 때 X1 단독 대비 추가 정보를 제공한다는 뜻이다.

Joint IV의 "추가 정보" 안에는 실제로 두 가지가 섞여 있다: (1) X2의 고유 main effect(X1이 못 잡는 별도 패턴)와, (2) X1 × X2의 순수 interaction(두 변수가 동시에 특정 조합일 때만 나타나는 효과). Joint IV는 이 둘을 구분하지 않고 총량만 측정하지만, 변수 탐색 단계에서는 총량만으로 충분하다 — "추가 정보가 있는가?"가 중요하지, 그것이 main인지 interaction인지는 변수 선정 시점에서는 부차적이다.

EBM의 FAST 알고리즘과 동일한 사상

EBM(GA²M)이 interaction 쌍을 찾을 때 사용하는 FAST 알고리즘(Lou et al., KDD 2013)은 Joint IV와 논리 구조가 거의 동일하다:

Joint IV 방식 FAST 알고리즘
1단계 단변량 IV로 변수 선정 1-Depth GBM으로 main effect 학습
2단계 X1 × Xi의 Joint IV 계산 잔차에서 모든 쌍에 2×2 격자 적합
3단계 Marginal IV가 큰 쌍 선정 RSS 감소량이 큰 쌍 선정

차이는 지표(IV vs RSS)와 자동화 수준뿐이다. 둘 다 "개별 효과를 먼저 확인하고, 그 위에 조합 효과를 측정"하는 2-stage 논리를 따른다.

단일 Decision Tree로 조합을 찾으면 안 되는가

변수가 많을 때, 단일 decision tree(depth 3~4)를 적합하면 greedy search로 좋은 변수 쌍을 자동으로 찾아줄 것 같다. 그러나 문제가 있다. 핵심 변수 X1의 main effect가 압도적으로 크면, 트리가 X1으로만 반복 분기한다:

X1 > 100?
├── X1 > 200?
│   ├── X1 > 300?      ← X1만 3번 연속 분기
│   └── ...
└── X1 > 50?
    └── ...

X1의 구간을 더 세밀하게 쪼개는 것이 RSS 감소가 가장 크기 때문이다. 이러면 X2, X3와의 interaction은 아예 나타나지 않는다. 또한, 트리에서 X1 다음에 X2가 분기된다고 해서 반드시 interaction은 아니다 — X2의 main effect가 강해서 어디서든 분기될 수 있다. 진짜 interaction은 "X1의 값에 따라 X2의 효과가 달라지는 것"인데, 단일 트리의 분기 구조만으로는 이 구분이 어렵다.

결론: 단일 트리는 main effect와 interaction을 구분하지 못한다. 이 구분을 하려면 Joint IV(= 조합 효과에서 개별 효과를 빼는 것)나 잔차 기반 접근(= main effect를 먼저 제거하고 남은 것을 보는 것)이 필요하다.

Feature Importance (Split 기반)

트리 앙상블이 학습 과정에서 자연스럽게 산출하는 변수 중요도다.

지표 의미
Split count (Frequency) 해당 변수가 분할에 사용된 횟수
Gain 해당 변수의 분할이 가져온 loss 감소량의 합
Coverage 해당 변수의 분할이 영향을 미친 샘플 수

Split count의 함정

카디널리티가 높은 변수(예: 우편번호)는 분할 후보가 많아서 split 횟수가 부풀려진다. Gain 기반 중요도가 더 신뢰할 수 있으며, SHAP 기반 중요도가 가장 정확하다.

Permutation Importance

변수의 값을 무작위로 섞은 뒤 성능이 얼마나 떨어지는지로 중요도를 측정한다.

장점 단점
모형에 의존하지 않음 (model-agnostic) 상관된 변수가 있으면 중요도가 분산됨
과적합에 강건 (Validation 데이터 사용) 변수 수 × 반복 횟수만큼 연산 필요
해석이 직관적 변수 간 교호작용을 개별 변수에 귀속시킴

SHAP 기반 피처 선택

SHAP의 평균 절대값 \(\text{mean}(|\text{SHAP}_j|)\)으로 변수 중요도를 측정한다.

SHAP 기반 중요도는 Split Importance, Permutation Importance보다 이론적으로 가장 정확하다. Shapley value의 공정한 기여도 분배 성질에 의해, 변수 간 상관관계와 교호작용을 올바르게 처리한다.

실무에서의 피처 선택 전략

하나의 방법에 의존하기보다, 여러 방법의 결과를 종합하는 것이 안전하다.

  1. 1차 스크리닝: Gain 기반 Feature Importance로 중요도 하위 변수 제거
  2. 2차 검증: Permutation Importance로 교차 확인
  3. 최종 해석: SHAP Summary Plot으로 선택된 변수의 방향성·패턴 검증
  4. 도메인 판단: 통계적으로 유의하더라도 비즈니스 로직에 반하는 변수는 제외

중요도가 0인 변수의 원인

Global Feature Importance — TreeSHAP의 \(\text{mean}(|\phi_j|)\), Permutation Importance, Split 기반 Gain — 에서 중요도가 정확히 0으로 나오는 변수가 있다. 이런 변수는 세 가지 원인으로 분류된다.

원인 설명 예시
진짜 무의미 타겟과 아무 통계적 관계가 없는 변수. 전체 트리에서 한 번도 split에 사용되지 않음 고객 ID, 랜덤 노이즈, 의미 없는 코드값
다중공선성 (Redundancy) 더 나은 상관 변수에 밀려서 선택되지 못한 변수. 단독으로는 유의미하지만 상위 변수가 이미 같은 정보를 흡수 DTI와 상관계수 0.95인 부채비율 변형 변수
Regularization 효과 colsample_bytree, max_features 등 서브샘플링으로 반복적으로 후보에서 제외되어, 약한 변수가 기회를 얻지 못함 수백 개 변수 중 경쟁에서 탈락한 약한 변수

0 = 쓰레기가 아닐 수 있다

두 번째 원인(다중공선성)이 실무에서 특히 중요하다. A 변수와 B 변수의 상관이 매우 높을 때, 모든 split에서 A가 미세하게 더 나으면 B의 importance는 0에 수렴한다. 그러나 A를 제거하면 B가 그 역할을 대체한다. 이런 변수를 "무의미"로 판단하면 안 된다.

중요도 0인 변수를 제거할 때는, 단순히 importance 값만 볼 것이 아니라 상관 변수 그룹 내에서의 역할을 함께 확인하는 것이 안전하다.

중요도 기반 변수 제거 전략

실무에서는 단변량 분석과 ML 기반 중요도를 2단계로 결합하여 변수를 정리한다.

1단계 — 단변량 스크리닝

전통적 변수 선정 프로세스(IV, 단변량 LR 등)를 통과한 변수만 ML 모형의 후보로 투입한다. 이 단계에서 타겟과 무관한 변수, 안정성이 낮은 변수(PSI 기준), 비즈니스 로직에 반하는 변수가 사전에 걸러진다.

전통 스코어카드 변수 선정과의 차이

1단계 스크리닝 자체는 전통 스코어카드와 크게 다르지 않다 — IV 기준으로 변별력을 보고, PSI로 안정성을 체크하는 흐름은 동일하다. 다만 두 가지 점에서 에너지 배분이 달라진다.

  • 상관분석을 느슨하게 해도 된다: 로지스틱 회귀에서는 다중공선성이 β 추정을 불안정하게 만들므로 상관이 높은 변수를 엄격히 걸러야 했다(Part 4 참조). 트리 앙상블은 상관된 변수를 투입해도 β 왜곡 같은 문제가 없으므로, "일단 넣고 모형이 알아서 선택하게" 하는 전략이 가능하다.
  • WoE 변환에 시간을 쏟지 않는다: 전통 스코어카드에서 가장 노동 집약적인 단계가 Fine/Coarse Classing → WoE 변환이었다. ML에서는 이 과정이 구조적으로 불필요하므로, 1단계에서는 IV 등으로 변별력만 빠르게 확인하고 넘어간다.

2단계 — ML Importance 기반 하위 제거 시뮬레이션

1단계를 통과한 변수로 ML 모형을 학습한 뒤, 중요도 하위 n%를 제거하면서 성능 변화를 관찰한다. SHAP 기반 중요도로 변수를 정렬하고, 하위부터 순차적으로 제거하면서 AUC 변화를 추적하는 방식이다.

전형적인 결과 패턴:

Drop  0% → 150개 변수, AUC=0.7823
Drop  1% → 149개 변수, AUC=0.7823   ← 변화 없음
Drop  5% → 143개 변수, AUC=0.7821   ← 거의 동일
Drop 10% → 135개 변수, AUC=0.7818   ← 미미한 하락
Drop 15% → 128개 변수, AUC=0.7805   ← 하락 시작
Drop 20% → 120개 변수, AUC=0.7780   ← 유의미한 하락

이 결과에서 성능 하락이 시작되는 지점 직전이 최적 제거 비율이 된다. 위 예시에서는 하위 10%까지는 제거해도 무방하다고 판단할 수 있다.

변수를 줄이는 것의 실무적 가치

AUC가 동일하다면, 변수가 적은 모형이 항상 우월하다.

  • 운영 비용 절감: 모형에 투입되는 변수 수 = 데이터 파이프라인에서 관리해야 할 변수 수
  • 모니터링 부담 감소: 변수별 PSI 모니터링, 결측률 관리 등의 부담이 줄어든다
  • 안정성 향상: 불필요한 변수가 향후 데이터 분포 변화에 의해 노이즈를 유입할 가능성을 사전 차단

Importance 유형 간 차이에 대한 주의

동일한 변수라도 어떤 중요도 지표를 사용하느냐에 따라 결과가 달라질 수 있다.

지표 중요도 0의 의미 다중공선성 영향
Split Gain 단 한 번도 split에 사용 안 됨 심함 — 상관 변수 중 하나만 선택, 나머지는 0
Permutation Importance 섞어도 성능 변화 없음 중간 — 상관 변수끼리 중요도를 나눠 가짐 (둘 다 낮게 나옴)
SHAP \(\text{mean}(\|\phi_j\|)\) 어떤 예측에도 기여하지 않음 가장 정확 — Shapley value의 공정 분배 성질로 교호작용·상관관계를 이론적으로 올바르게 처리

같은 변수, 다른 결과

A, B 두 변수의 상관이 매우 높을 때:

  • Split Gain: A=높음, B=0 (승자 독식)
  • Permutation: A=중간, B=중간 (둘 다 섞어도 나머지가 보상 → 개별 중요도 희석)
  • SHAP: A=높음, B=높음 (둘 다 실제 기여를 공정하게 반영)

따라서 Split Importance에서 0이라고 바로 제거하면, 실제로는 유의미한 변수를 놓칠 수 있다. SHAP 기반 중요도를 우선 기준으로 사용하고, Split/Permutation은 교차 확인용으로 활용하는 것이 안전하다.


7.2 파생변수 생성 (Interaction Feature Engineering)

트리 모형은 depth ≥ 2에서 변수 간 교호작용(interaction)을 자동으로 학습한다. 그럼에도 불구하고, 명시적 파생변수를 만들어 투입하면 성능이 개선되는 경우가 있다.

실무에서 자주 쓰는 파생변수 유형

무작위로 변수를 곱하거나 나누는 전수탐색보다, 도메인 논리에 기반한 파생변수가 실무에서 훨씬 효과적이다. 특히 많이 쓰이는 유형은 비율/비중증감률 두 가지다.

(1) 비율 / 비중

전체 대비 특정 항목의 비중을 계산하는 변수다.

\[ \text{비중}(\%) = \frac{\text{부분 금액}}{\text{전체 금액}} \times 100 \]
파생변수 산식 범위 의미
카드사용 비중 카드사용금액 / 총 출금금액 × 100 0~100% 지출 중 카드 의존도
이용률 (Utilization) 카드 사용액 / 한도 × 100 0~100% 신용 여력 소진 정도
DTI (Debt-to-Income) 총 부채 / 연 소득 × 100 0~∞ 상환 부담 대비 능력

(2) 증감률

과거 대비 현재의 변화율을 측정하는 변수다.

\[ \text{증감률}(\%) = \frac{\text{현재 금액} - \text{과거 금액}}{\text{과거 금액}} \times 100 \]
파생변수 산식 범위 의미
카드사용 증감률 (올해 사용액 - 작년 사용액) / 작년 사용액 × 100 -100% ~ ∞ 소비 패턴 변화
소득 증감률 (현재 소득 - 전년 소득) / 전년 소득 × 100 -100% ~ ∞ 소득 안정성

증감률은 이론적으로 상한이 없으므로(예: 10만 원 → 1,000만 원이면 +9,900%), 실무에서는 상한선(upper limit)을 설정하여 capping한다.

분모가 0인 경우의 처리

비율과 증감률 모두 분모가 0이면 정의되지 않는다. 이 경우의 처리가 파생변수 설계에서 가장 까다로운 부분이다.

상황 예시 처리 방법
분모 = 0, 분자 = 0 작년 사용액 0, 올해 사용액 0 증감률 = 0% (변화 없음)
분모 = 0, 분자 > 0 작년 사용액 0, 올해 사용액 100만 특이치(Special Value)로 정의 — 별도 코드 부여
분모 = 0, 분자 < 0 (해당되는 경우) 위와 동일하게 특이치 처리

특이치 정의를 상세하게 해야 한다

"분모가 0이면 NaN으로 처리"는 가장 위험한 접근이다. "작년에 카드를 전혀 안 쓰다가 올해 처음 쓰기 시작한 고객"은 리스크 관점에서 매우 의미 있는 세그먼트다. 이를 결측으로 날려버리면 중요한 정보가 소실된다.

실무에서는 분모 0인 케이스를 별도 범주(Special Value)로 정의하고, 해당 범주의 Bad Rate를 확인하여 모형에서 독립적으로 취급한다. 트리 모형에서는 이 Special Value가 자연스럽게 별도 리프로 분리된다.

기타 파생변수 유형

유형 예시 의미
차이 소득 - 월 상환액 가처분 소득 (순 효과 포착)
연체 횟수 × 평균 연체 금액 연체의 빈도와 규모를 동시에 반영
조건부 조합 연체 횟수 × (대출 잔액 > 0) 특정 조건하의 효과

이 유형들도 유용하지만, 비율/증감률 대비 활용 빈도는 낮다.

자동 탐색보다 도메인 설계가 우선이다

모든 변수 쌍에 대해 곱/나눗셈을 전수탐색하는 방식이 있지만, 실무에서는 효과가 제한적이다.

한계 설명
트리가 이미 잡는다 depth ≥ 2면 변수 간 조건부 분기를 자동으로 학습 — 명시적 파생변수가 없어도 됨
노이즈 변수 증가 수천 개의 파생변수 중 대부분은 무의미
도메인 논리 부재 "왜 이 조합이 의미 있는가"를 설명할 수 없으면, 모형 검증에서 걸린다

파생변수 생성 원칙

  1. 도메인 논리가 먼저: "이 비율이 왜 리스크와 관련되는가?"를 설명할 수 있어야 한다
  2. 분모 0 처리를 명확히: 특이치 정의 없이 파생변수를 만들면 NaN이 폭발한다
  3. 트리의 능력을 신뢰: depth가 충분하면 대부분의 interaction은 모형이 알아서 학습한다
  4. 변수 수 관리: 파생변수를 무분별하게 추가하면 모니터링·운영 부담이 증가한다

7.3 전통 스코어카드 vs 트리 모형의 전처리 요약

단계 전통 스코어카드 트리 앙상블
구간화 Fine → Coarse Classing (수작업) 불필요 — 트리 split이 대체
변별력 측정 WoE/IV Feature Importance / SHAP
범주형 처리 WoE 변환 Label / Target / Native Categorical
결측치 별도 구간화 XGB/LGBM 자동 처리
이상치 Capping + 구간 경계 조정 대부분 자동 분리 (float32 예외 주의)
스케일링 WoE가 스케일 통일 불필요 — 순서만 보는 구조
변수 선택 IV 기준 → 단변량 LR → 정보영역별 Importance → Permutation → SHAP
소요 시간 변수당 수십 분 (수동 검토) 자동화 가능 — 수백 개 변수를 분 단위로 처리

변수 수백 개를 한꺼번에? — 전문 길이 제한

학술 논문이나 Kaggle에서는 변수를 수백 개씩 넣어 학습하지만, 금융기관 ↔ CB사 간 실시간 스코어링 환경에서는 변수 개수에 물리적 제약이 있다.

신용조회 전문(API)은 고정 길이 프로토콜로 주고받는 경우가 많고, 전문 한 건의 최대 길이가 정해져 있다. 변수 하나를 추가하면 전문 필드가 늘어나므로, 모형이 아무리 좋아도 전문 규격에 맞지 않으면 배포할 수 없다.

실무적 결과:

  • 모형 개발 시점부터 사용 가능한 변수 풀(pool)이 전문 규격으로 제한
  • 변수 추가/변경 시 전문 규격 변경 → 양사 간 협의 + 시스템 개발 필요
  • ML 모형이 수백 개 변수를 자유롭게 쓸 수 있다는 전제는 CB 전문 규격에 구애받지 않는 Batch 환경(행동 스코어링, 사후 심사 등)에서 주로 성립

결국 "좋은 변수가 좋은 모형을 만든다"의 전제에는 "쓸 수 있는 변수"의 물리적 한계도 포함된다.

다음 섹션

변수 처리 방법을 이해했으니, 다음으로 뉴럴넷에서 신경망의 기초와 로지스틱 회귀와의 관계를 살펴본다.