Tree-based Machine Learning Models 트리 기반 모델 2
저번 포스팅에서 트리 기반 모델에 대한 기본적인 이해를 정리해 보았고
이번 포스팅에서는 트리 기반 모델의 앙상블 기법에 대해 알아보도록 한다.
1. Bagging Classifier
Bagging Classifier는 Tree Classifier의 high variance 및 low bias 문제를 보완하고자 반복 샘플링 및 정확환 결과 집계를 활용한 모델이다.
Bagging은 모든 열 / 변수를 선택하고 각 샘플에 대해 개별 트리를 맞추면서 행을 샘플링한다.
각 샘플에 대해 랜덤으로 특정 행이 선택되지만 열(변수)은 모두 선택된다.
1-1. Bagging Classifier 예제 (Decision Tree Model과 비교)
1) Bagging classifier 모델 생성 및 학습
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
dt_fit = DesicionTreeClasssifier(criterion="gini", max_depth=5, min_samples_split=2,
min_samples_leaf=1, random_state=42, class_weight={0:0.3, 1:0.7})
bag_fit = BaggingClassifier(base_estimator=dt_fit, n_estimators=5000, max_samples=0.67,
max_features=1.0, bootstrap=True, bootstrap_features=False, n_jobs=-1, random_state=42)
bag_fit.fit(x_train, y_train)
2) 모델 학습 후 confusion matrix, accuracy, precision, recall 확인
print("Bagging - Train Confusion matrix\n", pd.crosstab(y_train, bag_fit.predict(x_train),
rownames=["Actuall"], colnames=["Predicted"]))
print("\nBagging - Train accuracy", round(accuracy_score(y_train), bag_fit.predict(x_train)), 3))
print("\nBagging - Train Classification Report\n", classfication_report(y_train, bag_fit.predict(x_train)))
print("Bagging - Test Confusion matrix\n", pd.crosstab(y_test, bag_fit.predict(x_test),
rownames=["Actuall"], colnames=["Predicted"]))
print("\nBagging - Test accuracy", round(accuracy_score(y_test), bag_fit.predict(x_test)), 3))
print("\nBagging - test Classification Report\n", classfication_report(y_test, bag_fit.predict(x_test)))
test accurady - Decision Tree Classifier: 0.846% / Bagging Classifier: 0.871%
FN(actual: 0, predict: 1) - Decision Tree Classifier: 19 / Bagging Classifier: 8
2. Random Forest Classifier
Bagging 모델은 훈련 데이터에서 부트스트랩된 샘플에 대한 의사 결정 트리를 구축하는데 이 모델의 단점은 모든 변수(열)을 선택한다는 것이다.
Random Forest는 이를 보완하기 위해 상관관계가 없는 트리를 활용해 미세조정을 수행하여 성능을 개선한 모델이다.
2-1. Random Forest 예제 (Bagging model과 비교)
1) Random forest classifier 모델 생성 및 학습
from sklearn.ensemble import RandomForestClassifier
rf_fit = RandomForestClassifier(n_estimators=5000, criterion="gini", max_depth=5,
min_samples_split=2, bootstrap=True, max_feature="auto", random_state=42,
min_samples_liaf=1, class_weight={0:0.3, 1:0.7})
rf_fit.fit(x_train, y_train)
2) 모델 학습 후 confusion matrix, accuracy, precision, recall 확인
print("Random Forest - Train confusion matrix\n", pd.crosstab(y_train, rf_fit.predict(x_train),
rownames=["Actuall"], colnames=["Predicted"])
print("\nRandom Forest - Train accuracy", round(accurracy_score(y_train, rf_fit.predict(x_train)), 3))
print("\nRandom Forest - Train Classification Report\n", classification_report(y_train, rf_fit.predict(x_train)))
print("Random Forest - Test confusion matrix\n", pd.crosstab(y_test, rf_fit.predict(x_test),
rownames=["Actuall"], colnames=["Predicted"])
print("\nRandom Forest - Test accuracy", round(accurracy_score(y_test, rf_fit.predict(x_test)), 3))
print("\nRandom Forest - Test Classification Report\n", classification_report(y_test, rf_fit.predict(x_test)))
test accuracy - Bagging classifier: 0.871% / Random forest classifier: 0.878%
TN(actual: 1, predict: 1) - Bagging classifier: 12 / Random forest classifier: 14
3) Random forest classifier 결과 시각화
model_ranks = pd.Series(rf_fit.feature_importances_,
index=x_train.columns, name='Importance').sort_values(ascending=False, inplace=False)
model_ranks.index_name = 'Variables'
top_features = model_ranks.iloc[:31].sort_values(ascending=True, inplace=False)
import matplotlib.pyplot as plt
plt.figure(figsize=(20, 10))
ax = top_features.plot(kind='barh')
_ = ax.set_title("Variable Importance Plot")
_ = ax.set_xlabel("Mean decrease In Variance")
_ = ax.set_yticklabels(top_features.index, fontsize=13)
plt.show()
Random forest classifier 모델 분석 결과 MonthlyIncome(월급)이 이직율에 가장 큰 영향을 미친다는 것을 알 수 있고그 다음으로는 overtime_No, overtime_Yes 순으로 야근이 영향을 미친다는 것을 알 수 있었다.
3. AdaBoost Classifier
AdaBoost classifier는 다른 학습 알고리즘(약한 학습기: weak learner)의 결과물들에 가중치를 두어 더하는 방법으로이전 분류기들에 의해 잘못 분류된 것들을 반복을 통해 수정 보완해줄 수 있는 이점이 있는 모델이다.
3-1. AdaBoost Classifier 예제 (Random Forest classifier와 비교)
adabst_fit = AdaBoostClassifier(base_estimator=dtree, n_estimators=5000, learning_rate=0.05,
random_state=42)
adabst_fit.fit(x_test, y_test)
print("AdaBoost - Test Confusion matrix\n", pd.crosstab(y_test, adabst_fit.predict(x_test),
rownames=["Actuall"], colnames=["Predicted"]))
print("\nAdaBoost - Test accuracy", round(accuracy_score(y_test, adabst_fit.predict(x_test)), 3))
print("\nAdaBoost - Test Classification Report\n", classification_report(y_test, adabst_fit.predict(x_test)))
Ada boost classifier의 test 결과가 재현율 측면에서 높은 점수를 기록했던 Random forest classifier보다 높은 점수를 기록했다.
[참고문헌]
1. Pratap Dangeti, 2017, Statistics for Machine Learning