22.04.27 정답이 있는 문제 풀기 2주차

2022. 5. 4. 12:34카테고리 없음

 

저번 시간 복습

AI : thinking acting+humanly rationally

머신러닝 : data로부터 future task에 대한 performance를 향상시키는 것

딥러닝 : hierarchical representation learning(계층적 표현을 학습)

 

머신러닝의 approximation-generalization 문제점 - capacity가 크면 Etrain은 줄어드는데 Etest~=Etrain이 안되고, capacity가 작으면 Etrain이 안 작아진다.(underfitting overfitting 인가?)

 

오늘 배울 것

- Supervised Learning 

- Linear Model

- Decision Tree

- Ensemble: Bagging, Boosting

- 실습 Logistic Regression, Decision Tree + HW2

 

Supervised Learning

Y가 유한한 값이냐 연속적인 값이냐에 따라 Classification, Regression이 나눠진다.

 

Supervised Learning의 두 단계

input variable이 모델의 input으로 들어왔을 때 prediction을 내놓게 되고, 그 prediction이 실제 정답 y과 최대한 가까워지도록 fitting하는 식으로 훈련됨. 그리고 fitting이 끝나면 최종 모델을 test data에 대해 inference를 진행해서 성능을 측정함.

 

Supervised Learning 은 어떤 모델(어떤 가설 = hypothesis)을 쓰느냐에 따라 달라진다.

Linear Model 종류로는 Linear / Logistic Regression , Support Vector Machine(SVM)이 있고

확률 모델의 종류로는 Naive Bayes , Gaussian Process 가 있음

K-Nearest Neighbors(KNN) : 트레이닝 셋에서 가장 가까운 neighbors를 가지고 판단하는 알고리즘

Decision Tree 기반 모델 : Decision Tree, Random Forest

딥러닝 : Neural Network

-> 데이터셋의 크기, 데이터의 형태 등에 따라 적절한 모델을 사용해야 한다.

그럼 각 모델에 대해 간단하게 알아보자.

Linear Model  : input이 d차원의 벡터라고 했을 때 각 차원의 숫자를 x1~xd까지 표현할 수 있다. 그 각 차원의 각각의 weight가 있어서 w1x1 +w2x2 + w3x3 ... 이렇게 weighted sum을 하고 거기어 어떤 constant= bias b를 더하는 모델

이걸 벡터로 써보면 볼드체(벡터를 의미)로 wT*x +b 형태로 쓸 수 있다. 아래 그림처럼.

여기서 왼쪽 그림처럼 classification에서는 linear model의 쓰임새가 약간 다르다. regression은 데이터를 설명할 수 있는 선을 직접 찾는 것이었다면 classification은 decision boundary를 찾는 것이 테스크이다.

decision boundary라는 것은 두 가지의 다른 범주가 있을 때 그것을 갈라주는 선을 찾는 것이다.

 

SVM(Support Vector Machine) : Linear Model을 기반으로 하는 알고리즘? 모델. 딥러닝 이전에 가장 인기있었던 알고리즘으로 Max Margin Separator를 찾는 것이 목표이다.

- 맨 왼쪽 그림을 보면 별로 좋지 않은 decision boundary이다. 데이터와 boundary가 가까워서 노이즈가 섞여있다. 그래서 검정 데이터인데 흰색 데이터로 착각 할 수 있는 것이다.

- 그래서 좋은 decision boundary는 오른쪽 그림처럼 일정 margin을 두고 데이터와 떨어져 있는 것이 중요. 저 margin이 크면 클수록 좋기 때문에 Maximum margin separator를 찾는 게 SVM의 목표이다.

- 저기서 margin과 접해있는, 가까운 데이터(동그라미 친 데이터)를 Support Vector라고 한다. 이 SVM은 수학적으로 잘 정의되기 때문에 Convex Optimization을 통해 해결할 수 있다. Convex Optimization이란 우리가 최적화하고자 하는 함수가 Convex의 형태를 띈다는 것이다.(global min이 가기 쉽다..같은 느낌)

