일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 밑바닥부터 시작하는 딥러닝
- rnn
- 다층 퍼셉트론
- Pandas
- 가설검정
- 군집화
- numpy
- 머신러닝
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- 결정계수
- 감성분석
- Django
- student t분포
- 자연어 처리
- 차원축소
- 텍스트 분류
- 코사인 유사도
- 모두의 딥러닝
- 밑바닥부터 시작하는 딥러닝2
- 구글 BERT의 정석
- 기술통계학
- 회귀분석
- word2vec
- 기초통계
- 파이썬 pandas
- 히스토그램
- 최소자승법
- 은준아 화이팅
- F분포
- 오래간만에 글쓰네
- Today
- Total
데이터 한 그릇
랜덤 포레스트의 개요 및 실습 본문
랜덤 포레스트의 개요 및 실습
랜덤 포레스트는 배깅(bagging) 방식의 대표적인 방법이라고 할 수 있겠다. 배깅은 보팅과 다르게 단일한 알고리즘의 결합으로 이루어져 있으며 일반적으로 결정 트리가 기본적인 알고리즘이라고 할 수 있다. 랜덤포레스트는 전체 데이터에서 각각의 분류기를 위하여 데이터를 샘플링하고 각각의 분류기는 샘플링된 데이터를 학습하여 결과값을 내어놓으며 그 결과값을 소프트 보팅을 통해서 최종 결과값을 내어놓게 된다.
이때 개별 분류기가 학습하는 샘플링된 데이터는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트이다. 이렇게 여러 개의 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑(bootstrapping) 이라고 부른다.
uci human activity recognition 데이터를 이용하여 랜덤포레스트를 실습을 해보겠다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
먼저 필요한 것들부터 임포트 해준다.
rf = RandomForestClassifier()
rf.fit(X_train,y_train)
pred = rf.predict(X_test)
accuracy = accuracy_score(y_test,pred)
랜덤 포레스트 모델을 만들고 학습을 시켜준 후 정확도로 평가를 해보니 약 92%의 정확도를 보인다. 랜덤 포레스트는 결정 나무처럼 파라미터 조정을 할 수 있는데 파라미터를 조정하는 과정을 이어나가보도록 하자.
from sklearn.model_selection import GridSearchCV
사이킷런에서 제공하는 GridSearchCV를 임포트 해준다.
params = {
'n_estimator' :[100],
'max_depth': [6,8,10,12],
'min_samples_leaf' : [8,12,18],
'min_samples_split' : [8,16,20]
}
딕셔너리 구조로 조정할 파라미터 값들을 넣어준다. 이때 n_estimator 는 결정트리 개수를 의미한다. 또 max_depth는 트리를 얼마나 깊게 갈지 결정하는 수치들이다.(과적합을 피하기 위해서) 그리고 min_samples_leaf는 리프노드를 조건에 관한 수치이다. 만일 8이라고 한다면 샘플수가 8개가 된다면 리프노드가 될 수 있는 조건이 된다. 그리고 min_samples_split은 노드에서 다음 노드로 가려고 할 때 최소한 필요한 샘플의 수라고 할 수 있다.
r = RandomForestClassifier(n_jobs = -1, random_state = 0)
grid_cv = GridSearchCV(r,param_grid = params, n_jobs=-1, cv=2)
grid_cv.fit(X_train,y_train)
print(grid_cv.best_params_)
print(grid_cv.best_score_)
랜덤 포레스트 모델을 만들고 GridSearchCV 안의 param_grid에 앞서 설정한 조정값을 넣어준다. 그리고 그 모델을 grid_cv 변수에 저장한 후, 학습을 시키고 best_params_과 best_score_를 통해서 최적의 파라미터 값들과 최고 점수를 출력한다.
rf1 = RandomForestClassifier(n_estimators = 300, min_samples_leaf = 8, min_samples_split = 8, max_depth = 10, random_state=0)
GridSearchCV를 통해서 살펴본 최적의 파라미터값을 이용하여 새로운 랜덤 포레스트를 만든다..
rf1.fit(X_train, y_train)
pred = rf1.predict(X_test)
accuracy = accuracy_score(y_test,pred)
accuracy
마지막으로 정확도를 보고 모델의 성능이 더 나아졌는지 확인한다.
정리
분류 머신러닝 방식 중에 앙상블 기법은 같거나 다른 알고리즘들끼리 결합하는 방식을 말한다. 크게 보팅, 배깅, 부스팅으로 나뉘어져 있으며 보팅은 서로 다른 알고리즘끼리 결합하여 모델을 만드는 것을 의미하며 배깅은 서로 같은 알고리즘끼리 결합하여 모델을 만드는 것을 말한다. 배깅 방식의 대표적인 방식은 랜덤 포레스트라고 할 수 있다. 이러한 배깅 방식은 보팅 방식과 다르게 전체 데이터를 똑같이 각각의 분류기에서 사용하는 것이 아니라, 부트스트래핑을 통해서 데이터를 샘플링 한 이후에 분류기가 각각 다른 샘플링된 데이터를 이용한다.
랜덤 포레스트 방식을 이용하여 확률을 구한 이후에 파라미터를 조정하여 모델의 성능을 수정할 수 있다. 결정 트리와 같이 GridSearchCV를 이용하여 max_depth, min_samples_leaf, min_samples_split, n_estimator 등을 조정하고 최적의 파라미터 값과 최고의 정확도를 확인한 이후에 확인한 값으로 다시 랜덤 포레스트를 만들어 최적화 시킬 수 있다.