Table of Contents

Python

Classification에서의 IV: Information Value

꼬꼬마코더 2024. 5. 30. 12:53
728x90

IV: Information Value

Classification에서 "IV"는 일반적으로 Information Value를 의미합니다. Information Value는 변수와 목표 변수(종속 변수) 간의 관계를 평가하는 데 사용되는 통계적 측정치입니다. 이는 주로 신용 점수 모델링이나 이진 분류 문제에서 변수 선택 및 모델의 예측력을 평가하는 데 사용됩니다.

Information Value는 주어진 변수의 각 범주에 대해 좋은 사건(good)과 나쁜 사건(bad)의 비율 차이를 계산하여 그 변수의 예측력을 나타냅니다. IV 값이 높을수록 그 변수는 목표 변수를 잘 설명할 수 있음을 의미합니다.

IV 값의 해석은 다음과 같습니다:

  • IV < 0.02: 매우 낮은 예측력
  • 0.02 ≤ IV < 0.1: 낮은 예측력
  • 0.1 ≤ IV < 0.3: 중간 예측력
  • 0.3 ≤ IV < 0.5: 높은 예측력
  • IV ≥ 0.5: 매우 높은 예측력

Information Value는 다음과 같은 수식으로 계산됩니다:

[ IV = \sum (WOE_i \times (P(Good)_i - P(Bad)_i)) ]

여기서,

  • ( WOE_i )는 Weight of Evidence로, 각 범주에 대한 WOE 값을 나타냅니다.
  • ( P(Good)_i )와 ( P(Bad)_i )는 각각 해당 범주의 좋은 사건과 나쁜 사건의 비율입니다.

WOE는 다음과 같이 계산됩니다:

[ WOE_i = \ln\left(\frac{P(Good)_i}{P(Bad)_i}\right) ]

이와 같은 방법으로 Information Value는 변수의 예측력을 정량적으로 평가하는 유용한 도구가 됩니다.

 

IV 파이썬 코드

Information Value (IV)를 계산하는 예시 코드를 Python으로 보여드리겠습니다. 이 예제에서는 Pandas와 NumPy 라이브러리를 사용하여 간단한 데이터셋에 대해 IV를 계산합니다.

import pandas as pd
import numpy as np

# 예제 데이터셋 생성
data = {'feature': [1, 2, 2, 1, 2, 3, 3, 3, 1, 2],
        'target': [0, 0, 1, 0, 1, 1, 0, 1, 0, 1]}

df = pd.DataFrame(data)

# 변수와 목표 변수를 지정
feature = 'feature'
target = 'target'

# 범주별 데이터 계산
grouped = df.groupby(feature)[target].agg(['count', 'sum'])
grouped.columns = ['total', 'bad']
grouped['good'] = grouped['total'] - grouped['bad']

# 전체 좋은 사건과 나쁜 사건의 수 계산
total_good = grouped['good'].sum()
total_bad = grouped['bad'].sum()

# 각 범주에 대한 비율 계산
grouped['good_rate'] = grouped['good'] / total_good
grouped['bad_rate'] = grouped['bad'] / total_bad

# Weight of Evidence (WOE) 계산
grouped['WOE'] = np.log(grouped['good_rate'] / grouped['bad_rate'])

# Information Value (IV) 계산
grouped['IV'] = (grouped['good_rate'] - grouped['bad_rate']) * grouped['WOE']
information_value = grouped['IV'].sum()

print(f'Information Value for {feature}: {information_value}')
print(grouped)

이 코드는 다음과 같은 작업을 수행합니다:

  1. 간단한 데이터셋을 생성합니다.
  2. 각 범주별로 좋은 사건과 나쁜 사건의 수를 계산합니다.
  3. 각 범주에 대한 좋은 사건 비율(good_rate)과 나쁜 사건 비율(bad_rate)을 계산합니다.
  4. 각 범주에 대한 Weight of Evidence (WOE)를 계산합니다.
  5. Information Value (IV)를 계산하고 출력합니다.

코드를 실행하면 주어진 데이터셋에 대한 IV 값이 출력됩니다. 각 범주에 대한 WOE와 IV 값을 확인할 수도 있습니다.

 

IV값을 활용하는 방법: 파이썬 코드

Information Value (IV)를 계산한 후, 다음 단계에서는 IV 값을 활용하여 변수를 선택하고 모델을 개선하는 작업을 진행할 수 있습니다. IV 값은 각 변수의 예측력을 나타내므로, 이를 기반으로 변수를 선택하거나 모델링에 활용할 수 있습니다. 아래는 IV 값을 활용하는 몇 가지 방법입니다.

1. 변수 선택

IV 값을 기준으로 모델에 포함할 변수를 선택할 수 있습니다. 예를 들어, IV 값이 특정 임계값보다 낮은 변수를 제거하여 모델의 복잡성을 줄이고 성능을 개선할 수 있습니다.

예시

# IV 임계값 설정
iv_threshold = 0.1

# IV 값이 임계값 이상인 변수 선택
selected_features = [feature for feature, iv in iv_dict.items() if iv >= iv_threshold]
print(f'Selected features based on IV threshold: {selected_features}')

2. 변수 변환

IV 값을 활용하여 변수를 변환하거나 범주형 변수를 이진 변수로 변환하는 작업을 할 수 있습니다. 예를 들어, WOE 값을 사용하여 변수를 변환하면 모델의 성능을 향상시킬 수 있습니다.

예시

# WOE 값을 이용한 변수 변환
df['feature_woe'] = df['feature'].map(grouped['WOE'])
print(df)

3. 모델링

변수를 선택하거나 변환한 후, 이를 사용하여 예측 모델을 구축할 수 있습니다. 일반적으로 IV 값을 사용하여 변수를 선택한 후 로지스틱 회귀, 의사결정 나무, 랜덤 포레스트 등의 모델을 학습시킵니다.

예시

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 데이터 분할
X = df[['feature_woe']]
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 로지스틱 회귀 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 성능 평가
print(classification_report(y_test, y_pred))

4. 피쳐 엔지니어링

IV 값을 기반으로 피쳐 엔지니어링을 통해 모델 성능을 개선할 수 있습니다. IV 값이 높은 변수를 조합하거나 상호작용 항을 추가하여 모델의 설명력을 높일 수 있습니다.

예시

# 새로운 피쳐 생성 (예: 상호작용 항 추가)
df['new_feature'] = df['feature_woe'] * another_feature_woe

# 다시 모델링에 사용
X = df[['feature_woe', 'new_feature']]
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 로지스틱 회귀 모델 학습 및 평가
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

이와 같이 IV 값을 활용하면 변수 선택, 변수 변환, 모델링 및 피쳐 엔지니어링 등 다양한 방식으로 모델의 성능을 개선할 수 있습니다.