Machine learning/Algorithms

Tree-based Machine Learning Models 트리 기반 모델 2

Hannah_ko 2020. 11. 12. 10:05
SMALL

저번 포스팅에서 트리 기반 모델에 대한 기본적인 이해를 정리해 보았고

이번 포스팅에서는 트리 기반 모델의 앙상블 기법에 대해 알아보도록 한다.

 


 

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