- Linear separable : input data를 정교하게 갈라줄 수 있다~ 만약 Linear inseparable하다고 해도 SVM은 문제를 해결할 수 있다.

- Linear inseparable : 저 input data들을 고차원의 공간으로 보낸다. 그 다음 decision boundary를 정한다. 2차원에서는 선이었지만 저 그림의 예시처럼 만약 3차원으로 간 경우 decision boundary는 면이 될 수도 있다.

- SVM은 수학적으로 잘 정리되고 성능도 좋지만,  input feature가 적고 저차원일 때 가능하다는 한계가 있다.

만약 input feature가 많고 학습데이터가 많아지면 주로 NN을 이용해서 분류를 한다.

근데 input data가 적으면 NN보다는 SVM이 더 좋을 수도 있다. 학습 데이터가 적을 때 NN의 경우 a 그림처럼 overfitting된 decision boundary를 찾을 수도 있다(capacity가 크기 때문에) 따라서 이럴 때 SVM을 써주면? 굳굳

 

 

Naive Bayes Classification : Bayes Rule이라는 조건부 확률 공식을 이용해 분류 문제 해결하는 알고리즘

임의의 n개의 feature를 가진 인풋 x1..xn이 주어지고, 그 인풋 feature들이 서로 독립일 때 그 x들이 y로 분류될 확률을 계산할 수 있음.

