모델 실습

2. 앙상블 학습과 랜덤 포레스트 - 실습

jwjwvison 2021. 5. 22. 22:55

 MNIST 데이터를 불러들여 훈련 세트, 검증 세트, 테스트 세트로 나눈다. 그런 다음 랜덤 포레스트 분류기, 엑스트라 트리 분류기, SVM 분류기 같은 여러 종류의 분류기를 훈련시킨다. 그리고 검증 세트에서 개개의 분류기보다 더 높은 성능을 내도록 이들을 간접 또는 직접 투표 방법을 사용해 앙상블로 연결해보자. 앙상블을 얻고 나면 테스트 세트도 확인해보자. 

 

from sklearn.datasets import  fetch_openml
mnist=fetch_openml('mnist_784',version=1)
from sklearn.model_selection import train_test_split

X_train_val,X_test,y_train_val,y_test=train_test_split(
    mnist.data,mnist.target,test_size=10000,random_state=42
)

X_train,X_val,y_train,y_val=train_test_split(
    X_train_val,y_train_val,test_size=10000,random_state=42
)

train, val ,test 데이터셋이 각각 60000,10000,10000개로 나누어 졌다.

 

사용할 분류기들을 import 해놓는다.

from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier
from sklearn.svm import LinearSVC

 

 

random_forest_clf=RandomForestClassifier(n_estimators=100,random_state=42)
extra_trees_clf=ExtraTreesClassifier(n_estimators=100,random_state=42)
svm_clf=LinearSVC(max_iter=100,tol=20,random_state=42)
estimators=[random_forest_clf,extra_trees_clf,svm_clf]
for estimator in estimators:
  print('Training the',estimator)
  estimator.fit(X_train,y_train)

 

 검증 세트로 각각 분류기마다 성능을 확인해보자.

for estimator in estimators:
  print(estimator.score(X_val,y_val))

 보이는것과 같이 SVM이 다른 분류기보다 성능이 많이 떨어진다. 

 

 검증 세트에서 개개의 분류기보다 더 높은 성능을 내도록 이들을 간접 또는 직접 투표 분류기를 사용하는 앙상블로 연결해보자.

from sklearn.ensemble import VotingClassifier

named_estimators = [
    ("random_forest_clf", random_forest_clf),
    ("extra_trees_clf", extra_trees_clf),
    ("svm_clf", svm_clf),
]

voting_clf = VotingClassifier(named_estimators)

voting_clf.fit(X_train, y_train)

 

 이제 검증 세트로 성능을 평가해보자.

voting_clf.score(X_val, y_val)

 

 SVM 모델을 제거해서 성능이 향상되는지 확인해 보자. 다음과 같이 set_params() 를 사용하여 None으로 지정하면 특정 예측기를 제외시킬 수 있다.

voting_clf.set_params(svm_clf=None)
voting_clf.estimators

 예측기 목록이 없데이트 되었다. 하지만 훈련된 예측기 목록은 업데이트되지 않았다.

voting_clf.estimators_

 

 VotingClassifer를 다시 훈련시키거나 그냥 훈련된 예측기 목록에서 SVM 모델을 제거할 수 있다.

del voting_clf.estimators_[2]

 

 VotingClassifer를 다시 평가해보자.

voting_clf.score(X_val,y_val)

 훨씬 나아졌다. SVM 모델이 성능을 저하시켰다. 이제 간접 투표 분류기를 사용해 보자. 분류기를 다시 훈련시킬 필요는 없고 voting을 'soft'로 지정하면 된다.

voting_clf.voting='soft'

voting_clf.score(X_val,y_val)

 

 앙상블을 얻었으니 테스트 세트로 확인해보자.

voting_clf.voting='hard'
voting_clf.score(X_test,y_test)

for estimator in estimators:
  print(estimator.score(X_test,y_test))