-
Tree-based Machine Learning Models 트리 기반 모델 2Machine learning/Algorithms 2020. 11. 12. 10:05SMALL
저번 포스팅에서 트리 기반 모델에 대한 기본적인 이해를 정리해 보았고
이번 포스팅에서는 트리 기반 모델의 앙상블 기법에 대해 알아보도록 한다.
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
LIST'Machine learning > Algorithms' 카테고리의 다른 글
SVM(Support Vector Machine) 서포트 벡터 머신 (0) 2020.11.28 Tree-based Machine Learning Models 트리 기반 모델 1 (0) 2020.11.11 통계학의 선형회귀분석과 머신러닝의 Ridge, Lasso 회귀 모델 비교 (0) 2020.11.10 Supervised learning(지도 학습) VS Unsupervised learning(비지도 학습) (0) 2019.06.17 What is machine learning? (0) 2019.06.17 댓글