Project/부실가계 분류모델

부실가계 분류모델 - 모델링 및 성능평가(불균형 데이터 상황)

patrck_jjh 2021. 6. 3. 17:05

 

 

 

2021.05.21 - [Project/부실가계 분류모델 연구] - 부실가계 탐지 모형 데이터 전처리- 범주형데이터 encoding

 

부실가계 탐지 모형 데이터 전처리- 범주형데이터 encoding

2021.04.26 - [Project/가계 부채 분석] - 부실가계 탐지 모형 데이터 전처리- 파생변수 추가(DSR, DTA, HDRI, 부실가계) 부실가계 탐지 모형 데이터 전처리- 파생변수 추가(DSR, DTA, HDRI, 부실가계) 가계금융

patrickstar-jjh.tistory.com

 

 

 

<데이터 불러오기 및 추가 전처리>

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")

df = pd.read_csv('../data/2020가계부채/data_fin.csv', engine='python')
df

 

 최종적으로 전처리된 데이터를 불러왔다

 

 

 

df=df.drop(['부채','자산','순자산액', '가구주 직업(대분류)','가구주 만나이'],axis=1)
df.columns

여러가지 실험을 해본 결과 '부채', '자산' ,'순자산액' , '가구주 직업(대분류)' ,'가구주 만나이' 를 drop해주었다. 최종적으로 24개의 설명변수와 1개의 종속변수가 남았다.

 

 


<데이터 세트 나누기>

from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

X = df.iloc[:,1:-1]
Y = df.iloc[:,-1]

# 학습과 테스트 데이터 셋으로 분리
X_train , X_test , y_train , y_test = train_test_split(X, Y,
                                                       test_size=0.3,  random_state=369, stratify=Y)

 

먼저 X에 features(설명변수)를 Y에는 label(종속변수)를 저장했다. 

 

사이킷런 패키지를 활용하여 train data를 70%로 test data는 30%로 나누어 주었고 straify=Y로 설정함으로 써 부실가계 비중(7~8%)을 유지하며 데이터셋을 나눠주었다.

 

 

print('학습 데이터 레이블 값 비율')
print(y_train.value_counts()/y_train.shape[0] * 100)
print('테스트 데이터 레이블 값 비율')
print(y_test.value_counts()/y_test.shape[0] * 100)

 

부실가계를 의미하는 1의 값이 7~8%사이로 0의 값에 비해 상당히 작음을 알 수 있다.

 

 

 

<학습하기>

-성능지표 출력 함수

from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import roc_auc_score

# get_clf_eval 함수로 성능지표들 한눈에 보기

def get_clf_eval(y_test, pred):
    confusion = confusion_matrix( y_test, pred)
    accuracy = accuracy_score(y_test , pred)
    precision = precision_score(y_test , pred)
    recall = recall_score(y_test , pred)
    f1 = f1_score(y_test,pred)
    # ROC-AUC 추가 
    roc_auc = roc_auc_score(y_test, pred)
    print('오차 행렬')
    print(confusion)
    # ROC-AUC print 추가
    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\
    F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, recall, f1, roc_auc))
    
    
# get_model_train_eval 함수로 모델 학습과 성능지표(get_clf_eval)한번에 해결
def get_model_train_eval(model, ftr_train=None, ftr_test=None, tgt_train=None, tgt_test=None):
    model.fit(ftr_train, tgt_train)
    pred = model.predict(ftr_test)
    get_clf_eval(tgt_test, pred)  

 

 사이킷런 패키지를 이용하여 confusion matrix와 성능지표인 accuracy, precision, recall, f1, roc_auc를 출력해주는 함수를 get_clf_eval로 저장했다.

get_model_train_eval에는 모델의 학습과 성능지표 출력(get_clf_eval)을 한꺼번에 해주는 함수로 저장했다.

 

 

 

-의사결정나무

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# DecisionTree Classifier 생성
dt_clf = DecisionTreeClassifier(random_state=369)

dt_clf.fit(X_train, y_train)
dt_pred = dt_clf.predict(X_test)

# get_clf_eval() 함수를 이용하여 평가 수행. 
get_clf_eval(y_test, dt_pred) 

의사결정나무는 별도로 학습하고 get_clf_eval을 활용하여 성능지표를 출력해보았다.

 

 

-LightGBM

from lightgbm import LGBMClassifier

lgbm_clf = LGBMClassifier(n_estimators=1000, num_leaves=64, n_jobs=-1, boost_from_average=False)
#lgbm_clf = LGBMClassifier(learning_rate= 0.1, max_depth=3)

# get_model_train_eval 함수이용하여 학습 및 평가까지 한번에
get_model_train_eval(lgbm_clf, ftr_train=X_train, ftr_test=X_test, tgt_train=y_train, tgt_test=y_test)

 

LightGBM은 get_model_train_eval을 통해 학습과 동시에 성능지표를 출력했다.

 

 

-Logistic Regression

from sklearn.linear_model import LogisticRegression

# LogisticRegresstion
#lr_clf = LogisticRegression()
lr_clf = LogisticRegression(C=0.01, penalty='none')

lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)

# get_clf_eval() 함수를 이용하여 평가 수행. 
get_clf_eval(y_test, lr_pred)

로지스틱 회귀또한 get_model_train_eval을 통해 성능지표를 출력하였다.

 

 

 

<Git>

https://github.com/dudungE/house_debt_classification_model/blob/master/%EB%B6%80%EC%8B%A4%EA%B0%80%EA%B3%842020_modelling.ipynb