여기서 저 3번째 분수에 있는 P(xi|y)/P(x1..xn)이 가장 큰 값이 y label이 되는 것이다. 그래서 최종적으로 저 y^에서 저 조건부 곱(파이P(xi|y)를 최대로 하는 y를 구한다 는 말(arg max)

- 저 P(xi|y)를 어떤 확률분포로 모델링하느냐에 따라 Navie Bayes Classification의 알고리즘들이 나뉜다.

 

예를 들어 P(xi|y)를 Gaussian으로 하면 Gaussian Bayes Classification이고, Multinomial Division으로 모델링을 하면 Multinomial Naive Bayes가 된다. 

- y의 확률 = P(y)는 training set의 y의 비율로 계산한다.

키, 몸무게, 발사이즈가 input feature x1,x2,x3가 되는 것이고 성별이 예측하고자 하는 정답 label y가 되는 것이다.

만약 Gaussian 분포로 남자일 때 키, 몸무게, 발사이즈에 대한 평균값과 분산을 가지고 Gaussian 분포를 만듦

- 그리고 나서 트레이닝 셋에는 없는 x1,x2,x3값이 들어왔을 때 각각의 Gaussian 분포에서 확률(P(x1),P(x2),P(x3))을 계산할 수 있다.

그것들을 다 곱하고 P(남자)=0.5를 곱하면 새로운 데이터가 들어왔을 때 남자일 확률을 구할 수 있고, 여자일 확률도 구할 수 있다. 그 둘을 비교해서 더 큰 값을 최종 라벨로 예측하게 된다.

 

- Naive Bayes Classification은 적은 training set으로 가능, 계산 속도도 매우 빠르다.

그러나 input feature가 독립이라는 가정이 너무 이상적이다. 실제로는 키-발사이즈-몸무게는 서로 독립일 리가 없다.

그러므로 정확도에 중점을 둔다기보다는 가볍고 빠르게 돌아가는 데 ㅇㅋ

 

Gaussian Process : 데이터셋 x,f(x)의 집합이 Gaussain Process에 의해 생성되었다고 가정한다.

예를 들어 x가 n개면 Multivariate Gaussian이 된다. Multivariate Gaussian은 N(평균,분산) 에서 평균(벡터)과 분산(covarient matrix)이 행렬로 주어진다.(1차원에서는 그냥 실수값 하나로 주어질 수 있는데 반해)

새로운 x*가 들어와도 Multivariate Gaussian을 따를 것이기에 조건부확률을 통해 f*의 평균값과 분산을 예측할 수 있다.

 

그럼 우리가 예측한 정답인 f*에 대해 Gaussain 분산이 있기 때문에 confidence(신뢰도)를 알 수 있다.

대신 input feature들이 고차원이거나(x1,x2,x3...이 너무 많음) -> 적용이 어렵다

K Nearest neighbors(KNN) : training data들을 모두 저장해놨다가 새로운 input data가 들어왔을 때 그 training data에서 k에 가장 가까운 neighbor를 통해 prediction(classfication 또는 regression)을 한다.

- Nonparametric approach란? training data의 숫자가 늘어날 때 parameter 갯수도 같이 늘어나는 것.

- Parametric approach 는 그렇다면 linear model을 생각하면된다. ( training data가 늘어나도 parameter(w랑 b)는 늘어나지 않음)

- KNN은 input feature가 저차원이고, 학습데이터가 많을 때 잘 작동된다 ㅎㅎ

그러나 학습 데이터가 많으면 계산 cost가 커지는 문제 또한 발생

 

- classification : input이 들어오면 training set에서 그 데이터와 가장 가까운 k neares neighbor를 찾은 다음 그 데이터에서 output label y가 있을텐데, 거기서 다수결을 통해 가장 많이 나오는 label y로 prediction 결과를 정한다.

맨 왼쪽 그림 : k=1일떄인데, overfitting이 심하다. (outlier 들에도 fitting이 됨)

그 오른쪽 그림 : k=5 좀더 안정적으로 fitting , k를 잘 정하는 것이 중요.

- regression : 오른쪽 두개 그림. k=3이라고 치면 가장 가까운 3개의 neighbors에서 그 y축 값들의 평균/liner regression을 취하는 것.

세 번쨰 그림(평균)의 단점 : 맨 왼쪽, 맨 오른쪽 부분은 3개 neighbor이 고정이므로 regression 식도 고정이 되서(상수함수처럼 보임) 에러가 크다.

네 번째 그림(linear regression): 가장 자리에서도 consistent 하게 예측을 한다. 괜찮음

 

- KNN은 쉽고 간단하지만, Curse of dimmensionality라고 해서 input feature가 고차원이 되면 training data가 아무리 많아도 그 고차원의 공간을 다 커버하기가 어려움(오차가 큼 - 두번째 그림의 뒷부분). 치명적 단점.

- training data가 밀집한 부분에서는 정확한 decision boundary를 얻을 수 있지만 training data가 부족한 영역에서는 부정확한 예측값을 내놓는다.

현재 저 네 개 그림들은 input feature가 2차원인 경우인데, 만약 차원이 더 많아지면 training data가 커버하지 못하는 영역이 더 많아지게 될 것! (Curse of dimmensionality)

-> 학습 데이터를 필요한 공간만큼 많이 얻을 수 있냐..에 대한 문제

 

 

 

Decision Tree : 각 노드에서 어떤 input feature의 성분(attribute)에 대해서 test를 해서 분기를 하고, 그걸 반복하다보면

맨 바닥에 있는 잎새노드에서는 prediction 결과를 얻는 방법. 

사람의 사고방식과 비슷하다.. 사람이 없는 식당.. 웨이팅 안한다, 배고프다 등등 -> explainable 하다고 한다

(supervised learning 중 하나. 의사결정트리)

- 계산 대비 성능이 뛰어나다. 하지만 overfitting 이 되기 쉽다는 단점이 있음.

- overfitting 해결방법 -> Random Forest ( decision tree가 여러개 있다. ensemble, 트리 하나로만 결정하는 게 아닌 여러 개의 트리로 최종 예측 )

 

Neural Network : input layer에 input feature가 들어가고 각각의 노드를 이전 레이어의 모든 노드와의 연결을 통해 weighted sum을 하고 거기에 어떤 함수 g를 거친 결과를 내도록 모델링을 한다.

그리고 그 노드 여러개를 모아 hidden layer를 만들고, 그 hidden layer를 여러 층을 쌓아 반복적으로 계산해서 최종 output을 낸다. 이 예측 output과 y label 사이의 loss를 가지고 gradient descent하여(학습) weight를 업데이트한다.

- NN 또한 explainability가 없는 black box model이라고 할 수 있다. 말로 설명하기는 어렵다.

- 그리고 overfitting이 잘 될 수 있다. 그러나 regularization 기술을 잘 쓰고, 학습데이터를 많이 마련할 수 있다면 좋은 성능을 낼 수 있다.

- 특히 input data가 고차원(ex 이미지)인 경우에도 좋은 성능을 낸다.

여기까지 Supervised Learning 정리

어떤 모델(DNN, Random Forest, SVM, KNN, Decision Tree, Linear Regression)을 쓰느냐는 데이터 형태, 갯수, computational budget(모바일에서도 잘 돌아가려면.. 메모리, 연산속도 문제), explainability(자율주행 - 책임 소재를 정할 수 있음, 왜 잘못된 결정을 내렸는지에 대한 정보)도 중요하다.

- NN은 accuracy는 높지만 explainablity가 떨어지기 때문에 평균적인 성능이 중요한 어플리케이션에 사용되고

decision tree같은 알고리즘은 explainability가 높아서 그럴 때 쓰면 된다. linear model은 explainability는 매우 높지만 모델이 너무 간단해서 현업에서 자주 쓰지는 못한다.

 

Linear Model

input feature가 d차원일 때 weighted sum에 bias를 더해서 hypothesis를 세움

- 장점이 많다. 구현하기 쉽고, explainability도 높고, 그리고 간단해서(model capacity가 작음)

- 그리고 확장성도 좋다.

- output variable의 형태에 따라 regression 이냐 classification이냐가 나뉜다.

왼쪽 그림(regression) : output variable이 연속적 형태이고, input으로부터 output을 직접 prediction하는 경우

오른쪽 그림(classification) : input feature이 주어졌을 때 label이 class label로 주어진다. 그러면 class를 구별하는 line(decision boundary)을 찾는 것.

Linear Regression

minw : w에 대해 함수의 최소값

arg minw : 최소값일 때 그 loss가 최소값이게 하는 w의 값을 반환

 

그럼 w를 어떻게 구하냐 input feature가 1차원일 때는 1. closed form solution이 있다. w0, w1에 대해 미분을 해서 두 값 모두 0이 되는 지점을 찾는다.

input feature가 커지면 closed form을 사용하기가 힘들다. -> Gradient Descent 사용

여기서 손실함수가 w들에 대해 convex한 2차함수 형태라서 w*=w-a*미분값 해서 w를 점차 업데이트하면 global loss에 찾아갈 수 있을 것.

 

non linear transform 사용 .. linear 아닌 형식으로도 h(x)를 설정할 수 있음.

Linear Regression의 classification

output label이 class label로 주어져있다. 단순하게 binary classficiation이라고 생각하자.. 그럼 label은 0 또는 1이 존재(두 분류뿐)

여기에서는 새로운 input이 들어오면 저 식에 넣고 그 부호로 decision boundary보다 위에 있으면 0 밑이면 1 이런식으로 부호로 판단했다.

 

Linear Classification(=perceptron) : linear model에 threshold 함수를 사용해 classification

Perceptron : 뉴런의 세포에 전기 신호들이 오면 그것의 weighted sum으로 어떤 문턱값 이상이 오면 활성화

perceptron learning rule : 예측이 틀리는 경우에 계속해서 w가 업데이트 되기 때문에 정확히 linearly separable한 경우에만 수렴한다( = outlier가 있으면 수렴하지 못하고 왔다갔다 함)

Logistic Regression : 노이즈가 많은 경우(outlier가 많은 경우)에는 linear classification을 해도 w가 수렴이 잘 되지 못하므로 linear classfication 할 때는 logistic Regression 방법을 사용한다.

일반적인 linear classfication 은 threshold를 이용해 바로 0 또는 1로 예측하지만

logistic regressoin을 사용하면 logistic 함수를 이용해 0일 확률 1일 확률을 0~1사이의 값으로 예측을 해준다.

logistic 함수(=sigmoid) : 모든 실수에 대해 0~1사이 값으로 mapping해준다. 부드럽게 생겨서 soft threshold라고 부름

 

이 때 손실함수로 MSE를 사용하지 않는다. 왜냐하면 MSE를 사용했을 때는 convex한 loss 함수가 되는데 logstic regression은 nonlinearity가 생겨서 MSE로 loss를 잡으면 convex하게 형태가 나오지 못해서 w를 찾아가기 힘듦.

-> log loss를 사용. 그러면 convex한 형태가 되서 gradient descent를 사용하면 w를 찾아갈 수 있다.

 

log loss : target label이 1일때는 뒷부분이 날아가고, target label이 0일때는 앞부분이 날아감.

그리고 앞에 마이너스 부호가 붙어있으니 loss를 작게 하려면 마이너스 뒤 부분을 maximize하면 됨.

즉 target label이 1일 때는 target label이 1일확률(0~1)인 hw(xi)가 커지게 되는 것이다.

target label이 0일 때는 target label이 1일 확률(0~1)인 hwxi)를 0에 가깝도록 만든다.

