머신 러닝

[머신러닝 코세라 강의] (6주차) "알고리즘 선택 가이드라인" Machine Learning (by Andrew Ng)

마빈 Marvin 2022. 6. 21. 07:53

 

6주차  

알고리즘을 선택하는 가이드라인

 

Learning 알고리즘 평가

다음에 할 스텝 정하기

만약 내가 사용한 모델에 에러가 클 때, 다음은 어떻게 해야할까? 

     - 트레이닝 데이터를 더 찾는다. (하지만, 트레이닝 데이터를 더 수집한다고 에러가 줄어들지 않을 수 있다)

     - 공변량의 개수를 줄이거나 늘린다. 

     - 일차항을 이차항이나 그 이상으로 늘린다. 

     - Regularization 파라미터를 늘리거나 줄인다.

 

이러한 선택지들 중에서 성공할만한 선택지로 추리는 방법? ("머신 러닝 진단 (Machine Learning Diagnostic)")

 

가설 평가

training 데이터와 test 데이터로 분류한다. 트레이닝 데이터에서 에러(cost)를 최소화하는 파라미터를 추정한다. 그리고, 테스트 데이터에서 에러를 계산한다.

 

Classification 에러를 만들 때, threshold 를 0.5 이상일 때, 예측 값이 y = 1 처럼 생각했는데, threshold 는 항상 0.5일까? 

 

모델 선택과 Train/Validation/Test 데이터셋

어떤 모델을 선택할 것인가에 대한 문제이다. (일차함수/이차함수 등 선택, $\lambda$ 선택의 문제 등). 

트레이닝 데이터로부터 각 모델에 대해서 cost function 을 최소화하는 파라미터 벡터를 구한다. 그리고 나서, $J_{test} (\theta)$를 각 파라미터에 대해서 구하고, 이 cost function 을 최소화하는 값을 구한다. 하지만, 이 모델을 일반화하기 어렵다. 왜냐하면, 해당 테스트 데이터에 국한된 파라미터 값이기 때문이다. 

 

이러한 문제를 해결하기 위해서 데이터를 세 가지로 나눈다. 이 세가지는 Training set, Cross validation set (CV), 그리고 Test set 이다. 각각 60%, 20%, 20% 정도로 나눈다. 트레이닝 데이터를 이용해서 파라미터를 구한 이후, CV 데이티어셋에서 cost 함수를 구한다. 여러 파라미터 중에서 cost 함수가 가장 작은 경우를 선택한다. 그리고, 테스트 데이터에서 cost 함수 (generalization error)를 구한다. 

 

Bias vs. Variance

Diagnosing Bias vs. Variance

결과가 잘 나오지 않을 때, 알고리즘을 개선하기 위한 진단법으로 bias 와 variance 분석이 있다. 

