이번에는 앞에서한 로지스틱 회귀분석+KNN+Tree+SVM의 모델들의 결과로 투표하는(Voting)방식과, baging - 랜덤 포레스트, boosting - 그레디언트 부스팅을 사용하여 에측해보겠다.
- 보팅: 서로 다른 모델 결합, 독립적 학습.
- 배깅: 같은 모델을 여러 번 학습(데이터 샘플링), 병렬 학습.
- 부스팅: 약한 모델이 순차적으로 학습하며 오류를 보완, 단계적 학습
8. 앙상블 모형 - Voting( 로지스틱 회귀분석+KNN+Tree+SVM )
Voting Classifier는 서로 다른 알고리즘을 결합하여 예측 성능을 높이는 앙상블 기법으로, 데이터의 다양한 특성을 반영하며 일반화 성능을 강화할 수 있다. 서로 다른 알고리즘을 하나의 모델로 묶어 예측 성능을 향상시키며, 개별 모델의 강점을 조합하는 데 초점이 맞춰져 있다. 보팅 방식은 크게 두 가지로 나뉜다:
- 하드 보팅: 각 모델의 예측 결과 중 다수결로 최종 클래스를 결정.
- 소프트 보팅: 각 모델의 예측 확률을 평균하여 최종 클래스를 결정. 소프트 보팅은 모델의 확률 기반 예측을 반영하므로, 더 정밀한 결과를 얻을 수 있다. -> 일반적으로 많이 씀
이번 실험에서는 결정 트리, SVM, KNN, 로지스틱 회귀 네 가지 알고리즘을 결합한 Voting Classifier를 사용했다. 각 모델은 다음과 같은 방식으로 설정되었다:
- 결정 트리: 최대 깊이 10, 최소 샘플 분할 수 2로 설정해 과적합을 방지.
- SVM: PCA로 차원을 10개로 축소한 뒤 RBF 커널과 C=1, gamma=0.01 설정.
- KNN: 이웃 수 15, 거리 척도로 맨해튼 거리 사용.
- 로지스틱 회귀: L2 정규화와 C=0.1로 안정성 확보.
Voting Classifier는 소프트 보팅 방식을 사용해 개별 모델의 예측 확률을 결합했다. 실험 결과, Voting Classifier는 테스트 정확도 88.55%를 기록하며, 개별 모델보다 향상된 성능을 보였다. 이는 각 모델의 장점을 결합함으로써 데이터의 다양한 패턴을 반영한 결과다.
혼동 행렬의 경우에는 True Positive와 True Negative 값이 매우 높아 Voting Classifier가 대부분의 샘플을 정확히 예측하고 있음을 확인할 수 있다. False Negative가 FP보다 높은 것은 일부 긍정 클래스를 놓치고 있음을 시사한다.
Voting Classifier는 서로 다른 알고리즘의 강점을 결합하여 더 높은 예측 성능을 달성할 수 있는 효과적인 방법이다. 특히 소프트 보팅 방식을 사용해 개별 모델의 확률 기반 예측을 반영함으로써 더 정밀한 결과를 도출할 수 있었다. Voting Classifier는 개별 모델 대비 더 나은 성능을 보여주며, 앙상블 기법이 데이터 예측에 효과적임을 입증했다.
9. 앙상블 모형 - Bagging / 랜덤 포레스트
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 하이퍼파라미터 범위 재조정 (과적합 완화 목적)
param_distributions_rf = {
'n_estimators': [100, 200, 300], # 트리 개수
'max_depth': [10, 15, 20], # 최대 깊이 제한
'min_samples_split': [5, 10, 15], # 노드 분할 최소 샘플 수 증가
'min_samples_leaf': [2, 5, 10], # 리프 노드 최소 샘플 수 증가
'max_features': ['sqrt', 'log2'] # 특성 고려 범위 축소
}
# RandomizedSearchCV를 통한 랜덤 포레스트 최적화
rf_clf = RandomForestClassifier(random_state=42, oob_score=True) # OOB 점수 활성화
random_search_rf = RandomizedSearchCV(
rf_clf,
param_distributions=param_distributions_rf,
n_iter=20, # 총 시도 횟수 설정
cv=5, # 교차 검증 분할
scoring='accuracy', # 평가지표: 정확도
random_state=42,
n_jobs=-1 # 병렬 처리
)
random_search_rf.fit(X_train_scaled, y_train)
# 최적의 하이퍼파라미터 및 검증 정확도 출력
print("랜덤 포레스트 최적 하이퍼파라미터:", random_search_rf.best_params_)
print("랜덤 포레스트 검증 정확도 (교차 검증 평균 정확도):", random_search_rf.best_score_)
# 최적 모델로 훈련 및 테스트 정확도 평가
best_rf = random_search_rf.best_estimator_
train_accuracy_rf = accuracy_score(y_train, best_rf.predict(X_train_scaled))
test_accuracy_rf = accuracy_score(y_test, best_rf.predict(X_test_scaled))
print(f"랜덤 포레스트 훈련 정확도: {train_accuracy_rf:.4f}")
print(f"랜덤 포레스트 테스트 정확도: {test_accuracy_rf:.4f}")
# OOB 점수 출력
print(f"랜덤 포레스트 OOB 점수: {best_rf.oob_score_:.4f}")
# 특성 중요도 추출 및 시각화
feature_importances = best_rf.feature_importances_
features = X_train.columns # 특성 이름
# 데이터프레임으로 정리 후 중요도 순으로 정렬
importance_df = pd.DataFrame({
'Feature': features,
'Importance': feature_importances
}).sort_values(by='Importance', ascending=False)
# 상위 10개의 중요 변수 시각화
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df.head(10), palette='viridis')
plt.title("Top 10 Feature Importances - Random Forest")
plt.xlabel("Importance Score")
plt.ylabel("Feature")
plt.show()
# 중요 변수 출력
print("랜덤 포레스트 주요 변수:")
print(importance_df.head(10))
이번 분석에서는 랜덤 포레스트(Random Forest) 모델을 활용하여 대출 승인 여부를 예측하였다. 랜덤 포레스트는 다수의 결정 트리를 결합하여 일반화 성능을 높이는 강력한 앙상블 학습 기법이다. 최적의 하이퍼파라미터를 탐색한 뒤, 모델 성능과 주요 변수의 중요도를 분석하였다.
RandomizedSearchCV를 통해 최적화한 랜덤 포레스트의 하이퍼파라미터는 다음과 같다:
- 트리 개수 (n_estimators): 200
- 최대 깊이 (max_depth): 20
- 노드 분할 최소 샘플 수 (min_samples_split): 5
- 리프 노드 최소 샘플 수 (min_samples_leaf): 2
- 최대 특성 수 (max_features): 'sqrt'
최적의 하이퍼파라미터를 적용한 결과, 교차 검증 평균 정확도는 92.95%, 테스트 세트 정확도는 93.42%, OOB 점수는 93.02%로 안정적인 성능을 기록했다.
OOB 점수란?
랜덤 포레스트는 학습 과정에서 부트스트랩 샘플링을 사용한다. 이때, 각 트리가 학습하지 않은 데이터(OOB 샘플)를 검증 데이터로 활용할 수 있다. OOB 점수는 별도의 검증 데이터나 교차 검증 없이도 모델의 일반화 성능을 빠르게 평가할 수 있는 지표이다.
이번 모델에서 OOB 점수는 93.02%로, 테스트 세트 정확도(93.42%)와 매우 유사한 수준을 보였다. 이는 랜덤 포레스트 모델이 과적합 없이 안정적으로 학습되었음을 의미한다.
모델 성능 요약은 다음과 같다.
- 훈련 세트 정확도: 95.30%
- 테스트 세트 정확도: 93.42%
- OOB 점수: 93.02%
훈련 세트와 테스트 세트의 정확도 차이가 크지 않으며, OOB 점수 또한 테스트 세트 정확도와 일치하는 수준이다. 이를 통해 랜덤 포레스트가 데이터에 과적합되지 않고 안정적인 성능을 보였음을 확인할 수 있었다.
랜덤 포레스트의 특성 중요도(feature importance)를 분석한 결과, 대출 승인 예측에 크게 기여한 변수는 다음과 같다:
1 | loan_percent_income | 0.245770 |
2 | person_income | 0.144216 |
3 | loan_int_rate | 0.116988 |
4 | person_home_ownership_RENT | 0.092274 |
5 | loan_grade_D | 0.066198 |
6 | loan_amnt | 0.064311 |
7 | person_emp_length | 0.048322 |
8 | person_age | 0.033502 |
9 | cb_person_cred_hist_length | 0.023950 |
10 | person_home_ownership_OWN | 0.022548 |
- loan_percent_income: 개인 소득 대비 대출 비율이 가장 중요한 변수로 나타났다.
- person_income(연간 소득)과 loan_int_rate(대출 이자율)도 모델 예측에 크게 기여했다.
- 주택 소유 형태(person_home_ownership)와 대출 등급(loan_grade) 역시 대출 승인 여부를 설명하는 데 중요한 역할을 했다.
랜덤 포레스트는 높은 예측 정확도와 안정적인 성능을 제공하며, 특성 중요도를 통해 주요 변수를 쉽게 해석할 수 있는 강력한 앙상블 기법이다. OOB 점수를 활용하여 교차 검증 없이도 일반화 성능을 신뢰할 수 있었으며, 대출 승인 예측 문제에서 효과적으로 활용될 수 있음을 확인하였다.
특히, loan_percent_income, person_income과 같은 변수는 대출 승인 여부를 설명하는 데 중요한 역할을 했으며, 모델의 해석 가능성을 높이는 데 기여하였다. 랜덤 포레스트는 대출 승인 모델링에 적합한 선택임을 보여주었다.
10. 앙상블 모형 - Gradient Boosting 모델
Gradient Boosting은 여러 약한 학습기(결정 트리)를 결합하여 성능을 점진적으로 개선하는 부스팅 기법이다. 각 단계에서 이전 모델의 오차를 줄이도록 설계되며, 데이터를 반복적으로 학습하여 높은 예측 성능을 달성할 수 있는 특징을 가지고 있다. 이번 분석에서는 Gradient Boosting Classifier를 사용하여 대출 승인 예측 문제를 해결하고자 하였다.
기본 Gradient Boosting 모델 성능
from sklearn.ensemble import GradientBoostingClassifier
# Gradient Boosting 모델 생성
gb_clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
# 모델 학습
gb_clf.fit(X_train_scaled, y_train)
# 예측 및 정확도 계산
y_pred_gb = gb_clf.predict(X_test_scaled)
train_accuracy_gb = accuracy_score(y_train, gb_clf.predict(X_train_scaled))
test_accuracy_gb = accuracy_score(y_test, y_pred_gb)
print(f"Gradient Boosting 훈련 정확도: {train_accuracy_gb:.4f}")
print(f"Gradient Boosting 테스트 정확도: {test_accuracy_gb:.4f}")
먼저 기본 설정으로 Gradient Boosting 모델을 학습하였다. 훈련 및 테스트 세트에서 다음과 같은 성능을 보였다:
- 훈련 세트 정확도: 92.34%
- 테스트 세트 정확도: 92.54%
기본 설정에서도 비교적 높은 성능을 보였지만, 추가적인 성능 향상과 일반화 성능 강화를 위해 하이퍼파라미터 튜닝을 수행하였다.
하이퍼파라미터 튜닝
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
import seaborn as sns
# 하이퍼파라미터 범위 설정
param_distributions_gb = {
'n_estimators': [50, 100, 200, 300], # 트리 개수
'learning_rate': [0.01, 0.05, 0.1, 0.2], # 학습률
'max_depth': [3, 5, 7], # 최대 깊이
'min_samples_split': [2, 5, 10], # 노드 분할에 필요한 최소 샘플 수
'min_samples_leaf': [1, 2, 4] # 리프 노드에 필요한 최소 샘플 수
}
# RandomizedSearchCV를 통한 Gradient Boosting 최적화
gb_clf = GradientBoostingClassifier(random_state=42)
random_search_gb = RandomizedSearchCV(
gb_clf,
param_distributions=param_distributions_gb,
n_iter=20, # 총 시도 횟수 설정
cv=5,
scoring='accuracy',
random_state=42
)
random_search_gb.fit(X_train_scaled, y_train)
# 최적의 하이퍼파라미터 및 검증 정확도 출력
print("Gradient Boosting 최적 하이퍼파라미터:", random_search_gb.best_params_)
print("Gradient Boosting 검증 정확도 (교차 검증 평균 정확도):", random_search_gb.best_score_)
# 최적 모델로 훈련 및 테스트 세트 성능 평가
best_gb = random_search_gb.best_estimator_
train_accuracy_gb = accuracy_score(y_train, best_gb.predict(X_train_scaled))
test_accuracy_gb = accuracy_score(y_test, best_gb.predict(X_test_scaled))
print(f"Gradient Boosting 훈련 정확도: {train_accuracy_gb:.4f}")
print(f"Gradient Boosting 테스트 정확도: {test_accuracy_gb:.4f}")
Gradient Boosting 모델의 성능 최적화를 위해 RandomizedSearchCV를 사용하여 다양한 하이퍼파라미터 조합을 탐색하였다. 튜닝에 사용된 주요 하이퍼파라미터는 다음과 같다:
- 트리 개수 (n_estimators):
- 부스팅 과정에서 생성할 트리의 수를 조정한다.
- 값이 클수록 모델이 더 많이 학습하지만, 과적합될 가능성도 증가한다.
- 학습률 (learning_rate):
- 각 단계에서 학습하는 비율을 조정한다.
- 낮은 값은 더 많은 트리가 필요하지만, 일반화 성능을 높이는 데 유리하다.
- 트리의 최대 깊이 (max_depth):
- 트리의 최대 깊이를 제한하여 모델 복잡도를 제어한다.
- 깊이가 클수록 모델이 데이터의 세부적인 패턴을 학습하지만, 과적합될 위험이 있다.
- 노드 분할에 필요한 최소 샘플 수 (min_samples_split):
- 노드를 분할하기 위해 필요한 최소 샘플 수를 정의한다.
- 값을 높이면 분할이 덜 자주 발생하여 모델이 더 단순해진다.
- 리프 노드의 최소 샘플 수 (min_samples_leaf):
- 리프 노드에 있어야 하는 최소 샘플 수를 정의한다.
- 작은 리프 노드는 과적합을 유발할 수 있으므로, 적절한 값을 설정해야 한다.
최적의 하이퍼파라미터 조합
최적의 하이퍼파라미터 조합은 다음과 같다:
- n_estimators: 100
- learning_rate: 0.1
- max_depth: 5
- min_samples_split: 5
- min_samples_leaf: 2
이 조합을 통해 모델의 복잡도를 적절히 조정하면서 학습 속도를 제어하고, 과적합을 방지하였다.
최적화된 모델 성능
최적화된 하이퍼파라미터로 모델을 다시 학습한 결과, 성능은 다음과 같았다:
- 훈련 세트 정확도: 95.33%
- 테스트 세트 정확도: 93.84%
- 교차 검증 평균 정확도: 93.46%
최적화된 Gradient Boosting 모델은 기본 설정에 비해 예측 성능과 일반화 성능 모두에서 개선된 결과를 보였다. 훈련 세트와 테스트 세트의 성능 차이가 크지 않아 과적합 없이 안정적인 성능을 유지하였음을 확인할 수 있었다.
혼동 행렬 분석
TP와 TN 값이 높아 전반적으로 높은 정확도를 유지하였다. FN 값이 FP보다 상대적으로 커, 모델이 실제 긍정을 부정으로 잘못 예측하는 경향이 있음을 확인하였다.
Gradient Boosting 하이퍼파라미터와 성능의 관계
Gradient Boosting의 주요 하이퍼파라미터가 모델 성능에 미치는 영향을 간략히 설명하면 다음과 같다:
- 학습률 (learning_rate):
- 학습률을 낮추면 모델의 성능이 점진적으로 향상되며, 일반화 성능이 개선된다.
- 트리 깊이 (max_depth):
- 트리의 깊이가 깊을수록 복잡한 데이터 패턴을 학습할 수 있지만, 과적합 위험이 커진다.
- 트리 개수 (n_estimators):
- 충분히 큰 트리 개수는 모델이 점진적으로 학습하도록 돕는다.
- 정규화 효과:
- min_samples_split와 min_samples_leaf를 활용하면 과적합을 방지하면서도 데이터 패턴을 적절히 학습할 수 있다.
최적화된 Gradient Boosting 모델은 대출 승인 예측 문제에서 높은 정확도와 안정적인 성능을 보여주었다. 특히, 소득 수준, 대출 금액과 같은 변수가 중요한 특성으로 작용하며, 모델 성능을 강화하는 데 기여하였다.
Gradient Boosting은 데이터의 예측력을 극대화할 수 있는 강력한 앙상블 기법으로, 적절한 하이퍼파라미터 튜닝을 통해 높은 성능과 일반화 성능을 동시에 달성할 수 있음을 확인하였다.
참고하면 좋을 자료
'머신러닝' 카테고리의 다른 글
파이썬과 케라스를 이용한 간단한 딥러닝 + (1) | 2024.11.28 |
---|---|
지도학습 - 주택 가격 회귀 예측모형 / 전처리 + 회귀모형 + KNN (0) | 2024.11.25 |
지도학습 - 대출 승인 결과 분류 예측모형 / Tree,SVM (0) | 2024.11.14 |
지도학습 - 대출 승인 결과 분류 예측모형 / 전처리, 로지스틱 회귀모형, KNN (0) | 2024.11.13 |