21년 4월 13일 

코드스테이츠 부트캠프 #일차

S2-Week 2: Tree Based Model

 

 

Random Forests

 

키워드

  • category_encoders
  • ipywidgets
  • matplotlib
  • pandas
  • scikit-learn

 

 


  • 랜텀포레스트가 결정트리와 어떻게 다를까요?
  • 배깅(Bagging)이 무슨 뜻입니까?
  • Out-Of-Bag(OOB) sample의 역할이 무엇이지요?

*Random Forests

-분류문제를 풀어야 한다면 랜덤포레스트를 먼저 적용해보는게 좋다. 결정트리모델은 한 개의 트리만 사용하다보니 과적합되는 경향이 있는데 앙상블모델인 랜덤포레스트로 쉽게 해결할 수 있다.

-앙상블 방법은 모델들의 예측결과를 다수결이나 평균을 내어 예측하는 방법이다.

-랜덤포레스트에서는 특성 n개 중 일부분 k개의 특성을 선택(sampling) 하고 이 k개에서 최적의 특성을 찾아내어 분할합니다. 이때 k개는 일반적으로 로그함수를 사용한다.

-중요도는 노드들의 지니불순도(Gini impurity)를 가지고 계산하는데 노드가 중요할 수록 불순도가 크게 감소하는데 많이 사용된 특성이 중요도가 올라간다.

-자동적으로 validation할게 생긴다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* Random Forest 코드
 
from category_encoders import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer 
from sklearn.pipeline import make_pipeline
 
pipe = make_pipeline(
    OneHotEncoder(use_cat_names=True), 
    SimpleImputer(), 
    RandomForestClassifier(n_jobs=-1, random_state=10, oob_score=True)
)
 
pipe.fit(X_train, y_train)
print('검증 정확도: ', pipe.score(X_val, y_val))
cs

 

*부트스트랩(Bootstrap)

-원본 데이터에서 복원추출하는 것(샘플을 뽑아 값을 기록하고 제자리에 돌려놓는 것)

-모수의 분포를 추정하는 파워풀한 방법은 현재 있는 표본에서 추가적으로 표본을 복원 추출하고 각 표본에 대한 통계량-을 다시 계산하는 것

 

Original Datase - Traning Sets = Test Sets

 

 

BootStrap 세트의 크기

*Aggregation

부트스트랩세트로 만들어진 기본모델들을 합치는 과정

-회귀문제 : 기본모델 결과들의 평균

-분류문제 : 다수결

 

Bagging (Bootstrap aggregating)

전체 모집단의 분포를 확실하게 알 수 없는 경우에 표본을 취한 후 샘플을 여러 번 뽑아 각 모델을 학습시켜 결과를 집계(Aggregating) 하는 방법입니다.

 

 

Out-Of-Bag

추출되지 않은 샘플이다. 이를 사용해 모델을 검증할 수 있다.

 

 

 

Ordinal Encording (순서형 인코딩)

범주에 숫자를 맵핑하는 것이다.

 

 

‘여자’, ‘남자’처럼 순위도 연속성도 없다면 반드시 다른 의미로의 수치값으로 변환해야 하는데, 그 변환은 OnHot 인코딩

 

 

random forest는 의사결정트리에서 작성된다. 이는 의사결정트리의 단순성과 유연승을 결합한다.

만드는 방법

1. bootstrapped dataset 만들기. 원래 데이터 세트에서 무작위로 고른다.

2. create a decision tree using the bootstrapped dataset, but only use a random subset of varialbes (or colimns) at each step. 중복을 허용한다.

 

Simple Imputer

결측치를 쉽게 대체해준다.

1
2
3
4
5
6
7
8
9
10
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy = "median")
 
'''
strategy 옵션
    'mean': 평균값 (디폴트)
    'median': 중앙값
    'most_frequent': 최빈값
    'constant': 특정값, 예 SimpleImputer(strategy='constant', fill_value=1)
'''
cs

 

원본데이터로 부터 부트스트랩한다.

부트스트랩한(랜덤샘플링)한 데이터로 모델을 학습시킨다.

학습된 모델의 결과를 집계하여 최종 결과 값을 구한다.

 

 

 

참고하면 좋은 정보

 

Boosting도 Bagging과 동일하게 복원 랜덤 샘플링을 하지만, 가중치를 부여한다는 차이점이 있습니다. Bagging이 병렬로 학습하는 반면, Boosting은 순차적으로 학습시킵니다. 학습이 끝나면 나온 결과에 따라 가중치가 재분배됩니다.

 

오답에 대해 높은 가중치를 부여하고, 정답에 대해 낮은 가중치를 부여하기 때문에 오답에 더욱 집중할 수 있게 되는 것 입니다. Boosting 기법의 경우, 정확도가 높게 나타납니다. 하지만, 그만큼 Outlier에 취약하기도 합니다.

 

AdaBoost, XGBoost, GradientBoost 등 다양한 모델이 있습니다. 그 중에서도 XGBoost 모델은 강력한 성능을 보여줍니다. 최근 대부분의 Kaggle 대회 우승 알고리즘이기도 합니다.

'개발 관련자료 > ML, DL' 카테고리의 다른 글

ROC Curve / AUC  (0) 2021.05.05
Confision Matrix  (0) 2021.05.05
Decision Trees  (0) 2021.04.24
Ridge Regression  (0) 2021.04.24
Multiple Regression  (0) 2021.04.22

+ Recent posts