콘텐츠로 이동

다변량 처리와 Scorecard

4.1 BinningProcess — 다변량 일괄 처리

실무에서는 수십~수백 개 변수를 동시에 binning해야 한다. BinningProcess가 이를 자동화한다.

from optbinning import BinningProcess

variable_names = ["utilization_rate", "profit_margin", "sales_amount",
                  "years_in_business", "debt_ratio"]

binning_process = BinningProcess(
    variable_names=variable_names,
    categorical_variables=["industry_code"],  # 범주형 변수 지정

    # ── 전역 기본 파라미터 ──
    max_n_bins=7,
    min_bin_size=0.05,
    max_pvalue=0.05,

    # ── 변수별 개별 오버라이드 ──
    binning_fit_params={
        "utilization_rate": {"monotonic_trend": "descending"},
        "years_in_business": {"monotonic_trend": "ascending"},
        "profit_margin": {"monotonic_trend": "auto", "max_n_bins": 5},
    },

    # ── 자동 변수 선별 ──
    selection_criteria={"iv": {"min": 0.02}},  # IV < 0.02 변수 자동 제거

    # ── 병렬 처리 ──
    n_jobs=-1,  # 모든 CPU 코어 활용
)

binning_process.fit(X, y)

주요 파라미터

파라미터 설명
variable_names 처리할 전체 변수 목록
categorical_variables 범주형으로 처리할 변수 목록
binning_fit_params 변수별 OptimalBinning 파라미터 오버라이드 (딕셔너리)
selection_criteria IV 등 기준으로 변수 자동 선별. 예: {"iv": {"min": 0.02}}
fixed_variables selection_criteria와 무관하게 반드시 포함할 변수
n_jobs 병렬 처리 코어 수 (-1 = 전체)

전체 변수 WoE 변환

# 전체 DataFrame을 한 번에 WoE 변환
X_woe = binning_process.transform(X, metric="woe")

# 개별 변수 결과 확인
optb_util = binning_process.get_binned_variable("utilization_rate")
print(optb_util.binning_table.build())

변수 선별 결과 확인

# 선별된 변수 목록
print(binning_process.get_support(names=True))

# 각 변수의 IV 확인
summary = binning_process.summary()
print(summary[["name", "dtype", "iv", "quality_score"]])

4.2 Scorecard 클래스

BinningProcess + 로지스틱 회귀 + 점수 변환을 하나의 파이프라인으로 통합한다.

from optbinning import Scorecard
from sklearn.linear_model import LogisticRegression

scorecard = Scorecard(
    binning_process=binning_process,
    estimator=LogisticRegression(C=1.0, solver="lbfgs"),

    # ── 스코어 스케일링 ──
    scaling_method="pdo_odds",
    scaling_method_params={
        "pdo": 20,              # Points to Double the Odds
        "odds": 1/19,           # 기준 Odds (Bad:Good = 1:19)
        "scorecard_points": 600 # 기준 Odds에서의 점수
    },
    rounding=True,              # 정수 반올림
)

scorecard.fit(X_train, y_train)

스코어카드 테이블 출력

# 요약 테이블
print(scorecard.table(style="summary"))

# 상세 테이블 (Bin별 점수)
print(scorecard.table(style="detailed"))

스케일링 방식

scaling_method 설명
"pdo_odds" PDO(Points to Double the Odds) 기반. 업계 표준
"min_max" 점수 범위를 [min, max]로 고정. 예: {"min": 300, "max": 850}

예측

# 확률 예측
proba = scorecard.predict_proba(X_test)[:, 1]

# 점수 예측
scores = scorecard.score(X_test)

# 클래스 예측
labels = scorecard.predict(X_test)

4.3 실무 파라미터 체크리스트

상황 권장 설정
첫 시도, 변수 특성 모름 monotonic_trend="auto", solver="cp", max_n_bins=7
업무 논리상 방향 확실 monotonic_trend="ascending" 또는 "descending" 명시
소표본 (< 5,000건) min_bin_size=0.10, min_bin_n_event=20
대표본 (> 100,000건) max_n_prebins=50으로 Fine Bin 늘려 정밀도 향상
0값 Mass Point 존재 special_codes=[0]으로 0을 별도 Bin 분리
범주형 변수, 희귀 범주 多 cat_cutoff=0.05로 5% 미만 범주 자동 그룹화
특정 Bin이 IV 독점 gamma=0.01~0.05로 정규화
빠른 처리 필요 prebinning_method="quantile", max_n_prebins=10