๐ชช HOME CREDIT #3:Modeling+Result
ํผ์ณ ์์ง๋์ด๋ง
์ด 99๊ฐ์ ๋ ๋ฆฝ๋ณ์๋ค ์ค์์ ๋ค์ค๊ณต์ ์ฑ์ ์ ๊ฑฐํ ๊ฒ์ด๋ค.
๋ค์ค๊ณต์ ์ฑ์ ์ ๊ฑฐํ๋ ์ด์ ๋ ๋ณ์๋ค ๊ฐ์ ์๊ด์ฑ์ด ๋์ ๊ฒฝ์ฐ ํ๊ท ๊ณ์ ์ถ์ ์ ๋ถ์์ ์ฑ ๋ฌธ์ ์ ๋ชจ๋ธ์ ์ ๋ขฐ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํนํ ํ๊ท ๊ณ์๋ฅผ ์งํ๋ก ์ฌ์ฉํ๋ ๋ก์ง์คํฑ ํ๊ท์ ๊ฒฝ์ฐ ๋ค์ค๊ณต์ ์ฑ ์ ๊ฑฐ๊ฐ ํ์์ด๋ค.
XGBoost ์ ๊ฐ์ ML ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ชจ๋ธ๋ง ๊ณผ์ ์์ ํ์ ๊ณผ์ ์ ์๋์ง๋ง,
๋ณ์๋ค ๊ฐ์ ์๊ด์ฑ์ด ๋์ ๊ฒฝ์ฐ ์ถํ ํน์ ๋ณ์์ ๋ณํ๊ฐ ๋ค๋ฅธ ๋ณ์๋ค์๋ ํฌ๊ฒ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ ์ ๋ขฐ์ฑ ํ๋ณด ์ฐจ์์์ ํ์ํ ๋จ๊ณ๋ผ๊ณ ์๊ฐํ๋ค.
๋ค์ค๊ณต์ ์ฑ ์ ๊ฑฐ๋ 1. ์๊ด๊ณ์ ๊ธฐ๋ฐ 2. VIF ๊ธฐ๋ฐ ์์๋ก ์งํํ๋ค.
IV ๊ณ์ฐ
๊ทธ ์ ์ ๊ฐ ๋ณ์์ IV๋ฅผ ๊ณ์ฐํด๋๋๋ก ํ๊ฒ ๋ค. ์ดํ ์๊ด์ฑ์ด ๋์ ๋ณ์๋ค ์ค IV ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
optbinning์ ํ์ฉํ Woe , IV ๊ณ์ฐ ์ฝ๋์ด๋ค.
# --- [Step 1] ๋ฐ์ดํฐ ์ค๋น ๋ฐ ๋ถํ ---
X, y = df.drop(columns='TARGET'), df['TARGET']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
feature_list = cat_cols + num_cols
# --- [Step 2] BinningProcess ์ค์ ๋ฐ ํ์ต ---
selection_criteria = {
"iv": {"min": 0.025, "max": 0.7, "strategy": "highest", "top": 30},
"quality_score": {"min": 0.01}
}
binning_process = BinningProcess(
variable_names=feature_list,
categorical_variables=cat_cols,
selection_criteria=selection_criteria
)
# Train ๋ฐ์ดํฐ๋ก Rule ํ์ต
binning_process.fit(X_train, y_train)
selection_criteria๋ก Woe ๋ฐ IV ๊ณ์ฐ์ ํ์ํ ๊ท์น๋ค์ ์ ํด์ฃผ์๋ค.
IV ๊ธฐ์ค์ ๋ฐ๋ผ 0.03 ์ด์์ ๋ณ์๋ค๋ง์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค.
์ต์ข ์ ์ผ๋ก ์ ์ ๋ 30๊ฐ ๋ณ์๋ฅผ IV ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ํ ๊ฒฐ๊ณผ์ด๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ EXT ๋ณ์๋ค์ด ๋ค๋ฅธ ๋ณ์๋ค์ ๋นํด IV ๊ฐ์ด ํฐ ๊ฑธ ์ ์ ์๋ค.
์ธ๋ถ ๊ธฐ๊ด์ ์ ์ฉ์ ์์ธ ๋งํผ ๊ทธ ์ด๋ค ๋ณ์๋ณด๋ค ๊ณ ๊ฐ์ ์ ์ฉ์ ํ๊ฐํ๋ ๋ฐ ํฐ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฑด ์ด์ฉ๋ฉด ๋น์ฐํ ์ฌ์ค์ด๋ค.
๊ทธ๋ฌ๋ ์ EXT ๋ณ์๋ค์ด ๋ค์ค๊ณต์ ์ฑ์์๋ ์๋ง ๋ช ๊ฐ ์ ์ธ๋ ๊ฑฐ๋ผ ์๊ฐํ๋ค.
๊ทธ ๋ค์์ผ๋ก๋ ๊ทผ๋ฌด ๊ธฐ๊ฐ, ๋์ด ๋ฑ์ ์์๋ก ์ ์ํ ๋ณ์์ธ๊ฑธ ์ ์ ์๋ค.
์ฃผ์ ๋ณ์๋ค์ ๊ตฌ๊ฐ๋ณ ๋ถ๋ํ๋ฅ ์ ์๊ฐํ ํด๋ณด์.
๋จผ์ EXT_3 ๋ณ์์ด๋ค.
‘์ ์ฉ์ ์๊ฐ ๋์ ์๋ก ๋ถ๋์จ์ด ๋ฎ๋ค’ ๋ผ๋ ์ผ๋ฐ์์์ ๋ถํฉํ๋ ๊ทธ๋ํ์ด๋ค.
์๋ง ๋
๋ฆฝ๋ณ์๋ค ์ค ๊ฐ์ฅ ๋จ์กฐ์ฑ์ด ์ ๋๋ฌ๋๋ ๋ณ์๊ฐ ์๋๊น ํ๋ค.
๊ทธ ๋ค์์ YEARS_EMPLOYED ๋ณ์ ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ณ์๊ฐ ๋จ์กฐ์ฑ์ ๋๋๊ฒ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ข๋ค๊ณ ๋ ํ์ง๋ง ์์ธ์ธ ๊ฒฝ์ฐ๋ ์๋ค.
๊ทผ์๋
์์ฒ๋ผ ์ญU์๊ฐ ์คํ๋ ค ๋น์ฆ๋์ค ๋ก์ง์ ๋ถํฉํ๋ ๊ฒฝ์ฐ์ด๋ค.
์ด ๊ฒฝ์ฐ์๋ ๊ทผ์๋
์๊ฐ ์ ์ฐ์ฐจ-์ค์ฐ์ฐจ์ผ์๋ก ๋ถ๋์จ์ด ๋์๊ฒ ๋ ํฉ๋ฆฌ์ ์ธ ํด์์ด๋ค.
์๊ด๊ณ์ ๊ณ์ฐ ๋ฐ ๋ณ์ ํ๋ฝ
์ด์ IV ๊ฐ๊น์ง ๋ค ๊ตฌํ์ผ๋ ์๊ด๊ณ์๋ฅผ ๊ณ์ฐํ์ฌ ๋ณ์๋ฅผ 1์ฐจ ํํฐ๋ง ํ๊ฒ ๋ค.
def remove_high_correlation(df_woe, iv_summary, threshold=0.8):
corr_matrix = df_woe.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
to_drop = set() # ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด set ์ฌ์ฉ
for column in upper.columns:
high_corr_vars = upper.index[upper[column] > threshold].tolist()
for var in high_corr_vars:
# IV ๊ฐ ์ถ์ถ ์ ์์ธ ์ฒ๋ฆฌ ์ถ๊ฐ
iv_col = iv_summary.loc[iv_summary['name'] == column, 'iv'].values[0]
iv_var = iv_summary.loc[iv_summary['name'] == var, 'iv'].values[0]
# IV๊ฐ ๋ฎ์ ์ชฝ์ drop
drop_target = column if iv_col < iv_var else var
to_drop.add(drop_target)
return list(to_drop)
low_iv_corr_vars = remove_high_correlation(X_train_woe, iv_summary, threshold=0.8)
X_train_reduced = X_train_woe.drop(columns=low_iv_corr_vars)
์๊ด๊ณ์๊ฐ ๋์ ๋ณ์ ์๊ณผ ๊ฐ ๋ณ์์ IV๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฝํ ๋ณ์์ด๋ค.
๊ทผ์์ผ์์ ๋์ด ๋ณ์์ ๊ฒฝ์ฐ ๋ด๊ฐ ํ์๋ณ์๋ฅผ ๋ง๋ค๊ณ ๊ธฐ์กด ๋ณ์๋ค์ ๋ฐ๋ก ์ ๊ฑฐ๋ฅผ ์ํด์ค์ ์๊ด๊ณ์๊ฐ 1์ด ๋์๋ค.
์ด๋ ๊ฒ 1์ฐจ์ ์ผ๋ก ์๊ด๊ณ์ ๊ธฐ๋ฐ ๋ณ์ ํํฐ๋ง์ ํ ํ VIF๋ฅผ ๊ณ์ฐํ์ฌ ๋ค์ ํํฐ๋งํ๊ฒ ๋ค.
VIF ๊ณ์ฐ ๋ฐ ๋ณ์ ํ๋ฝ
์๊ด๊ณ์๊ฐ ๋ณ์์ 1:1 ๊ด๊ณ๋ง ํ๋จํ๋ค๋ฉด, VIF๋ 1:N ์ ์๊ด์ฑ์ ํ๋จํ์ฌ ์ต์ข ์ ์ผ๋ก ๋ค์ค๊ณต์ ์ฑ์ ์ ๊ฑฐํ ์ ์๋ค.
def calculate_vif(df):
vif_data = pd.DataFrame()
vif_data["variable"] = df.columns
# ์์ํญ(intercept)์ ์ํ ์ํฅ์ ๋ฐฐ์ ํ๊ธฐ ์ํด ๋ณดํต WoE ๋ฐ์ดํฐ ๊ทธ๋๋ก ์ฌ์ฉ
vif_data["VIF"] = [variance_inflation_factor(df.values, i) for i in range(df.shape[1])]
return vif_data
def iterative_vif_reduction(df, threshold=10):
while True:
vif_df = calculate_vif(df)
max_vif = vif_df['VIF'].max()
if max_vif > threshold:
drop_var = vif_df.sort_values('VIF', ascending=False)['variable'].iloc[0]
print(f"Dropping '{drop_var}' with VIF: {max_vif:.2f}")
df = df.drop(columns=[drop_var])
else:
break
return df
X_train_final_woe = iterative_vif_reduction(X_train_reduced, threshold=10)
final_selection_list = X_train_final_woe.columns.tolist()
์ด ๊ฒฐ๊ณผ EXT_SOURCES_MEAN๊ฐ ํ๋ฝํ์๋ค.
๋๋ฆ EXT ๊ด๋ จํ์ฌ ํ์๋ณ์๋ค์ ๋ง๋ค์ด ๋จ๋๋ฐ ํ๋ฝํด๋ฒ๋ฆฌ ์ฝ๊ฐ ์์ดํ๋ค.
์ต์ข ๋ณ์
์ต์ข ์ ์ ๋ ๋ณ์๋ 21๊ฐ๋ก
'CODE_GENDER', 'NAME_INCOME_TYPE', 'NAME_EDUCATION_TYPE', 'OCCUPATION_TYPE', 'ORGANIZATION_TYPE', 'REGION_RATING_CLIENT_W_CITY', 'REG_CITY_NOT_WORK_CITY', 'FLAG_DOCUMENT_3', 'DAYS_EMPLOYED_ANOM', 'AMT_ANNUITY', 'AMT_GOODS_PRICE', 'REGION_POPULATION_RELATIVE', 'DAYS_REGISTRATION', 'EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3', 'LIVINGAREA_AVG', 'DAYS_LAST_PHONE_CHANGE', 'AGE', 'YEARS_EMPLOYED', 'PAYMENT_RATE'
์ด๋ค.
๋ณ์๋ค์ ๋ถ๋ฅํด๋ณด์๋ฉด,
| ๊ตฐ์ง | ๋ณ์๋ช | ์ค๋ฌด์ ์๋ฏธ ๋ฐ ํด์ |
|---|---|---|
| ํต์ฌ ์งํ | EXT_SOURCE_1 2 3 | ์ธ๋ถ ์ ์ฉ ์ ๋ณด. ๋ชจ๋ธ์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ณ๋ณ๋ ฅ์ ๊ฐ์ง |
| ์ํ ๋ฅ๋ ฅ | AMT_ANNUITY, PAYMENT_RATE, AMT_CREDIT | ์๋ ๋๋น ์๋ฆฌ๊ธ ๋น์ค ๋ฐ ์ํ ๊ฐ๋ฅ ์์ค์ ์ธก์ |
| ์์ ์ฑ/์ ๋ขฐ | AGE, YEARS_EMPLOYED, DAYS_ID_PUBLISH | ์ฐ๋ น ๋ฐ ๊ทผ์ ์ฐ์๋ ์๋ ์์ ์ฑ๊ณผ ์ ๋น๋กํ๋ ๊ฒฝํฅ์ด ์์ |
| ์ฌํ์ ์ง์ | OCCUPATION_TYPE, NAME_EDUCATION_TYPE | ์ง์ ๊ตฐ๊ณผ ๊ต์ก ์์ค์ ๋ฐ๋ฅธ ๋ถ๋ ์ํ ์ฐจ์ด๋ฅผ ๋ฐ์ |
| ์ฃผ๊ฑฐ/ํ๊ฒฝ | REGION_RATING_CLIENT_W_CITY, LIVINGAREA_AVG | ๊ฑฐ์ฃผ ์ง์ญ์ ๊ฒฝ์ ์ ์์ค ๋ฐ ์์ฐ ์ํ ์ถ์ |
์ด๋ ๊ฒ ํด์ํ๋ฉด ๋ ๋ฏํ๋ค.
Logistic Regression
์ ์ฉํ๊ฐ์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์ ํต ๋ชจํ์ธ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ์ต์ํค๊ณ ์ฑ๋ฅ์ ์ธก์ ํ๋ค.
์ด ๋ threshold๋ ์์๋ก 0.5๋ก ์ง์ ํ๋ ๋์ Youden’s J statistic ๋ฅผ ์ ์ฉํ์ฌ ์ต์ ์ threshold๋ฅผ ์ฐพ๋๋ก ํ์๋ค.
ํ์ธํด ๋ณผ ๊ฒฐ๊ณผ๋ก๋ AUC, Gini, KS ํต๊ณ๋, Confusion Matrix, ์ต์ ์ ์๊ณ๊ฐ, ๋ฑ๊ธ๋ณ ๋ถ๋์จ ์ด๋ค.
Test AUC: 0.7491
Test Gini: 0.4983
Test K-S Statistic: 0.3726
Optimal Threshold: 0.4918
[Optimized Classification Report]
precision recall f1-score support
0 0.96 0.67 0.79 56538
1 0.16 0.70 0.26 4965
accuracy 0.67 61503
macro avg 0.56 0.69 0.52 61503
weighted avg 0.90 0.67 0.75 61503
[Decile Analysis]
count bad_count bad_rate
decile
0 6151 1634 0.265648
1 6150 860 0.139837
2 6150 675 0.109756
3 6150 473 0.076911
4 6151 411 0.066818
5 6150 267 0.043415
6 6150 226 0.036748
7 6150 200 0.032520
8 6150 137 0.022276
9 6151 82 0.013331
๊ทธ๋ฆฌ๊ณ ROC ์ปค๋ธ์ด๋ค.
์ฌ๋ฏธ๋ํํ
๋ฌผ์ด๋ณด๋ AUC ๊ธฐ์ค 0.7 ์ด์์ด๋ฉด ์ํธํ ์ฑ๋ฅ์ด๋ผ๊ณ ๋ ํ๋ค.
ํ์ง๋ง ์๋ฌด๋๋ ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ๋ ์๊ณ , woe ๊ณผ์ ์์ ๋ ์ ๊ตํ ๋ถ์์ ํ์ง ์์์ ์ฑ๋ฅ์ด ๋ฎ๊ฒ ๋์ฌ ์๋ ์๋ค๊ณ ๋ณธ๋ค.
์ด ํ์ต ์ ์ threshold๋ฅผ ์์๋ก 0.5๋ก ๋๊ณ ๋ ํ์ตํด๋ดค๋๋ฐ, ๊ทธ ๋๋ ๋ถ๋ ๊ทธ๋ฃน์ recall์ด 0.1๋ก ์ฒ์ฐธํ ์์ค์ด์๋ค.
recall ์งํ๋ฅผ ๋์ด๊ธฐ ์ํด ์ต์ ์ ์๊ณ๊ฐ์ ์ฐพ์์ ๋ถ๋ฅํ์๋ค (precision์ ํฌ์์ ๊ณ๋ค์ธ.. ๊ทธ๋์ f1 score ์์ฒด๋ ํฌ๊ฒ ํฅ์๋์ง ์์๋ค)
๊ธ์ต๊ธฐ๊ด์์๋ ๋ถ๋ ๊ฐ๋ฅ์ฑ ๊ณ ๊ฐ์ ํ๋ณํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ recall์ ๋์ด๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค.
์ฆ,
“๋ถ๋์๋ฅผ ๋ ๋ง์ด ์ก์๋ด๊ธฐ ์ํด ๋์ถ์ ๊ฑฐ์ ๋นํ๋ ์ฌ๋ ์ค ์ค์ ๋ก๋ ๊ฐ์ ๋ฅ๋ ฅ์ด ์๋ ์ฌ๋(์ ์์ธ)์ด ์์ฌ ์๋ ๊ฒ์ ๊ฐ์ํ๊ฒ ๋ค.”
๋ ๋ป์ด ๋๋ค.
recall๊ณผ precision์ trade off ๊ด๊ณ์ธ ๋งํผ ๊ธฐ๊ด์์ ์ด๋์ ๋ ์ค์ ์ ์ค์ง์ ๋ฐ๋ผ ๋ถ๋ฅ ๊ธฐ์ค์ ์กฐ์ ํ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ๊ตฌ๊ฐ๋ณ ๋ถ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ์ฉ์ ์ ๊ตฌ๊ฐ์ด ๋์์๋ก(์ ์๊ฐ ๋์์๋ก) ๋ถ๋์จ์ด ๋ฎ์ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฆ, ๋ชจ๋ธ์ด “์ ์ฉ์ ์๊ฐ ๋ฎ์ ์๋ก ๋ถ๋์จ์ด ๋์์ง๋๊ฐ?“๋ฅผ ๋๋ฆ ์ ์ฆ๋ช ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
XGBoost
1๊ธ์ต๊ถ๊ณผ ๊ฐ์ด ์ ํต ๊ธ์ต ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ณณ์์๋ ๋ก์ง์คํฑ ํ๊ท๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง ์ ์ฉ ์ ๋ณด, ๊ธ์ต ๊ฑฐ๋ ์ ๋ณด ๋ฑ์ด ๋ถ์กฑํ ์ค์ ์ ์ฉ์ ๋ฐ ์ฌํ์ผ๋ฌ ๊ณ ๊ฐ์ ๊ฒฝ์ฐ ์ ํต ๊ธ์ต ๋ฐ์ดํฐ ์ธ์ ๋์ ์ ๋ณด๋ฅผ ๊ฒฐํฉํ์ฌ AI ๋ชจ๋ธ๋ก ์ ์ฉํ๊ฐ๋ฅผ ์งํํ๊ณ ์๋ค.
์ด ๋ฐ์ดํฐ์ ์ ๊ฒฝ์ฐ ๋์์ ๋ณด๋ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ก์ง์คํฑ ํ๊ท์ XGBoost ๊ฐ์ ์ฑ๋ฅ์ด ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ผ ๊ฑฐ ๊ฐ์ง๋ ์์๋ค.
xgb์ ํ๋ผ๋ฏธํฐ๋ ์๋์ ๊ฐ์ด ์ค์ ํ๋ค.
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'learning_rate': 0.05,
'max_depth': 4,
'subsample': 0.8,
'colsample_bytree': 0.8,
'random_state': 42,
'scale_pos_weight': (y_train == 0).sum() / (y_train == 1).sum() # ํด๋์ค ๋ถ๊ท ํ ํด์
}
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
[XGBoost Final Performance]
Test AUC: 0.7570
Test Gini: 0.5140
Test K-S Statistic: 0.3806
Optimal Threshold (Youden's J): 0.4888
[Optimized Classification Report]
precision recall f1-score support
0 0.96 0.69 0.80 56538
1 0.16 0.69 0.26 4965
accuracy 0.69 61503
macro avg 0.56 0.69 0.53 61503
weighted avg 0.90 0.69 0.76 61503
[Decile Analysis - Risk Ranking]
count bad_count bad_rate
decile
9 6151 1680 0.273126
8 6150 899 0.146179
7 6150 638 0.103740
6 6150 477 0.077561
5 6150 376 0.061138
4 6151 306 0.049748
3 6150 204 0.033171
2 6150 196 0.031870
1 6150 113 0.018374
0 6151 76 0.012356
๋ก์ง์คํฑ์ ๋นํด ์ฝ๊ฐ์ฉ ์ฑ๋ฅ์ด ๋ ์ ๋์๋ค.
๊ฒฐ๊ณผ ์๊ฐํ
EXT ๋ณ์์ผ ๋น์ฐํ ์ค์๋๊ฐ ๋์๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ, ํ๋ ฅ ๋ณ์๋ ๊ฝค ๋๊ฒ ๋์จ๊ฑธ ์ ์ ์๋ค.
ํ์ฌ ํ๋ ฅ ๋ณ์์ ๊ฒฝ์ฐ ๋ ๊ตฌ๊ฐ์ผ๋ก ๊ตฌ๊ฐํ๊ฐ ๋์ด ์๋ค.
- Academic degree, Higher education (EventRate : 0.053866 )
- Incomplete higher, Secondary / secondary special,Lower secondary (EventRate : 0.089380)
์ค์ ๋ก ๊ตญ๋ด ์ ์ฉํ๊ฐ์์๋ ํ๋ ฅ์ด ์ ์ฉ ์ ์์ ํฐ ์ํฅ์ ์ค์ง ๊ถ๊ธํ๋ค.
์ด์ฉ๋ฉด ๋จ์ํ ๊ณ ์กธ, ์ด๋์กธ, ๋์กธ ์ด ์๋๋ผ ์ธ์์ธ ๋ช์ ์ง๊ฑฐ๊ตญ ๋ช์ ์ด๋ฐ์์ผ๋ก ๋ ์ธ๋ถํ ๋์ด ์์ ์๋ ์๊ฒ ๋ค. (+ ํ๊ณผ ์ ๋ณด๋ ์์์๋)
Score Card
์ต์ข ์ ์ผ๋ก ์ค์ฝ์ด ์นด๋๋ฅผ ์๊ฐํํด๋ดค๋ค.
์ด์์ ์ธ ๊ฒฐ๊ณผ๋ ๋ ๊ทธ๋ฃน์ ๋ถํฌ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ผ ํ๋ค.
๋์ฒด๋ก ์ค๋ฐ์ ์๋์ ๊ณ ๊ฐ์ด ๋ชฐ๋ ค์๊ณ ๋ถ๋ ๊ณ ๊ฐ์ ๊ฒฝ์ฐ ์ด์ค๋ฐ ์ ์๋์ ๋ชฐ๋ ค์๋ ๊ฒ์ ์ ์ ์๋ค.
K-S ๊ฐ์ผ๋ก๋ ํ์ธํ๋ฏ์ด ์์ฒญ ๋ณ๋ณ๋ ฅ์ด ์์ด๋ณด์ด๋ ๊ฒฐ๊ณผ๋ ์๋๋ค.
SHAP
์ด๋ฒ์ SHAP ๋ฅผ ํ์ธํด๋ณด์๋ค.
๋ก์ง์คํฑ ํ๊ท์ ๋ฌ๋ฆฌ XGBoost๋ ๋ณ์ ๊ฐ์ ๋ณต์กํ ์ํธ์์ฉ์ ํ์ตํ๊ธฐ ๋๋ฌธ์ ‘์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์๋์ง’ ์ค๋ช
ํ๊ธฐ ์ด๋ ต๋ค. (๋ธ๋๋ฐ์ค๋ชจ๋ธ)
feature_importance๋ก ๋ณ์์ ์ค์๋๋ ํ์
ํ์ง๋ง ๊ทธ ๋ณ์๊ฐ ์ด๋ ๋ฐฉํฅ์ผ๋ก ์ํฅ์ ์ฃผ๋์ง๋ ํ์
ํ๊ธฐ ์ด๋ ต๋ค.
๊ทธ๋ํ ์์์ 0 ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ์ ๋ถ๋ํ๋ฅ ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ๋ ๋ณ์์ด๋ค. ๋ฐ๋๋ก ์ผ์ชฝ์ ๋ถ๋ํ๋ฅ ์ ๋ฎ์ถ๋ ๋ฐ ๊ธฐ์ฌํ๋ ๋ณ์์ด๋ค.
์นดํ ๊ณ ๋ฆฌ ๋ณ์์ ์์นํ ๋ณ์์ ๊ฒฐ๊ณผ ํํ์ ์ฐจ์ด๊ฐ ์์์ด ๋ณด์ธ๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉฐ ์ธ์ฌ์ดํธ๋ฅผ ์ฐพ์๋ณด์.
๋ฐฉํฅ์ฑ์ ์ผ์น (๊ฒฝ์ ํ์ ํ๋น์ฑ):
EXT_SOURCE 2 & 3: ๋์ ๊ฐ(๋นจ๊ฐ์)์ด ์ผ์ชฝ(๋ถ๋ ํ๋ฅ ๊ฐ์)์ ๋ชฐ๋ ค ์์. ์ฆ, ์ธ๋ถ ์ ์ฉ ์ ์๊ฐ ๋์์๋ก ์ฐ๋ ๊ณ ๊ฐ์ผ๋ก ํ๋จ -> ๋ชจ๋ธ์ ๋ ผ๋ฆฌ๊ฐ ํ๋นํจ
AGE: ๋ฎ์ ๊ฐ(ํ๋์, ์ ์ ์ธต)์ด ์ค๋ฅธ์ชฝ(๋ถ๋ ํ๋ฅ ์ฆ๊ฐ)์ ๋ถํฌ -> ์ผ๋ฐ์ ์ผ๋ก ์ฌํ ์ด๋ ์์ ๋ฆฌ์คํฌ๊ฐ ์๋์ ์ผ๋ก ๋๊ฒ ์ธก์ ๋๋ ๊ฒฝํฅ์ ๋ฐ์
LTV : LTV๋ ํ์๋ณ์๋ผ๋ ์ธก๋ฉด์์ ์์ฒ ๋ฐ์ดํฐ์๋ AMT_CREDIT, AMT_GOODS_PRICE๋ฅผ ๊ฐ๊ฐ ๋ชจ๋ธ์ ์ ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๊ธฐ์ฌํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํด์์์ ์ฃผ์ํ ์ฌํญ์ด ์๋ค.
SHAP ๊ฒฐ๊ณผ๋ง ๋ณด๋ฉด LTV๊ฐ ๋์ ์๋ก ๋ถ๋ ๋ฆฌ์คํฌ๊ฐ ๋ฎ๋ค ๋ก ํด์๋ ์ฌ์ง๊ฐ ์๋ค.(์ผ๋ฐ์ ์ผ๋ก LTV์ ๋ถ๋๋ฆฌ์คํฌ๋ ๋น๋ก๊ด๊ณ)
์ด๋ ๊ฒฐ๊ณผ๋ฅผ LTV๊ฐ ์ผ๋ก ํด์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
SHAP๋ฅผ ๋์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ LTV์ WOE์ด๋ค.
๋ฐ๋ผ์ LTV์ WoE๊ฐ ํด์๋ก(์ฐ๋ ๊ณ ๊ฐ ๋น์ค์ด ๋ง์์๋ก) ๋ถ๋ ๋ฆฌ์คํฌ๋ ๋ฎ์์ง๋ค๋ก ํด์ ํด์ผ ํ๋ค.
PDP
์ด๋ฒ์๋ ์ฃผ์ ๋ณ์๋ค์ Partial Dependence Plot์ ๊ทธ๋ ค๋ณด์
X์ถ์ ํด๋น ๋ณ์์ WoE ์ด๋ฉฐ Y์ถ์ ๋ถ๋์จ์ด๋ค.
๋ชจ๋ ๋ถ์์จ๊ณผ ์์ ๊ด๊ณ๋ฅผ ๋ณด์ธ๋ค๋ ์ ์์ ํ๋นํ๋ค.
๊ทธ๋ํ์ ๊ธฐ์ธ๊ธฐ๋ก ํด๋น ๋ณ์๊ฐ ๋ถ๋์จ์ ์ผ๋ง๋ ๋ฏผ๊ฐํ๊ฒ ์ํฅ์ ์ฃผ๋์ง ์ ์ ์์ผ๋ฉฐ,
์ธ๋ถ์ ์ผ๋ก๋ ๊ฐ ๊ทธ๋ํ์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ฐํ๋ผ์ง๋ ๊ตฌ๊ฐ์ ์ดํด๋ณด๋ ๊ฒ ์ค์ํ๋ค.
์ค์ต ์ฝ๋
๋ชจ๋ธ๋ง.ipynb