-> binary classfication 을 linear로 하게 된다면 이런 loss 함수를 많이 사용한다.

Neural Network로 binary classification의 확장

여러 input 신호가 들어오면 linear model 로 종합하고 거기에 threshold나 sigmoid같은 activation function을 적용시켜 

output신호를 계산하고 그 output을 또 다른 뉴런에게 전달해줌.

이런 뉴런들을 층층이 쌓아주면 NN이 된다.

Decision Tree

루트 노드, 엣지, 그 아래 노드들과 연결됨.. 자식노드, 부모노드, 가장 아래쪽에 있는 노드(=leaf 노드)

한 노드를 기준으로 양쪽으로 split이 됐을 때 왼쪽 subtree와 오른쪽 subtree가 존재할 수 있다.

depth는 대손같은 느낌. 0대손 1대손 2대손..

internal node = 루트 노드가 아니고 leaf 노드가 아닌? 중간부분의 노드?

분기가 한번도 일어나 본 적이 없는 노드 depth = 0

Decision Tree의 기본

공간 분할을 트리로 분기해놓음. t1보다 크면 R1 , t1보다 크면 R2 등등

explainability가 좋다 -> 어떤 예측변수가 최종적인 decision에 어떤 영향을 미치는지 파악하기 좋음

 

Regression Tree

