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>
'Project > 부실가계 분류모델' 카테고리의 다른 글
부실가계 탐지 모형 - 결론 (0) | 2021.06.03 |
---|---|
부실가계 분류모델 - 모델링 및 성능평가(균형 데이터 상황) (0) | 2021.06.03 |
부실가계 분류모델 - 데이터 전처리(데이터 encoding) (0) | 2021.06.03 |
부실가계 분류모델 - 데이터 전처리(파생변수 생성) (0) | 2021.06.03 |