자료 출처 : https://www.youtube.com/watch?v=HZg8_wZPZGU d
KoreaUniv DSBA
= 유튜브 내용이 너무 유익하다. ( ...친구가 해당 랩실 멤버로 있네? )
==============================================
배깅 vs 부스팅
팀 A : a , b , c , d , e
시사상식 책을 5권을 삼.
A - 1번 책
B - 2번 책
...
E - 5번 책
서로 다른 책을 공부
퀴즈쇼에 나가서 각각 공부한 내용을 바탕으로, 5명의 답 가운데 대표 값 하나를 답으로 제출.
= Bagging
팀 B : ㄱ , ㄴ , ㄷ , ㄹ , ㅁ
우선
ㄱ - 문제집 1권을 풀게 시킴 - 틀린 유
ㄴ - 앞 사람이 잘 못푸는 유형이 많은 책을 풀게 시킴
ㄷ - 앞 사람이 잘 못푸는 유형이 많은 책을 풀게 시킴
...
ㅁ - 앞 사람이 잘 못푸는 유형이 많은 책을 풀게 시킴
= 부스팅
병렬 연산
배깅 - 동시 다발적 - 병렬 가능
ㄴ 그런데 의외로 배깅이 학습 속도가 느린 경우가 많음
ㄴ 하나의 학습 모델의 복잡도가 높아서 느림.
부스팅 - 앞선 모형이 얼마만큼 잘하는지 못하는지 평가 뒤에 다음 모형 학습 가능하기 때문에 - 병렬 불가능
ㄴ 한번 스플릿 하는데, 시간이 짧게 걸림.
개별적 모델을 순차적으로 학습시킬건데,
각 턴 마지막에는 "분류 관점에서( 회귀에선 회귀 오차가 큰 것 ), 오분류된 example에 대해서 새로운 train dataset에서 더 많이 나올 수 있도록(?) 가중치 조절. -> 앞선 모델에 의해서 나타난 큰 에러는, 이어서 학습된 모델이 줄이기 위한 데이터셋을 학습 -> 에러가 줄어듦 )
데이터를 통해서 모델을 만들고 -> 두번째 데이터를 만들고 // -> 다시 모델을 만들고 -> 세번째 데이터를 만들고 ...
이런 식으로 최종적으로 각 순서에 대한 모델의 결과물을 다 더함.
인풋
1. 앙상블 사이즈 T : 몇개의 러너를 쓸 것인가? 50개~100개
2. 2범주 분류 케이스로 한정하겠음. 2범주에선 레이블을 -1 , +1 로 하겠음. AdaBoost에선 이렇게 함.
( 단지 알고리즘 진행을 위해 임의로 분류 )
1. D_1 : 각 첫번째 데이터셋의 example i 가 선택될 확률.
처음에는 모델이 어떤 데이터에 대해서 좋고 나쁜지 모르기 때문에 모든 데이터에 대해서 동등하게 선택될 확률을 제공 (uniform distribution)
반복문 시작
1. h_t 는 우리가 알고 있는 모델. ( stump tree - 어떤 데이터가 영역이 있을때 딱 1번만 그어서 모델을 분류하는 트리 - 굉장히 weak model )
2. 이 h_t를 D_t에 대해서 학습시키겠다.
3. h_t의 D_t에 대한 오분류율을 계산 ( 정답과 추정값이 다른 경우에 대한 비율 )
- 최소한 이 오분류율이 50% 를 넘는다면 ( 최소한 랜덤으로 찍는 0.5 보다 작아야 학습하는 의미 존재 ) break 하고 다시 데이터셋으로 모델을 학습
4. 그리고나서 @(알파)_t 를 구함. @_t 는 가중치의 역할.
- @_t ( 에러율이 0.5에 가까우면 (1/2) * ln( (1-error_t ) / ( error_t ) ) 라는 식에서 ln 에서 1이 나와서 0이 됨. - 신뢰할 수 없는 모델이라 가중치가 0에 가까움, 만약 에러율이 0이라면, (1/2) * ln( (1-error_t ) / ( error_t ) ) 에서 무한대에 가까움. - 정확도가 높을수록 나중 결합시 가중치가 높아진다. )
(가장 핵심)
D_t+1 데이터셋에 대한 가중치를 업데이트 해줌.
논문에서의 공식 : D_t+1 = D_t * exp[ ( -1 * @_t * y_i * h_t ) / ( Z_t )
- 여기서 Z_t 는 normalize factor 인데 우선은 무시하고
- D_t : t 시점의 선택 확률이 기준점이라는 뜻.
- exp 안의 수식에 대해서 자세히 살펴보면
-- -1 * @_t : 알파 값이 크면 클수록 모델이 정확하다는 뜻이었음. 모델이 정확한 녀석에 대해선 증폭을 시키곘다. = h_t가 정확하면 Sampling rate 의 변동성을 증가시키겠다. 다시말해서 h_t 가 잘 맞추고 있으면 -1 이 앞에 붙어 있어서 급격하게 선택 확률을 줄여버릴 것이고, h_t 가 정확한 모델인데 틀렸으면 다음 단계에서 선택될 확률을 높이겠다.
-- y_i * h_t :
--- y_i = h_t 이면 값이 1로 나옴. ( y_t , h_t 는 각각 -1 또는 1인데, 둘 다 값이 같을때만 +1이 나옴 - 이것 때문에 예측 라벨이 -1 또는 1 인 것임 )
--- y_i != h_t 이면 값이 -1로 나옴.
h_t 가 y_i의 정답을 맞췄다 -> 모델이 잘 맞추고 있으면, exp 안의 값이 - 값을 가짐. -> 다음 데이터셋 선택시 i example 이 선택될 확률은 낮다.
- 여기서 확률의 감소 폭은 @_t 에 비례한다.
h_t 가 y_i의 정답을 틀렸다 -> 모델이 잘 맞추고 있으면, exp 안의 값이 + 값을 가짐. -> 다음 데이터셋 선택시 i example 이 선택될 확률은 증가한다.
- 여기서 확률의 증가 폭은 @_t 에 비례한다.
제일 마지막에 test dataset에 대해서 모든 개별 모델 출력값을 합해서 값을 리턴함.
================
( 설명 정리 )
처음 데이터 셋은 random 하게 샘플링 하는데,
이후 데이터 선택 시, 앞서 학습한 모델이 ( 1. 정답률이 높은가, 2. 샘플 i에 대해서 정답을 맞췄느냐 못맞췄느냐. ) 에 따라서 데이터 선택률에 차이가 난다. 결국 앞선 모델에서 정답을 못맞춘 케이스에서 선택률이 높아지고 더군다나 앞선 모델이 정답률이 높았다면 더더욱 선택률이 높아진다.
D_t+1 = D_t * exp[ ( @_t * -1 * y_i * h_t ) / ( Z_t )
1. -1 * y_i * h_t : 앞선 모델의 예측 결과가 정답과 다르다면 exp 안의 값이 + 가 되면서 선택률이 높아진다.
2. @_t : 앞선 모델이 정답률이 높았다면, 더더욱 선택률이 높아진다.
+ 최종적 결과값을 내놓을때 정답률이 높은 모델의 경우 가중치(@_t)가 붙어서 나온다.
@_t = (1/2) * ln( (1-error_t ) / ( error_t ) )
================
h_1 : stump tree
앱실론 :
앱_1 : 전체 비율중에 못맞춘 비율(에러율) : 0.3 -> @_1 = (1/2) * ln( (1-앱_1) / ( 앱_1) ) = 0.42
케이스 1 : 정답을 맞췄음 -> exp 내 -1 -> 선택 확률 감소
케이스 2 : 정답을 맞췄음 -> exp 내 -1 -> 선택 확률 감소
케이스 3 : 정답을 틀렸음. -> exp 내 +1 -> 선택 확률 증가 ( 그림 내의 + , - 크기 변화 주목 )
배깅과 마찬가지로 복원 추출을 하는데
( 베깅 : 데이터가 있으면, 각 데이터 선택 확률이 1/ n 로 동일함 )
( 부스팅 : 처음엔 1/n 이었으나, 앞선 모델의 정확도, 정답 유무에 따라서, 선택 확률이 달라짐 )
라운드 2에서 h_2 모델이 분류를 했을때 파란색 영역내 - 값들이 오분류 되었음.
오분류율 : 0.3 인데 샘플 선택 확률이 다르므로 ( +, - 크기가 다름 ) 여기선 0.21로 나왔다고 치자.
이후 D_3 로 넘어갈때
파란색 영역내의 큰 +, 작은 + 들은 정분류되어서, 데이터 선택 확률이 작아져서 다시 정상 크기(?)의 +, 더 작은 +가 되었음. ( 빨간 영역의 - 들도 이후 크기가 작아짐 )
그러나 파란 영역 내의 - 들은 오분류되어서 이후 크기가 커짐
이렇게 반복...
3회 반복으로
stump 트리는 특정 축을 기준으로 수직으로 구분하는 단순한 트리임에도
분류 경계면을 만들어내서 +,- 를 완벽히 구분할 수 있었다.
1->2로 갈때 파란색칠 한 놈들 크기가 커짐
2->3으로 갈때, 오분류된 큰 파란원은 더 커졌음
...
최종적으로 복잡한 분류 경계면이 만들어졌다.
전체적 예시. (설명 생략)
sign : 최종적으로 값의 부호를 결정 ?? 아마도 괄호 안 값을 다 더해서 결국 양의 값인지 음의값인지 classify