예측 변수 : 경력과 안타수, 예측해야 할 것 : 급여

첫 번째 분기 조건 : 4.5년 이하면 5.11 크면 안타수가 117.5 이상 이하로 또 분기해서

예측 공간에 표시한 것이 오른쪽 그래프

R1는 왼쪽 리프노드, R2는 중간 리프노드, R3는 맨 오른쪽 리프노드

R1을 구분하는, 즉 경력이 연봉을 결정하는 가장 중요한 요소가 된다.

문제를 너무 단순하기는 하는데 큰 영역을 시각화하기 좋고 설명하기도 좋다.

Regression Tree를 만드는 과정

크게 두 개의 스탭으로 나뉜다.

1. 전체 예측변수 공간을 R1,R2,..Rj로 분할

2. 각 영역 안에서 거기에 속하는 training data의 평균을 통해 일관된 예측값을 반환한다.

 

분할할 때는 Box모양(3차원 이상)으로 분할하는데, 그것은 아래 적힌 식과 같다. X1,X2,X3...Xp까지 p개의 예측변수들이 있을 때 각 예측변수에 대한 하한,상한이 있다.

sum of squared error(SSE)를 최소화하는 Box를 찾는 것이 목표. 

각 영역에서 그 영역 안에 있는 데이터들과 그 영역 안에서 우리가 사용하는 예측값 

R1이 그 영역에 있는 데이터를 잘 표현하기를 바라고, R2가 그 영역에 있는 데이터를 잘 표현하기를 바라고.. 그렇다

