아래의 포스팅은 팀블로그인 '데이터 맛집'에서 참고한 내용입니다.
앙상블은 여러 모델, 알고리즘을 결합하여 학습시키는 것으로 overfitting, underfitting을 예방하고 예측력을 보완시키는 등의 single로 사용할 경우 나타내는 단점들을 보완한다.
Bagging
Bagging은 Bootstrap을 여러개 뽑아 여러개의 모델에 돌린 후 집계(Aggregation)하는 방법이다. 다시 말해 여러개의 모델의 결과들을 모두 살리면서 최적의 결과를 도출하는 방법이다. Bagging에 대표적인 모델은 '랜덤포레스트'가 있다. 이 모델에 대해서는 추후에 게시하겠다.
앙상블 기법은 Bootstrap 샘플을 이용해 중간값의 결과를 사용하기 때문에 overfitting을 효과적으로 줄여주고, 일반적인 모델을 만드는데 집중되어 있다.
아래의 사진을 보면 3개의 Decision model을 만들어 중간값을 결과를 나타낸것이다. 이처럼 3가지 모델의 중간값을 사용해 overfitting을 방지할 수 있다.
* 여기서 Bootstrap이란 뭘까?
Bootstrap은 아래그림에 Bootstrapping이라고 적혀있는 네모 칸들만 보면 된다.
부트스트랩은 random sampling기법으로 '복원 추출'을 사용해 raw data를 추정하는 방법이다.
중복을 허용한 복원 추출로 n개를 뽑고, n개의 평균을 구하는 것을 m번 반복한다. 그 결과 평균(n)에 대한 분포를 구할 수 있고, sample mean에 대한 신뢰 구간을 추정할 수 있게 된다.
복원 추출을 하는 방법은, 데이터가 편중되지 않게 하기 위함이다.
Boosting
Boosting은 Bagging과 다르게 일반적인 모델에 집중되어 있지 않고, 맞추기 어려운 문제를 맞추는데 초점이 맞춰 있다.
배깅은 독립적인 input data를 가지고(복원 추출) 독립적으로 예측하지만, 부스팅은 이전 모델이 다음 모델에 영향을 준다. 아래의 예시를 보자.
예를 들어, 양파, 상추, 파, 브로콜리가 있을 때, 모델이 브로콜리를 잘 예측하지 못한다고 하자. 부스팅은 브로콜리에 가중치를 계속해서 주게되고 최종적으로 '브로콜리도 잘 맞출 수 있는 모델'을 만들 수 있다.
첫번째 데이터인 D1에서 모델이 하늘색과 빨간색으로 영역을 분리했다. 하지만, 빨간부분 왼쪽에 (-)가 존재하고, 파란부분에도 (+)가 존재한다. 이를 보완하기 위해 D2데이터에 틀린부분에 가중치를 둔다. (자세히 보면 D2부분에 큰 -와 +가 있음-> 가중치를 준 모습).. 이렇게 반복하면서 D1, D2, D3의 결과를 합쳐 최종 결과를 구할 수 있다.
- 모델: XGBoost, AdaBoost, GradientBoost..
Bagging vs Boosting
부스팅은 오답에 더 집중하기 때문에 error가 작다. 하지만, 속도가 느리고 overfitting이 될 가능성이 있다.
결론적으로 성능을 높이고 싶다면 부스팅, overfitting이 문제라면 배깅을 사용하는게 적합하다.
Stacking
스태킹은 모델이 예측한 결과를 다시 training set으로 활용하는 것이다.
즉, Base Learner로 예측한 결과들을 다음 모델에 input data로 넣어 예측한다.
stacking의 또 다른 예시를 아래의 그림으로 나타냈다. 즉, 5개의 모델에서 나온 prediction의 값이 XGBoost의 input 값이 되는것이다.
stacking은 예측값이 input으로 들어가기 때문에 overfitting이 잘된다는 단점을 가지고 있다.
out of fold(OOF)
OOF로 stacking을 할 수 있다.
위의 사진은 OOF 절차를 나타냈다. 5개의 모델이 있는데 모델 각각은 다음과 같은 절차를 밟는다.
1. training data에서 cross validation을 진행(k번)하면 k개의 prediction값이 출력된다.
2. Prediction값들을 다음 모델에 input data로 넣는다.
3. 최종 모델은 k개의 prediction을 받아 값을 예측하고 최종 결과를 낸다.
OOF 코드
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
29
30
31
32
33
34
35
36
37
|
# 모델마다 oof 적용
def get_oof(clf, x_train, y_train, x_test):
oof_train = np.zeros((n_train,))
oof_test = np.zeros((n_test,))
oof_test_skf = np.empty((NFOLDS, n_test))
# 모델마다 cross validation 반복
x_tr = x_train[train_index] # trainset -> train
y_tr = y_train[train_index]
x_te = x_train[test_index] # trainset -> validation
oof_train[test_index] = clf.predict(x_te)
# oof_test_skf에 차곡차곡 예측결과를 쌓음
oof_test_skf[i, :] = clf.predict(x_test) # test set
return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)
# OOF prediction실시
et_oof_train, et_oof_test = get_oof(et, x_train, y_train, x_test) # Extra Trees
rf_oof_train, rf_oof_test = get_oof(rf,x_train, y_train, x_test) # Random Forest
ada_oof_train, ada_oof_test = get_oof(ada, x_train, y_train, x_test) # AdaBoost
gb_oof_train, gb_oof_test = get_oof(gb,x_train, y_train, x_test) # Gradient Boost
svc_oof_train, svc_oof_test = get_oof(svc,x_train, y_train, x_test) # Support Vector Classifier
# 5개모델 prediction을 모두 합침
x_train = np.concatenate(( et_oof_train, rf_oof_train, ada_oof_train, gb_oof_train, svc_oof_train), axis=1)
x_test = np.concatenate(( et_oof_test, rf_oof_test, ada_oof_test, gb_oof_test, svc_oof_test), axis=1)
# 최종모델(XGBoost)의 input에는 5개의 모델 prediction만 들어있다.
gbm = xgb.XGBClassifier().fit(x_train, y_train)
predictions = gbm.predict(x_test)
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'인공지능 > 스터디' 카테고리의 다른 글
Bias-Variance, underfitting-overfitting trade off (0) | 2020.03.23 |
---|---|
[CB Filtering] 2. 키워드 수집 (0) | 2020.03.23 |
[CB Filtering] 1. 개요 (0) | 2020.03.13 |
Collaborative Filtering(CF: 협업필터링)2: 계산 (0) | 2020.03.12 |
Collaborative Filtering(CF: 협업필터링)1: 개요 (0) | 2020.03.12 |