Project/부실가계 분류모델

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

patrck_jjh 2021. 6. 3. 17:28

 

 

2021.05.25 - [Project/부실가계 분류모델 연구] - 부실가계 분류모델 - 의사결정나무, LightGBM(불균형 데이터 상황)

 

부실가계 분류모델 - 의사결정나무, LightGBM(불균형 데이터 상황)

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

patrickstar-jjh.tistory.com

 

 이번에는 트리기반 알고리즘인 의사결정나무와 LightGBM, 로지스틱 회귀 그리고 인공신경망 모형을 만들고 성능을 평가해볼 것이다.

 

 

 

<SMOTE(오버샘플링)>

from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=369)
X_train_over, y_train_over = smote.fit_sample(X_train, y_train)
print('SMOTE 적용 전 학습용 피처/레이블 데이터 세트: ', X_train.shape, y_train.shape)
print('SMOTE 적용 후 학습용 피처/레이블 데이터 세트: ', X_train_over.shape, y_train_over.shape)

print('SMOTE 적용 전 레이블 값 분포: \n', pd.Series(y_train).value_counts())
print('SMOTE 적용 후 레이블 값 분포: \n', pd.Series(y_train_over).value_counts())

 

 기존 X_train, y_train data set에 오버샘플링 기법인 SMOTE를 적용하여 oversampling한 뒤 각각 X_train_over, y_train_over로 저장해 주었다. SMOTE를 적용후 1의 값이 11668로 늘어나 데이터의 균형이 맞추어졌다.

 

 

 


 

<모델링 및 평가>

1. 의사결정나무

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

# DecisionTree Classifier 생성
dt_clf = DecisionTreeClassifier(random_state=369, max_depth=6, min_samples_split=2)
get_model_train_eval(dt_clf, ftr_train=X_train_over, ftr_test=X_test,
                  tgt_train=y_train_over, tgt_test=y_test)

GridSearchCV를 참고하여 max_depth=6, min_samples_split=2로 주요 하이퍼파라미터를 설정하고 평가지표를 출력했다.

 

 

피처 중요도 또한 출력해보았다.

 

 

 

2. LightGBM

lgbm_clf = LGBMClassifier(learning_rate= 0.01, max_depth=7)

get_model_train_eval(lgbm_clf, ftr_train=X_train_over, ftr_test=X_test,
                  tgt_train=y_train_over, tgt_test=y_test)

 

GridSearchCV를 참고하여 learning_Rate=0.01, max_depth=7로 하이퍼파라미터를 설정하고 평가지표를 출력했다.

 

 

 LightGBM 또한 피처 중요도를 출력해보았다.

 

 

 

 

3. 로지스틱 회귀

lr_clf = LogisticRegression(C=0.01, penalty='none')
# ftr_train과 tgt_train 인자값이 SMOTE 증식된 X_train_over와 y_train_over로 변경됨에 유의
get_model_train_eval(lr_clf, ftr_train=X_train_over, ftr_test=X_test, tgt_train=y_train_over, tgt_test=y_test)

GridSearchCV를 참고하여 C=0.01, penalty='none'으로 하이퍼파라미터를 설정하고 평가지표를 출력했다.

 

 

 

4. 인공신경망

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy
import tensorflow as tf

# 시드설정
numpy.random.seed(369)
tf.random.set_seed(369)


# 모델을 설정
model = Sequential()
model.add(Dense(24, input_dim=24, activation='relu'))         # 레이어 1개로                      
model.add(Dense(1, activation='sigmoid'))
model.summary()

# 모델을 컴파일
model.compile(loss='binary_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
# 모델을 실행
model.fit(X_train_over, y_train_over, epochs=8, batch_size=10, validation_split=0.2)      # SMOTE 후

# 결과를 출력
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))

먼저 X_train_over와 y_train_over를 이용하여 학습시켜준다.

 

# 최종결과값으로 반환하기(0,1)

y_predict = model.predict(X_test)    # 소수점?
y_predict

result=[]

for i in y_predict:
  if i >0.5:
    result.append(1)
  else:
    result.append(0)
    

labels = y_test
predictions = result

 출력층 활성화 함수가 sigmoid이므로 결과 값은 확률로 주어진다. 그러므로 0.5이상인 값은 1로 그렇지 않은 값은 0으로 변환하여 result에 저장한다. 그리고 실제 값인 y_test는 labels에 예측값은 result는 predictions에 저장한다.

 

 

get_clf_eval(labels,predictions)

최종적으로 인공신경망 모형의 성능지표를 출력했다.

 

 

 

<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