데이터를 underfit 할 수도, overfit 할 수도 있고, 적당할 수 있다. Polynomial degree 를 높일수록 $J_{train} (\theta)$ 는 감소하고 $J_{cv} (\theta)$ (또는 J_{test} (\theta)$ 는 감소하다 증가한다. Polynomial 이 작은 경우에는 bias 가 높은 경우이다. 반면에 polynomial 이 큰 경우는 variance 가 큰 경우이다.

Bias 가 높은 경우에는 $J_{train} (\theta)$ 는 높고, $J_{cv} (\theta)$ 는 $J_{train} (\theta)$ 에 가깝다. 이와 달리, variance 가 높은 경우에는 $J_{train} (\theta)$ 가 낮고 $J_{cv}(\theta)$ 는 이보다 훨씬 높을 것이다. 

Regularization and Bias/Variance

Regularization 파라미터인 $\lambda$ 가 클 때는 bias 가 크다. 즉, undefit 의 경우이다. $\lambda$ 가 작을 때는 분산이 매우 커진다. overfit 의 경우이다. 

$\lambda$ 를 자동으로 찾는 방법을 생각해보자. $J_{train} (\theta)$, $J_{cv} (\theta)$, $J_{test} (\theta)$ 에서 regularization 텀을 제외한다. $\lambda$ 후보를 두 배 단위로 생각해둔다. Test 데이터셋을 이용하여, 각 $\lambda$ 에 대해서 $J (\theta)$ 가 최소화되는 $\theta$ 파라미터들을 각각의 경우에 대해서 찾는다. 그리고 나서, $J_{cv} (\theta)$ 를 cross-validation 데이터 셋을 이용해서 구한다. Cross-validation 에러가 가장 작은 파라미터를 찾는다. 테스트 에러를 리포트할 때는 파라미터를 적용한 $J_{test} (\theta)$ 를 이용한다. 

 

$\lambda$ 가 증가함에 따라서 regularization 파라미터 파트가 없는 $J_{train} (\theta)$, $J_{cv} (\theta)$ 가 변하는지 구해보자. $\lambda$ 가 작을 때는, regularization 을 거의 하지 않기 때문에, underfitting 을 하고, $\lambda$ 가 클 때는, regularization 을 많이 하기 때문에, overfitting 을 한다. $\lambda$ 가 증가함에 따라, $J_{train} (\theta)$ 는 지속적으로 증가한다. $J_{cv} (\theta)$ 는 감소하다가 다시 증가한다. 즉, $\lambda$ 가 낮을 때는 variance 가 클 때이고, $\lambda$ 가 클 때는 bias 가 클 때이다. 

 

[ ] 데이터를 이용해서 이 그래프를 그려보면 좋을 것 같다. 

 

Learning Curves

x-axis (가로축) 에는 training set 의 사이즈가 있고, y-axis (세로축) 에는 error 가 있다. Training set 의 사이즈가 커짐에 따라서 training 에러 는 증가한다. Cross validation 에러는 감소한다. 왜냐하면 데이터가 많아지면 일반화하기가 더 용의해지기 때문이다. 

만약 bias 가 크다고 해보자. 즉, underfiting 의 경우이다. training 데이터셋을 늘려도 cross validation 에러가 감소하지만 감소하는 폭이 감소한다. Training 에러는 증가하는데, 트레이닝 데이터가 매우 커지면 cross validation 에러와 train 에러가 가까워진다. 그리고, error 는 크다.

다음으로, variance 가 크다고 해보자. 트레이닝 데이터 셋이 적을 때는, $J_{train} (\theta)$ 가 작은 편이고, 데이터셋이 커짐에 따라서 이 training 에러는 증가하는데, 그 증가폭은 크지 않을 것이다. Cross-validation 에러는 큰 편이고, 데이터셋이 커짐에 따라서 이 에러는 감소한다. 그리고, 데이터셋이 매우 커질 때, training 데이터 셋과 cross validation 데이터의 차이는 클 것이다. 즉, variance 가 매우 클 때는 cross validation 에러가 지속적으로 감소하지만, 둘의 갭은 계속 클 것이다.

 

Deciding What to Do Next Revisited

데이터셋 더 구하기 -> variance 가 큰 문제를 해결 (learning 커브를 이용해서 상황을 파악)

Feature 숫자를 줄이기 -> variance 가 큰 문제를 해결

Feature 숫자 늘리기 -> bias 가 큰 문제를 해결 

Polynomial feature 늘리기 -> bias 가 큰 문제를 해결

$\lambda$ 줄이기 -> bias 가 큰 문제를 해결 (이유: feature 가 늘어난다) 

$\lambda$ 늘리기 -> variance 가 큰 문제를 해결 (이유: feature 가 줄어든다) 

 

Neural Network 와 overfitting

뉴럴 네트워크가 작을 때는, 파라미터가 작고 underfitting 문제가 발생할 수 있다. 반대로, 뉴럴 네트워크가 클 때는, 파라미터가 크고 overfitting 문제가 클 수 있다. 이 때는 regularization 으로 문제를 해결할 수 있다. 

그리고, 레이어 개수를 변화시킴에 따라서 cross-validation 에러의 크기를 비교하고, 에러가 가장 작은 경우를 선택할 수 있다. 

 

스팸 분류 만들기- 머신러닝 시스템 디자인.

우선순위 정하기

Supervised learning. x = 이메일의 특징을 단어들의 조합으로 표현 (deal, buy, discount, now, myname, etc.).  현실에서는 자주 나오는 단어를 선택. 에러를 줄이는 방법은 데이터를 더 구하거나, discount 와 dsciounts 처럼 비슷한 단어를 동일하게 처리하거나, 스펠링을 잘못 작성하는 등의 알고리즘을 개발한다. 

에러 분석

추천하는 방식: 실행 가능한 간단한 알고리즘으로 시작한다. 그리고 나서, learning 커브를 통해서 데이터가 더 필요한지, 더 많은 x 변수들이 필요한지 파악한다. 그런 다음에 cross-validation 에서 내 알고리즘이 실수하는 부분을 눈으로 확인한다. 스팸 분류를 예로 든다면, 어떠한 종류의 이메일인지 카테고리를 만든다. 그리고, 자주 등장하는 카테고리를 파악한다. 

새로운 numerical evaluation 을 할 때는, stemming (유사한 단어를 하나로 평가) 하는 경우와 그렇지 않은 경우의 cross-validation 에러를 비교한다. 

 

Skewed 데이터 다루기

Skewed Class 에서의 에러 측정 지표

예를 들어, classification 테스트의 에러가 1% 인데, 오직 0.50% 의 환자가 암 환자라고 해보자. y=0 의 알고리즘만 적용하더라도 에러를 줄일 수 있다. (Predicted class, Actual Class) 가 (1,1) 이면 True Positive, (0,0) 이면 True Negative, (1,0) 이면 False Positive, 그리고 (0,1) 이면 False Negative 이다. Precision = True Positive/# Predicted Positive = True Positive / (True Positive + False Positive). Recall = True Positive/# actual positive = True Positive/ (True Positive + False Negative). y=0 의 알고리즘의 경우 Recall = 0 이 되므로 좋은 분류 알고리즘이 아니라고 판단할 수 있다. 

Precision 과 Recall 의 trade-off

Precision 을 높이고 싶다면, threshold 를 0.5 대신에 0.7과 처럼 threshold 값을 더 높인다. Precision 이 높아지지만 recall 은 낮아진다. 반대로, 암을 빼먹는 경우를 피하고 싶다면 (avoid False Negative), threshold 를 낮춘다. Recall 은 높아지지만 precision 은 낮아진다. F score 는 precision 과 recall 을 비교하는 지표이다. $F_1$ Score $=2\frac{PR}{P+R}$. 0과 1 값 사이이다. 

머신 러닝을 위한 데이터

일반적으로 데이터가 많을수록 모델의 정확도가 높아진다. 하지만 추가적인 데이터의 feature $x$ 에 대한 outcome $y$ 를 인간이 정확히 추정할 수 있어야 한다. 데이터가 매우 많으면, parameter 가 많더라도 overfit 할 가능성이 줄어든다. 즉, 트레이닝 에러와 테스트 에러가 비슷할 수 있다. 파라미터가 많으면 bias 가 낮아지고, 데이터 셋이 많아지면 variance 가 낮아지는 측면도 있다.