이 수업은 충남대학교 양희철 교수님의 수업을 듣고 작성한 글입니다.
이전 시간까지는 어떤 머신러닝 알고리즘이 있는지, 이들이 어떻게 사용되고 어떤 장단점이 있는지에 대해 주로 학습하였다. 이번 시간에는 이들의 성능을 높일 수 있는 방법에 대해 알아보자
본격적으로 알아보기 전에 앙상블이 뭐하는 것이고, 어떻게 진행되는지를 간략하게 한번 보자. 이해하기 쉽게 Q&A 방식으로 보도록 하자.
앙상블이란 하나의 문제를 풀기 위해 여러 개의 모델을 활용하는 것에 초점을 두고 있다.
Q. 여러 개의 모델은 어떻게 얻을 수 있을까요?
A. Data의 feature 중 일부를 랜덤하게 추출 => model 하나를 생성 => 다시 data의 feature 중 일부를 랜덤하게 추출 => model 하나를 생성... 이 과정을 반복한다.
정리하면 데이터 추출을 랜덤하게, 여러 방식으로 함으로써 여러 모델을 얻을 수 있다! 이를 stochastic한 성질을 이용하여 여러 모델을 만든다고 표현할 수 있다!
Q. 데이터는 어떤 걸 사용하나요?
A. feature sampling, data sampling 두가지로 나눠볼 수 있다.
1. feature sampling : feature를 다 사용하지 않고 랜덤하게 선택해서 여러 모델을 만든다.
ex) 10개의 feature 중 7개를 랜덤하게 추출, 그리고 그 다음엔 서로 다른 조합으로 랜덤하게 추출...
2. Data sampling : 데이터가 1만개 있을 때, 트레이닝 데이터가 7천개면 7천개 중 랜덤하게 5천개를 가지고 학습하고 그 다음 다른 5천개로 학습...
※ 중요
앞에 사용했던 데이터라도 뒤에 샘플링될 때 다시 사용되어도 괜찮다! 즉 중복이 되어도 된다. 왜냐하면 조합이 어떠냐에 따라서 모델이 달라지기 때문에 전혀 orthogonal할 필요가 없다는 것이다. 그리고 두가지 방법 다 모델 학습 시 전체 데이터를 다 사용하지 않는다는 것을 알 수 있다.
위에서 알아본 내용을 정리해보자면 서로 다른 모델들이 서로 다른 기준이나 근거에 의해 다른 결과를 낸다는 것을 알 수 있다. 물론 같은 결과도 가능! 그래서 우리는 여러 모델로 얻은 결과를 어떻게 활용할 것인가에 대해 고민해봐야하는데 이것이 앙상블 메서드이다!
1. Bias-variance dilema
먼저 위에서 언급한 stochastic이 뭔지 알아보자. stochastic하다는 것은 확률에 의존한다는 것이다. 반대는 deterministic하다. 이는 식의 결과에 의존한다는 의미이다.
● Bias : 실제 target이 되는 모델 parameter로 최적의 결과를 낼 수 있는 parameter와 예측 target, 데이터를 통해 최적의 모델 parameter값을 추정한 값 사이의 차이
=> 실제 타깃과 예측 기댓값 사이의 차이
ex) 성적이 85, 87,86으로 예측했다면 예측 기댓값 = 86
● Variance : 추정 값의 평균과 각각의 추정 값과의 차이를 제곱한 것
=> 추정 파라미터의 variance
Bias-Variance dilemma라는 것은 bias와 variance가 모두 작은 값이 이상적인 값이지만, 이 둘은 trade-off 관계, 즉 둘 다 동시에 만족할 수 없다는 것이다!
아래에 bias와 variance가 trade-off 관계라는 것을 수식으로 보여준 것이다. 참고사항으로만 보도록 하자
bias와 variance를 overfitting / underfitting 관점에서도 바라볼 수 있다
위의 결과 식에서 두 가지 경우를 가정해 볼 수 있다.
i) variance가 높은 경우 : model parameter의 분포가 넓다 => 넓은 범위를 추정 가능하다 => 세타햇이 클수록 모델의 복잡도가 커지고 training data에 대해 잘 훈련된다
즉 variance가 클수록 Overfitting되는 경향이 있다!
ii) bias가 높은 경우 : 세타와 세타햇 사이의 차가 크다 => training data를 잘 표현 못한다 => 세타햇이 세타를 따라가지 못한다
즉 bias가 클수록 underfitting되는 경향이 있다!
이를 하나로 정리해보자면 아래 그림으로 나타낼 수 있다
● Generalization error가 감소하다가 최적의 capacity를 지나면 다시 증가한다
● 복잡도가 작을 때, bias 자체를 줄이지 못한다. 복잡도가 커지면 bias는 줄지만 세타햇의 variance가 커진다.
즉, 최적의 값을 따라가는 것이 아닌 주변을 넓게 측정하는 결과인 것이다!
● Generalization error = bias + variance 라 봤을 때 처음엔 bias가 크다가 나중에 variance가 커지며 다시 error가 커진다
결과적으로 이 둘의 합이 최저가 되는 지점이 모델의 최적의 capacity!
간단한 예시를 하나 보자
1. a,b는 함수가 fixed 되어 있는 형태(variance가 작음) => variance가 작고 bias가 크다
2. c,d는 조금 더 variance가 큰 계수를 학습할 수 있는 형태 => variance가 크고 bias가 작다
model이 fixed 될 시 모델 데이터의 분포를 직접적으로 알 수 없으므로 bias가 크다. 여기서 복잡도를 키우면 bias는 낮아지지만 variance가 커져 특정 값을 타깃하지 못한다
여기서 만약 복잡도가 무한이라면... bias는 0에 수렴할 것이고 variance는 매우 커질 것이다
2. Ensemble method
기본이 되는 모델인 base learner를 여러 개 두고 얘네의 결과를 조합해서 더 좋은 결과를 내는 것을 목표로 한다. 우리는 두가지에 대해 고민해봐야한다
1. 각 알고리즘을 어떻게 combining 하는가? 2. Base Learner를 어떻게 얻을 것인가?
Base Learner는 여러 개 있다고 도움이 되는 것은 아니다. 우리는 궁극적으로 서로 다른 데이터를 가지고 다른 모델을 통해, 다른 피처를 활용해서 모델을 학습해 다른 결과를 내야한다. 그래야지 Base Learner를 활용하는게 의미가 있다!
ex1) 회의를 하는데 다 같은 의견을 내면 의미가 없다. 다 다른 의견을 내서 이를 잘 결합하는 것이 가장 좋은 결과를 낸다는 것이 기본 가정
ex2) 모델들이 너무 각자 의견만 내면 이들을 잘 중화시킬 수 있도록, 즉 너무 오버피팅되지 않도록 variance를 낮츨 출 수 있는 방법론을 사용해야 한다.
우리는 주로 두가지 방법을 사용한다
i) Bagging : variance가 크고 bias가 작은 base Learner들을 결합한다. 즉 variance를 낮추기 위해 averaging/majority voting을 이용해 복잡한 model의 결과를 smoothing 한다
ii) Boosting : variance가 낮고 bias가 큰 base Learner들을 결합한다. bias가 큰 능력이 떨어지는 model들을 결합하여 각각의 능력을 결합해 좋은 결과를 내게 한다
먼저 Bagging에 대해서 먼저 알아보도록 하자
Bagging은 부트스트랩을 결합(aggregate)해서 얻는 방법이다. 여기서 말하는 부트스트랩이란 데이터나 feature를 샘플링해서 얻은 모델을 말한다. 이때 모델은 사용자가 직접 지정하고 data 샘플링 전에 지정한다. 각각의 부트스트랩의 variance를 줄일 수 있으면 bias도 낮고, variance도 낮은 좋은 성능의 모델을 얻을 수 있다. 이때 한번 샘플링한 training data는 재활용 가능하다
ex) 7000개의 데이터를 샘플링해서 모델 하나를 얻고 또 다르게 7000개를 뽑아서 모델을 얻고...이를 반복
=> 데이터에 중복은 있을 수 있지만 완전 같지는 않다. 즉 조합이 다르므로 독립적 특성을 지닌다
Bagging은 전체 데이터보다 적게 데이터를 이용해 샘플링하므로 Base Learner가 높은 variance를 가질 수 있다 => training data에 대해서는 아주 잘 표현하는 모델 => 예측 variance가 크기 때문에 이를 낮추기 위해 regression의 경우 averaging, 분류의 경우 majority voting을 해서 결과를 낸다.
Q. 그러면 여러 개의 Base Learner를 활용하는데 다른 모델들을 사용할 순 없나요?
A. Bagging에서는 다른 모델들을 사용하지 않습니다. 물론 사용자의 필요에 따라 커스텀하여 서로 다른 모델들을 사용할 수있고 이는 스태킹이라고 부릅니다. 이 경우 성능 향상에 도움이 됩니다. 하지만 우리는 배깅과 부스팅을 주로 다를 것이기에 스태킹이라는 것이 있다정도만 알고 지나갑시다
classification에서 bagging이 어떻게 적용되는지 보여준다. Bagging을 사용할 시 모델 하나를 활용하는 것보다 일반적으로 더 좋은 성능을 보일 수 있다. 그리고 뒤에 나올 부스팅과의 차이점으로 bagging은 병렬적(parallel)으로 학습을 진행한다
대표적 예시를 하나 보도록 하자
Bagging이 가장 많이 활용되는 모델이 바로 Random Forest다. bagging + 결정 트리로 여러 개의 결정 트리를 랜덤 샘플링을 통해서 만들어, 즉 여러 개의 트리 결과를 가지고 하나의 결과를 낸다. 기본적으로 50개 이상의 base Learner를 사용하고, 각각의 base Learner가 램덤한 feature를 가짐으로 각자 다른 관점을 가진다. 저기 적혀있는 OOB는 원래 나올 수 있는 결과의 경우를 의미하는 표현이다(이건 그냥 알고만 넘어가자)
여기서 우리가 알 수 있는 점이 하나 있다. 결정 트리에서는 오퍼피팅을 규제하기 위해 pruning을 진행한다. 하지만 bagging에서는 오버피팅된 여러 결정 트리 모델들을 활용해 variance가 클 때의 단점을 보완하므로 굳이 pruning을 진행할 필요가 없다
이어서 부스팅에 대해 알아보자
Bagging과는 반대로 variance는 낮은데 bias는 큰 모델들을 잘 결합해 bias를 낮추는 쪽으로 활용하는 것이다. 핵심 개념은 앞의 모델이 학습하고 난 후 앞에서 잘 표현하지 못한, training error가 높은 데이터에 대해서 그 다음 모델을 학습할 때 확률이 높아지도록(=샘플링 확률 up) 데이터 샘플링을 해서 다음 모델을 학습하고 이 과정을 반복하는 것이다. 앞의 모델의 약점을 보완하는 식으로 계속 학습을 하는 것이다.
조금 더 설명하자만 각각이 잘 표현하지 못하는 데이터가 있을 텐데 이를 서로 보완해줄 수 있는 결합 방법을 사용한다. 정리하자면 앞의 모델을 보완해주는 식으로 다음 모델을 만들고, 또 다른 모델을 만들고... 여기서 우리는 Bagging과의 차이점을 알 수 있다. 바로 병렬적이 아니라 sequential learning을 한다는 것이다.
=> 하나의 모델을 학습해서 결과를 보고 잘 표현하지 못한 데이터를 다음 모델에서 표현할 수 있도록 보완해주는 방법론이다.
Boosting의 예제에 대해 알아보자
대표적으로 AdaBoost가 있다
1. 트레이닝 에러가 높은 데이터는 나중에 선택될 확률을 높이기 위해 observation weight를 높인다
2. Sequential하게 for문을 돌면서 M개의 모델을 학습
3. 각자의 classifier는 가중치를 얼마만큼, 학습한 모델에 대한 에러를 계산해서 그에 따라 에러에 관련된 coefficient를 도출해내고 이 값에 따라서 이 모델을 학습하는데 사용된 데이터는 알파값의 비중을 반영한만큼의 weight를 업데이트한다. 이를 통해 다음 모델이 에러가 큰 데이터에 대해 더 중요하게 다루도록 한다.
=> 이 업데이트된 weight에 따라 데이터를 샘플링해주고 이 과정을 반복한다. 이때 계속 순차적으로 진행하고, 결합할 때는 알파를 곱한 다음에 각각의 결과에 대해 결합한다
Bagging과 Boosting을 한 눈에 볼 수 있도록 정리했다
Bagging | Boosting |
여러 모델을 병렬적으로 학습시켜 독립적으로 등록하게 하고, 결과를 결합 | 여러 모델을 순차적으로 학습시켜 이전 모델의 오류를 보완 |
parallel learning | sequential learning |
Base Learner 간 서로 독립적 | base Learner 간 상호 의존적 |
variance가 높은 모델(overfitting) | bias가 높은 모델(underfitting) |
각 모델이 서로 다른 부트스트랩 샘플링(랜덤 샘플링) 데이터(증복 ok) | 전체 데이터를 사용하되 잘못 예측된 데이터에 더 많은 가중치 부여하여 샘플링 |
Averaging, Majority voting | 가중치를 고려한 예측 값의 합 |
학습 시간 단축 | 학습 시간이 길다 |
성능 향상이 제한적일 수 있음 | 과적합의 가능성 |
random forest | adaboost, gradientboost |
데이터가 노이즈가 많거나, 모델 간 독립성이 중요할 때 | 데이터를 정교하게 다루거나 bias가 큰 모델을 점진적으로 계산 |
이어서 GradientBoost에 대해서 기본 개념과 회귀와 분류에서 예시를 보도록 하자
먼저 gradient decent에 대해서 알 필요가 있다. 경사하강법에서는 두가지가 핵심이다.
1. 어느 방향으로 갈 것인가? 2. 얼만큼 갈 것인가?
경사하강법이란, 최적의 parameter를 찾는 방법이다. 모델의 weight가 있고 loss function이 있다. loss를 최소화하는 것이 목적이다. 회귀의 경우 MSE, 분류의 경우 cross-entropy를 손실함수로 두고 loss가 최소가 되는 모델 파라미터를 찾는다. 계속 iterative하게 업데이트하는데 loss를 줄여주는 쪽으로 weight를 업데이트한다. 현재 지점에서의 편미분을 이용해 기울기가 양수라면 weight를 줄여주는 방향으로, 음수면 늘려주는 방향으로 가야 loss를 줄일 수 있다. 즉 기울기를 통해 업데이트 방향을 알 수 있다.
Q. 어느 방향으로 가나요?
A. 식을 보면 이동할 양에 -가 붙어 있는 걸 볼 수 있습니다. 즉 기울기의 반대 방향으로 업데이트 합니다
Q. 얼마만큼 가나요?
미분 값으로 알 수 없기에 적절히 학습률을 곱해 그만큼 업데이트해주어야 한다. 식에서 학습률이 곱해진 부분이 얼마나 줄일 지에 대한 것이다.
이 내용을 토대로 보면 gradient Boost는 첫번째 모델이 나아갈 방향을 Gradient를 통해 계산해주고 Loss에 대한 Gradient에 따라 모델이 나아가야할 방향으로의 업데이트를 학습해준다. 이들을 결합해 결합된 모델이 업데이트되는 식으로 각각의 모델의 결과를 병합한다
EXAMPLE 1) 회귀에서의 그라이언트 부스트
1. 하나의 값으로 예측
2. residual을 줄여주는 쪽으로 예측
3. 새로운 예측은 0번째 Tree의 결과 + 학습률 x (첫번째 트리의 결과)
4. 앞에서 구한 예측 값들과의 residual을 다시 구함
5. 앞에서 구한 예측에 새로운 트리 x 알파를 더하여 구한다
특정 기준을 세워준 다음에 특정 기준에 따라 멈출 때까지 트리를 계속해서 만들어줘서 최종 결과는 트리들의 결과(리프)에 하이퍼파라미터(알파) x Tree를 다 결합해서 전체 모델의 결과를 얻는다
residual은 loss를 미분한 값 = gradient이다. 즉 residual에 대해 트리를 학습하는 것이 gradient를 고려한 모델의 업데이트 방향을 결정하는 것이 된다. 각 리프 노드에 대해 loss를 업데이트한다. 리프 노드에 대해 계산해준 다음 모델 업데이트에 활용한다
분류 문제에 대해서도 예시를 보자. 분류 문제는 loss function을 log odd에 근거한 확률 값으로 두게 된다. 따라서 어떤 클래스에 속할 확률이 있으면 실제 확률과 예측 확률의 차이를 residual로 두어야 하는데, 각각의 리프에서의 예측값은 log odd이기 때문에 log odd와 확률 사이의 변환을 해주어야 한다
1. 초기 예측값을 정한다. 1이 6개니까 0.6으로 둔다
2. 각각의 residual 계산
3. tree 학습
=> 위의 식을 이용해서 구함. 이 식을 꼭 외우자(시험을 위해...)
4. 새로운 예측
=> log odds를 구한 다음 이를 분류니까 시그모이드를 이용하여 확률값으로 변환해준다
5. 새로운 레지듀얼 계산
이 트리들의 결과 값을 가지고 log odd를 계산해주고 얘를 가지고 최종 확률값을 도출한다. 따라서 classification을 위한 gradient boosting 방식을 활용한 decision tree를 만들 수 있다.
수식적으로 한번 보자. 워낙 복잡해서 구체적으로 보기 보다는 이렇게 하더라만 보도록 하자
=> loss 값에 대한 감마 값에 대해 테일러 전개를 2차까지 하고 그 다음에 애를 0만드는 감마값을 구하기 위해 감마에 대해 미분한다
Gradient Boost에서 각각의 트리의 리프 노드를 대략 8~32개 트리는 100개 정도로 두는 것이 일반적이고 학습률은 적절히 정해주도록 하자!
마지막으로 XGBoost에 대해 알아보자
Gradient boost에서는 트리를 얼마나 만들어야 하는지, 얼마나 gradient를 계산해서 트리를 덧붙여야하는지 명확하지 않다. 따라서 XGBoost는 residual 값으로 트리를 구성하는 것이 아니라 Simularity를 가지고 트리 구성! 유사도는 스플릿을 했을 대 각각의 노드에 속한 애들이 유사한가를 말한다.
람다를 더해 overfitting되는 정도를 조정한다. loss 줄이기 + 규제 형태!
식에서 알 수 있듯이 Residual을 더해서 제곱하면 스플릿 포인트에 따라서 각각 유사도가 계산되는데 반대에 있는 노드는 더하면 거의 0(부호가 반대)이다. 이런 경우를 유사도가 낮다고 한다. 유사도의 기준 = residual의 합
유사도를 기준으로 pruning이 가능하다. 람다, 감마 두 가지 하이퍼파라미터를 가지고 gradient boost가 overfitting되는 것을 막는다. 일반적으로 XGBoost가 성능이 좋은 경우가 많다
적고 보니 내용이 좀 많다. 그만큼 설명이 어느정도 필요한 부분이고 많이 쓰이는 부분이라는 것을 알았으면 좋겠다. 다음 시간에 Neural Network에 대해서 알아보도록 하자
'AI > MachineLearning' 카테고리의 다른 글
[ML] Deep Neural Networks (0) | 2024.12.07 |
---|---|
[ML] Neural Networks (3) | 2024.12.07 |
[ML] Decision Tree (0) | 2024.11.07 |
[ML] Nearest Neighbor Method (0) | 2024.11.06 |
[ML] Logistic Regression (0) | 2024.11.06 |