그러나 모든 가능한 box를 고려하는 것은 불가능

-> Top down greedy 접근을 사용. Recursive Binary Splitting 방법을 사용

각 internal node에서 매번 아래의 SSE를 최소화하는 예측변수 Xj와 분할점 s를 찾는다.

j와 s가 정해지면, 즉 한 번의 split에 대해 그 떄 생기는 두 영역이 R1,R2로 쪼개지는데, 이 때 두 영역만의 SSE만 계산해서 그게 가장 작아지도록 j랑 s를 고른다.

그리고 또 그 분할된 영역 내에서 R1,R2를 잡기 때문에 recursive하다.

그리고 이러한 splitting은 stopping criterion(stopping condition)이 필요하다. 

만약 멈추는 조건이 없으면 한 영역이 데이터 하나를 포함할 때까지 계속 split을 할 수 있는 거고

그렇게되면 SSE는 0에 가까워지겠지만(training에 대해 error가 없음) -> 심각한 overfitting 문제가 발생.

그래서 적당한 만큼의 Tree를 만들기 위해 stopping condition이 필요.

큰 트리는 실제 test 데이터에서 성능이 안 좋을 가능성이 있다. 작은 tree가 training data와 test data에서의 차이 = variance도 적고 설명하기에도 좋다.

자주 쓰이는 조건 : 모든 leaf가 5개 이하의 데이터를 포함할 때까지 분할을 진행한다.

-> 그러나 이런 stopping condition만으로는 overfitting을 막는 데 충분하지 않다.

-> Pruning 진행

 

Pruning a Tree(가지치기) 

- stopping condition으로 트리를 만들때부터 아예 작게 만드는 방법도 있겠지만, 그렇게되면 당장의 step에서는 -> 근시안적인 문제

-> 큰 트리 T0를 만든다음에 pruning을 적용

Cost complexity pruning : 원래의 tree T0에서 leaf node를 몇 개 쳐내서 leaf node의 숫자가 더 적어진 subtree T중에서 SSE와 리프노드 갯수(|T|)에 알파를 곱해서 더한 전체 값이 가장 적은 서브트리 T를 찾는다.

-> 즉 SSE를 줄임과 동시에 leaf node의 숫자 |T|를 줄이고 싶은 것.

- (yi-y^)**2는 모든 리프노드에 대한 오차 계산

- 알파가 커지면 |T|를 줄이는 게 목적, 알파가 작아지면 SSE를 줄이는 게 더 큰 목적

- 알파는 보통 cross validation을 통해 결정

전체적인 Tree Algorithm

1. 큰 트리를 만든다. stopping condition 적용

2. cost complexity pruning을 통해 큰 tree를 pruning

3. K-fold cross validation을 통해 알파를 찾는다. (= training set을 K개의 부분집합으로 나누고 나서 K번의 학습 라운드를 반복) 저 3-1, 3-2를 여러개의 알파에서 계산한 다음에 최종적인 SSE를 가장 작게 하는 알파를 고름

4. 고른 알파를 가지고 큰 tree를 pruning해서 subtree를 반환한다.

 

여기까지는 regression tree

 

Classfication Tree

leaf node에 떨어지는 training data 중에서 가장 많이 등장하는 class가 해당 leaf node 영역의 예측 클래스가 된다.

식당에서 waiting 할지 말지 classfication 

색깔이 진한 클래스가 NO, 연한 것 Yes, 식당에 사람이 아예 없으면 웨이팅을 하지 않음

적당히 있으면 웨이팅을 함. 꽉찼으면 yes 2개, no 4개 -> 가장많은 클래스인 no를 따라감.

- split 조건으로 SSE가 아닌 다른 척도를 고려(label이 class기 때문에)

- p^mk(위의그림에서) m번째 영역 안의 데이터 중에서 k번째 클래스인 것들의 비율(yes가 1번째 class, no가 2번째 class) p^31은 2/6, p^32는 6/4(no의 비율)

