본문 바로가기
머신러닝

지도학습 - 대출 승인 결과 분류 예측모형 / Tree,SVM

by Seungyoon1786 2024. 11. 14.

이제 남은 Tree모형과 SVM 모형으로 예측 후, 해당 모형들을 이용한 앙상블모형을 작성하겠다.

 

6.  Tree 

이번에는 결정 트리(Decision Tree) 모델을 사용한 대출 승인 예측 사례를 다룬다. 트리 모형은 데이터를 여러 특성을 기준으로 분류하는 알고리즘으로, 분할을 통해 예측을 수행하는 구조를 가지고 있다. 이번 예측 결과로 훈련 세트에서는 100%의 정확도를 보여, 모델이 훈련 데이터에 완벽히 맞춰졌음을 확인했다. 이는 트리 모형의 특성상 과적합이 발생하기 쉬운 점을 보여준다. 테스트 세트에서는 약 89.46%의 정확도를 기록했으며, 훈련 데이터 대비 테스트 성능이 다소 낮아 모델이 훈련 데이터에 과도하게 적합되어 일반화 성능이 저하될 가능성을 시사한다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report

# 기본 결정 트리 모델 초기화
tree = DecisionTreeClassifier(random_state=42)

# 모델 학습
tree.fit(X_train_scaled, y_train)

# 훈련 세트와 테스트 세트 예측
y_train_pred_tree = tree.predict(X_train_scaled)
y_test_pred_tree = tree.predict(X_test_scaled)

# 훈련 세트 성능 평가
train_accuracy = accuracy_score(y_train, y_train_pred_tree)
print("결정 트리 기본 모델 훈련 세트 성능:")
print(f"정확도: {train_accuracy:.4f}")
print(classification_report(y_train, y_train_pred_tree))

# 테스트 세트 성능 평가
test_accuracy = accuracy_score(y_test, y_test_pred_tree)
print("\n결정 트리 기본 모델 테스트 세트 성능:")
print(f"정확도: {test_accuracy:.4f}")
print(classification_report(y_test, y_test_pred_tree))

'''결정 트리 기본 모델 훈련 세트 성능:
정확도: 1.0000
              precision    recall  f1-score   support

           0       1.00      1.00      1.00     20368
           1       1.00      1.00      1.00      5691

    accuracy                           1.00     26059
   macro avg       1.00      1.00      1.00     26059
weighted avg       1.00      1.00      1.00     26059


결정 트리 기본 모델 테스트 세트 성능:
정확도: 0.8946
              precision    recall  f1-score   support

           0       0.94      0.93      0.93      5099
           1       0.75      0.78      0.76      1416

    accuracy                           0.89      6515
   macro avg       0.84      0.85      0.85      6515
weighted avg       0.90      0.89      0.90      6515'''


하이퍼파라미터 튜닝은 Stratified K-Fold 교차 검증을 사용하여 수행하였으며, 주요 파라미터로는 최대 깊이(max_depth), 최소 샘플 분할 수(min_samples_split), 최소 샘플 리프 수(min_samples_leaf) 등이 있다. 최대 깊이는 모델의 분할 깊이를 제한하여 과적합을 완화할 수 있으며, 최소 샘플 분할 수와 리프 수는 각 노드가 분할되는 기준 샘플 수를 지정해 모델의 복잡도를 제어한다. 최적의 하이퍼파라미터 조합은 {'max_depth': 10, 'min_samples_split': 5, 'min_samples_leaf': 2}로 도출되었다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# Stratified K-Fold 교차 검증 설정
stratified_kfold = StratifiedKFold(n_splits=5)