- Classification error rate E = 1-max(p^mk)라 되어있느데 leaf node로 떨어져서 다수결(max)로 결정했을 때 그 노드 안에 있는 training data들 중에서 오류를 범하게 될 확률 -> 그러나 가장 높은 class만 보기 때문에 split 조건으로 그리 선호되지 않음. 그렇다면?

(예를 들어 Full일 경우 p^32는 4/6이고 그럼 E = 1-4/6=2/6=1/3 가 되는 것

-> 가장 좋은 split은 None이나 Some처럼 최대한 한 class만 많은 게 좋다.(바로 결정을 할 수 있으니)

-> 그럼 안 좋은 split은? Full처럼 여러 class가 섞인 region ..

즉, split을 했을 때 한 region에서 한 클래스의 비율이 높고 최대한 다른 클래스의 비율은 낮은 split이 좋다.

 

- 좋은 split 척도 2가지

Gini Index, Entropy  : 가장 높은 class뿐 아니라 모든 k개의 class를 모두 고려, 한 클래스로 치우쳐져 나오면 에러가 적게 나오고, 클래스 여러개가 골고루 나오면 에러가 크게 나온다.

-> node impurity(노드 불순도)라고 부르기도 한다.

단 pruning에서는 최종 예측의 정확도를 위해 Classification error rate를 사용

 

split의 세 가지 척도 계산하는 예시

오른쪽 공들이 더 에러가 적다(클래스가 최대한 적은.. 한 클래스만 비율이 높은 게 좋음)

 

Classification Tree 예시 - 심장질환 유무

1. 먼저 stopping condition을 만족할 때까지 큰 트리를 하나 만듦

2. cost complexity pruning -> cost parameter를 찾기위해 cross validation을 진행

저 두번째 그림의 주황색.. cross validation error? 트리 사이즈(=리프 노드 갯수)가 6일 때가 가장 작음

3. 리프 노드 개수 6개 되도록 pruning 진행

linear model vs decision tree 

2차원 상에서 decision boundary를 찾는 문제가 있다고 가정..

linear는 직선 형태의 boundary를 잘 찾고, decision tree는 box형태의 boundary를 잘 찾는다.

그래도 decision tree는 직선도 계단형식으로라도 찾을 수 있다.

decision tree의 장단점

단점 : overfitting에 취약 .. pruning을 통해 해결하려고 하지만 완벽한 해결이 어려움

단점2 input에 강인하지 못하다. input의 작은 변화에도 최종 결과에 크게 영향 -> 여러 개의 decision tree를 종합(ensemble 기법)

앙상블 기법 : Bagging, Boosting 기법

앙상블 기법 : 여러개의 간단한 building block 모델들을 결합해서 하나의 강력한 모델을 만드는 법

decision tree를 building block으로 쓰면 저 그림에 나온 앙상블 기법들을 활용할 수 있는데

random forest는 decision tree에 특화된 앙상블 기법이고, bagging 과 boosting은 디시젼 트리가 아니어도 다른 모델이어도 사용이 가능함.

Bagging (=Bootstrap aggregation)

 - variance가 시그마제곱인 독립변수 Z1..Zn이 있을 떄 이들의 평균 Z-의 variance는 시그마제곱/n이다.

-> 다른 tree 여러 개의 결과를 평균내서 최종 예측을 하면 variance를 줄일 수 있지 않냐?(클래스가 최대한 한 종류면 좋으니까) -> overfitting이나 input에 약한 문제를 해결하는 데 기대하고 있음.

 

- Bootstrapping : 데이터셋에서 random한 복원추출(주머니에서 공 뽑고 다시 넣음. K fold 와 다르게 겹칠 수 있따)을 통해 B개의 bootstrapped 데이터셋을 만드는 것.

그래서 최종 예측 식은 아래 f-bag와 같음. B개의 모델에 대해 각각의 결과를 평균 취하는 것. ( regression)

classfication은 B개의 클래스 레이블 예측 결과가 나오는데 거기서 다수결을 통해 가장 많이 나오는 클래스로 결정

- bagging 을 decision tree에 적용할 떄 각각의 B개의 tree들은 pruning을 하지 않는다. 왜냐면 bagging을 통해 variance를 줄일 것이기 때문에 최대한 overfitting되도록 high variance를 얻은 다음에 그다음에 bagging 적용

 

- Bagging할 때 복원추출을 하기 때문에 1/3정도는 한번도 뽑히지 않게 됨. 

-> Out of Bag(OOB) : 한번도 뽑히지 않은 데이터 -> cross validation할 필요 없이 validation error를 구할 수 있다

- Bagging : 예측 성능은 올리나 설명력이 낮아짐. -> 보완하기 위해 variable importance measure라는 것을 이용해서

각 예측변수들의 중요도를 확인함. 모든 tree의 각 예측변수의 split으로 인해 SSE가 감소한 정도를 측정하여 평균(저 빨간 그래프- 아래 값이 큰 변수들이 판단 자체에 중요하다..)

Random Forest - bagging 기법의 일종, 아까 bootstrap 할 때 B개의 데이터셋을 만들게 되면 서로 correlation이 높기 때문에 bagging을 해도 독립된 모델을 얻지 못한다. -> 독립적이라는 조건을 성사하지 못해 variance 감소 효과가 적다.

- random forest는 tree들의 correlation을 감소하기 위해(decorrelation) split을 진행할 때마다 전체 p개의 예측변수 중에서 랜덤하게 m개의 변수만 뽑고 그 중에서 split

Boosting - 트리들의 학습이 독립적으로 이뤄지는 bagging과 다르게 boosting은 이전까지 학습한 트리의 정보를 이용해 순차적으로 트리학습을 진행, bootstraping을 하지 않고, 전체 데이터셋을 사용하되 잘못 예측한 데이터에 집중하여 반복 학습을 시킴.

- 최종 예측값을 0 으로 초기화, 잔차(현재 예측값과 target variable간의 차이)로 tree를 fitting하면서 최종 예측값을 target variable에 가깝게 맞춰가는 것이 핵심이다.

- 그 다음 B만큼 반복하여 다음과정을 반복

 1. d개만큼의 split(=d+1개의 leaf 노드를 가진) tree f^b를 training data (X,잔차)에 피팅시킴

 2. 새로운 f^b를 람다라는 비율만큼 반영.. 저 식처럼 f = f + 람다fb

 3. 잔차를 업데이트

- 그 다음 최종 boosted model을 반환

boosting에서 정해줘야하는 세 개의 하이퍼파라미터

1. tree의 개수 B : 반복횟수. 너무 많으면 overfitting이 될 수 있음. -> cross validation으로 선택.

2. 감마 : lr같은 느낌 0.01~0.001 사이 값 사용. 람다가 작으면 속도가 낮아지므로 B가 커져야함.

3. split 횟수 d(leaf 노드 수 = d+1) : tree모델의 capacity 조절. d가 커지면 variance가 커지는데, boosting은 잔차를 가지고 피팅시키기 때문에 d가 클 필요가 없음. 

Bagging vs Boosting

Bagging :

- bootstraped 된 데이터셋을 병렬적으로 학습, 병렬 앙상블( 각 모델이 독립적)

- variance를 줄이는 데 특화 -> high variance, low bias 모델이 좋음

- n개의 모델이 있으면 그 n개의 모델 예측값의 평균이 최종 예측값이 됨.

- ex Random Forest ( 예측 변수를 m개만큼 랜덤샘플링)

 

Boosting : 

- 순차적으로 이전 모델의 오류를 고려해서 순차적 앙상블

- bias(d)를 줄이는데 특화 -> low variance, high bias 모델이 좋음

- ex Gradient Boosting, Adaboost , 잔차에 따라서 weight를 준다. ( 샘플링을 하지 않고 전체 데이터셋 다 사용) 

 

요약

실습 2-1 logistic regression과 2-2 decision tree