# 결정 트리 하이퍼파라미터 설정
param_grid_tree = {
    'max_depth': [None, 5, 10, 15, 20],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# GridSearchCV를 통한 최적의 결정 트리 모델 찾기 (Stratified K-Fold 적용)
grid_search_tree = GridSearchCV(
    DecisionTreeClassifier(random_state=42),
    param_grid_tree,
    cv=stratified_kfold,   # Stratified K-Fold 적용
    scoring='accuracy'
)
grid_search_tree.fit(X_train_scaled, y_train)

# 최적 하이퍼파라미터와 검증 정확도 출력
print("결정 트리 최적 하이퍼파라미터:", grid_search_tree.best_params_)
print("결정 트리 검증 정확도 (교차 검증 평균 정확도):", grid_search_tree.best_score_)

#결정 트리 검증 정확도 (교차 검증 평균 정확도): 0.92

 

결정 트리 훈련 세트 성능: 정확도: 0.9348, 정밀도: 0.9793, 재현율: 0.7166, F1-점수: 0.8276

결정 트리 테스트 세트 성능: 정확도: 0.9249, 정밀도: 0.9352, 재현율: 0.7034, F1-점수: 0.8029


최적의 하이퍼파라미터 조합으로 모델을 훈련한 후 성능을 평가한 결과, 훈련 세트에서 약간의 과적합이 완화되었지만, 테스트 성능에서는 약간의 성능 저하가 발생하였다. 최적화 후에도 테스트 세트와 훈련 세트 성능의 차이가 다소 존재하는데, 이는 트리 모형의 복잡도 때문일 수 있다. 트리 모델은 직관적으로 해석 가능하지만, 복잡한 데이터 구조에서는 가지가 많아져 과적합이 발생하기 쉽기 때문에 추가적인 모델 선택이 필요할 수도 있다.


혼동 행렬 분석 결과, TN과 TP 값이 높아 모델이 다수의 샘플을 정확히 예측하고 있음을 확인했으며, FN 값이 상대적으로 많아 실제 긍정을 부정으로 예측하는 경향이 나타났다. 이는 모델이 일부 중요한 긍정 샘플을 놓칠 수 있음을 시사하며, 향후 개선 시 고려할 사항이다.

 

가지치기한게 이 정도 (사실 그냥 상위 부분만 보면되긴 함)
특성 중요도 시각화

또한 시각화부분에서는 추가로 Plot Tree를 사용해보았으나, 모델의 복잡성이 높아 트리 자체가 매우 깊고 노드가 많아서 트리 모형을 특성 중요도로 시각화하였다. 해당 과정으로 특성의 트리 전체에 걸친 기여도를 비교하며 모델의 과적합을 확인할 수 있었다. 원-핫 인코딩으로 등급에 따른 컬럼들처럼 여러 특성이 추가된 모습이다.

 

7. SVM

 SVM(Support Vector Machine) 모델을 사용하도록 하겠다. SVM은 최적의 분류 경계를 찾아 데이터의 일반화 성능을 높이는 지도 학습 모델이다. 이번 실험에서 SVM은 훈련 세트에서 91.67%, 테스트 세트에서 90.97%의 정확도를 보였으며, 훈련 데이터와 테스트 데이터 간 성능 차이가 크지 않아 비교적 안정적인 일반화 성능을 확인할 수 있었다.

 

# SVM 모델 학습 및 평가
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

# 기본 SVM 모델 초기화
svm = SVC(probability=True, random_state=42)  # ROC 커브에 사용할 확률 예측 활성화

# 모델 학습
svm.fit(X_train_scaled, y_train)

# 훈련 세트와 테스트 세트 예측
y_train_pred_svm = svm.predict(X_train_scaled)
y_test_pred_svm = svm.predict(X_test_scaled)

# 훈련 세트 성능 평가
train_accuracy = accuracy_score(y_train, y_train_pred_svm)
print("SVM 기본 모델 훈련 세트 성능:")
print(f"정확도: {train_accuracy:.4f}")
print(classification_report(y_train, y_train_pred_svm))

# 테스트 세트 성능 평가
test_accuracy = accuracy_score(y_test, y_test_pred_svm)
print("\nSVM 기본 모델 테스트 세트 성능:")
print(f"정확도: {test_accuracy:.4f}")
print(classification_report(y_test, y_test_pred_svm))

'''SVM 기본 모델 훈련 세트 성능:
정확도: 0.9167
              precision    recall  f1-score   support

           0       0.91      0.99      0.95     20368
           1       0.94      0.66      0.78      5691

    accuracy                           0.92     26059
   macro avg       0.93      0.82      0.86     26059
weighted avg       0.92      0.92      0.91     26059


SVM 기본 모델 테스트 세트 성능:
정확도: 0.9097
              precision    recall  f1-score   support

           0       0.91      0.98      0.94      5099
           1       0.92      0.64      0.76      1416

    accuracy                           0.91      6515
   macro avg       0.91      0.81      0.85      6515
weighted avg       0.91      0.91      0.90      6515'''

 

 SVM 모델은 하이퍼파라미터 C와 gamma 값에 민감하기 때문에 RandomizedSearchCV를 사용해 효율적으로 최적화 작업을 수행하였다 (그리드 서치 사용시 엄청 오래걸림 -> 효율성을 위해 PCA도 활용함). C는 마진을 조절하여 과적합을 방지하고, gamma는 커널 함수의 영향 범위를 결정하여 모델이 데이터 패턴에 대한 민감도를 조정한다. 최적화 범위로 C 값은 [0.1, 1, 10, 100], gamma는 [0.001, 0.01, 0.1, 1]로 설정했으며, kernel은 ['rbf', 'linear'] 중에서 선택했다. 그 결과, 최적의 하이퍼파라미터 조합은 {'svm__kernel': 'rbf', 'svm__gamma': 0.01, 'svm__C': 1, 'pca__n_components': 10}로 도출되었다.

 

# 하이퍼 파라미터
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# PCA와 SVM을 파이프라인으로 설정
pipeline = Pipeline([
    ('pca', PCA()),  # 차원 축소, n_components는 GridSearchCV에서 최적화
    ('svm', SVC(probability=True, random_state=42))  # SVM 모델, 확률 예측 활성화
])

# 하이퍼파라미터 범위 설정
param_distributions = {
    'pca__n_components': [5, 10, 15],
    'svm__C': [0.1, 1, 10, 100],
    'svm__gamma': [0.001, 0.01, 0.1, 1],
    'svm__kernel': ['rbf', 'linear']
}

# RandomizedSearchCV 설정 및 최적화
random_search = RandomizedSearchCV(
    pipeline,
    param_distributions=param_distributions,
    n_iter=10,  # 평가할 조합의 개수
    cv=5,
    scoring='accuracy',
    random_state=42
)

# 모델 학습
random_search.fit(X_train_scaled, y_train)

# 최적의 모델과 하이퍼파라미터 출력
best_svm = random_search.best_estimator_
print("최적 하이퍼파라미터:", random_search.best_params_)
print("SVM 검증 정확도 (교차 검증 평균 정확도):", random_search.best_score_)

'''최적 하이퍼파라미터: {'svm__kernel': 'rbf', 'svm__gamma': 0.01, 'svm__C': 1, 'pca__n_components': 10}
SVM 검증 정확도 (교차 검증 평균 정확도): 0.8753596464059366'''

 

SVM 재훈련 세트 성능: 정확도: 0.8778, 정밀도: 0.8510, 재현율: 0.5338, F1-점수: 0.6561

SVM 재테스트 세트 성능: 정확도: 0.8761, 정밀도: 0.8410, 재현율: 0.5304, F1-점수: 0.6505 

 

최적화된 하이퍼파라미터 조합으로 훈련한 모델의 성능은 훈련 세트에서 정확도 87.78%, 테스트 세트에서 87.61%로 기록되었으며, 과적합 없이 안정적인 예측 성능을 보였다. 다만, 재현율이 0.5304로 다소 낮아 실제 양성 샘플을 일부 놓치는 경향이 있었으며, F1-점수0.6505로 균형 잡힌 성능을 보였다.