티스토리 뷰
본 내용은 Coursera에서 Andrew ng 의 Machine Learning(기계학습, 머신러닝)을 수강한 내용을 정리한 것입니다. 이번 장에서는 Error가 발생한 경우에 무엇을 할지에 대한 접근(Deciding what to try next)에 대해서 알아보도록 하겠습니다.
1. Prioritizing what to work on: Spam Classification Example
[ Building a spam classifier ]
예를 들어 우리가 Spam Classifier을 만든다고 합시다. 아래의 왼쪽은 y=1인 스팸메일이고, 아래의 오른쪽은 y=0으로 스팸메일이 아닙니다. 이러한 이메일들이 무수히 많다고 할 때, Supervised Learning을 사용하여 어떻게 이것을 구분할 수 있을까요?
가장 먼저 해야하는 것은 가설함수의 feature에 해당하는 x를 어떻게 표현하느냐입니다. Spam Classifier의 경우에 Features x는 Spam or Non-Spam을 나타내는 100가지 단어들을 Features로 사용합니다. 예를 들어 andrew, deal, buy, now, discount 등의 단어를 features로 사용한다고 하면 우리는 이 Feature들을 알파벳 순으로 정리한 (1,100) 벡터를 생성하여 특정메일에서 해당 단어가 있으면 1을 없으면 0을 부여할 것입니다. 물론 실제로 이것을 구현할 때에는 Training Set에서 가장 많이 사용되는 단어 n개 (10000 to 50000)를 선택하는 것이 좋습니다.
이제 우리는 Spam Classifier의 Accuracy를 높여야 하는데 어떻게 이것을 할 수 있을까요?
Collect lots of data
Develop sophisticated features based on email routing information(from email header)
Develop sophisticated features for message body, e.g. should "discount" and "discounts" be treated as the same word? How about "deal" and "Dealer"? Features about punctuation?
Develop sophisticated algorithm to detect misspellings (e.g. m0rtage, med1cine, w4tches.)
먼저 데이터를 많이 수집하는 것이 도움이 될 수 있습니다. 하지만 이것이 항상 도움이 되는 것은 아닙니다. 그래서 우리는 Email Header나 Email Body에서 구분하기 좋은 Feature들을 찾아내거나, 잘못된 철자가 적힌 단어를 구분하는 알고리즘을 고안해내 이를 적용하여 정확도를 높일 수 있습니다.
2. Error Analysis
[ Recommended approach ]
Start with a simple algorithm that you can implement quickly. Implement it and test it on your cross-validation data.
Plot learning curves to decide if more data, more features, etc. are likely to help.
Error analysis: Manually examine the examples(in cross validation set) that your algorithm made errors on. See if you spot any systematic trend in what type of examples it is making errors on.
많은 Features을 가지는 복잡한 시스템보다는 간단한 시스템으로 시작하는 것이 좋습니다. Andrew NG 교수님의 경우에는 약 24시간정도를 빠르고 간단한 시스템을 구축하기 위해 소모한다고 하십니다. 그리고 나서 Cross-validation Data로 Test를 진행해줍니다. 그리고나서 Learning Curve를 Plot하여 어떠한 문제를 겪고있는지 진단하여 조치를 취합니다. 그래서 직감적으로 무엇인가를 고치는 Premature Optimization(어설픈 최적화)를 피하고 우리가 어디에 시간을 쏟아야 하는지 파악을 합니다. 이러한 과정을 거쳐 어느정도 System이 형성된 후에 Error Analysis를 해주어야 합니다. Error Analysis는 Cross Validation Set을 보고 어떤 유형의 예제에서 Error가 많이 발생하는지 수동으로 찾아내는 것입니다.
[ Error Analysis ]
예를 들어 $m_{cv} = 500$ 으로 500개의 예시들이 Cross Validation Set에 있고 우리가 작성한 알고리즘이 100개의 Email을 잘못 구분하였다고 할 때, 우리는 수동으로 100개의 에러를 분석하여 아래와 같이 Categorize 해야합니다.
What type of email it is?
What cues (features) you think would have helped the algorithm classify them correctly.
먼저 어떤 종류의 Email인지 분류를 합니다. 메일에는 Pharmacy, Fake, Steel Passwords, others 등의 종류가 있을 수 있고 그것을 분류하여 개수를 세어 아래와 같이 정리했다고 할 때, Steal Passwords와 관련된 분류를 제대로 하지 못하고 있으므로 이쪽 부분을 개선해야 함을 알 수 있습니다. 그리고 두번재로 어떤 Feature들을 추가하면 Email Classify에 도움이 되는지 생각해야합니다. 예를 들면 아래와 같이 Unusual Punctuation과 관련된 Feature를 추가하면 도움이 될 것입니다. 이렇게 알고리즘이 만들어내는 오류들을 수동으로 검사하는 것이 Error Analysis이며 이것은 우리가 나아가야하는 방향을 알려줍니다.
여기서 Error Analysis는 Test Set보다는 Cross Validation Set에 대하여 수행해야합니다. 왜냐하면 만약 우리가 Test Set을 통하여 새로운 Feature들을 추가하면 Test Set에만 들어맞는 Feature들이 선택될 것이고 그렇게 되면 $J_{test}(\theta)$ 는 새로운 예시들을 얼마나 잘 Generalize 하는지에 대한 기준으로 사용할 수 없기 때문입니다. 예를 들어 Stemming을 사용하지 않는 경우에는 5%의 Error, 사용하는 경우에는 3%의 Error를 갖는다는 수치적인 정보를 얻었다면, Stemming을 사용하자는 판단을 내릴 수 있습니다. 또한 Upper Case와 Lower Case를 분류해야 하는가를 고민한다고 한다면 이 역시도 아래와 같은 수치를 얻어서 구분할지 말지 판단을 내리면 됩니다.
[ The importance of numerical evaluation ]
학습 알고리즘을 구한혈 때 몇개의 Error를 갖는지 또는 몇개의 정확성을 갖는지 수치적으로 알 수 있다면 매우 중요할 것이고 이러한 정확한 수치로 알고리즘을 어떻게 개선할지 평가를 내리는 것을 Numerical Evaluation 이라고 합니다. 예를 들어 discount/discounts/discounted/discounting 을 같은 단어로 취급해야하는지 고민하는 상황이라고 할 때, Stemming Software를 사용할 수 있습니다. 이것은 앞의 몇개의 단어를 보고 같은 단어로 취급할지 안할지 결정하는 소프트웨어입니다. 물론 Universe/University 와 같은 예시에서는 문제를 발생시킬수도 있습니다. 그래서 Stemming Software를 사용할지 말지를 사용할지 말지는 실제로 적용해보고 수치적으로 값을 얻은 후에 판단을 내리면 됩니다.
3. Error metrics for skewed classes
[ Cancer Classification Example ]
앞의 강의에서 다루었던 Cancer Classification의 예제에서 우리의 Learning Algorithm이 Test Set에 대해 99%의 정확성을 보이고 1%의 에러를 보인다고 하면 굉장히 잘 돌아가는 알고리즘처럼 보입니다. 그러나 환자의 0.5%만이 실제로 암에 걸렸다고 하면 이 1%는 더이상 좋은 확률로 보이지 않습니다.
def predictCancer(x){ y = 0; /ignore x! return y; }
예를 들어 위의 함수와 같이 모든 입력에 대해 Cancer가 아니라는 예측을 하는 알고리즘을 작성했다고 하면 이것은 오직 0.5%의 Error을 보이며 우리의 Learning Algorithm보다 뛰어난 성능을 보이지만 이것이 더 좋은 알고리즘이라고는 할 수 없습니다. 이러한 경우는 y=1 또는 y=0인 Class에 극단적으로 Data가 몰려있는 경우에 발생하는데, 이렇게 Data가 극단적으로 적은 Class를 Skewed Class라고 합니다. 우리는 이렇게 Skewed Class에 의해 생기는 잘못된 알고리즘의 판단을 방지하기 위해 Precision/Recall의 개념을 도입합니다.
[ Precision/Recall ]
y=0 , y=1인 Class 중에서 y=1인 경우가 우리가 감지하고자 하는 Skewed Class라고 할 때, 우리는 우리가 실제로 예측한 Class인 Actual Class와 우리가 예측한 Class인 Predicted Class라는 개념을 도입하겠습니다. 예를 들어 Predicted Class = 1, Actual Class = 0 이라고 우리는 암이라고 예측을 하였지만 실제로는 암이 아닌 경우입니다. 이러한 경우를 그림으로 표현하면 아래와 같습니다.
Precision은 우리가 y=1 이라고 예측하는 환자들 중에서 실제 암을 가진 환자를 비율로 나타낸 것입니다. 반면에 Recall은 실제 암에 걸린 환자들중에서 우리가 맞춘 비율을 말합니다. 예를 들어 모든 Input에 대해 항상 y=0으로 예측하는 알고리즘은 Recall이 0이 됩니다. 왜냐하면 실제 암에 걸린 환자들이 있다고 할 때, 우리는 항상 암이 아니라고 예측을 하므로 분자가 0이 되기 때문입니다.
4. Trading off Precision and Recall
[ Trading off Precision and Recall ]
Logistic Regression: $ 0 \leq h_{\theta}(x) \leq 1 $
Predict 1 if $ h_{\theta}(x) \geq 0.5 $
Predict 0 if $ h_{\theta}(x) \lt 0.5 $
Logistic Regression을 이용하여 0/1(암에 안걸렷다/걸렸다) 를 분류하고자 할 때, [0,1]의 값을 내놓는 $h_{\theta}(x)$ 에 대해서 기준점(Threshold)를 잡아서 분류를 합니다. 만약 우리가 매우 확신에 찼을때만 결론을 내리고 싶다면 Threshold를 0.5에서 더 높게 잡으면 됩니다. 그러면 우리는 Higher Precision, Lower Recall을 갖게될 것입니다. 반대로 만약 우리가 암인 경우를 놓치지 않기를 바란다고 하면, Threshold를 더 낮게 잡아서 암이라고 예측하는 하는 경우를 높이게 될 것이고, Lower Precision, Higher Recall을 갖게될 것입니다. 이러한 Precision과 Recall의 관계를 그림으로 표현하면 아래와 같습니다. 그래프의 세부 곡선은 $h_{\theta}(x)$ 에 따라서 달라지지만 기본적인 개형은 같습니다.
[ $F_1$ Score (F Score) ]
위와 같은 3가지 알고리즘이 있다고 할 때, 어떤 알고리즘이 최선인지 어떻게 판단할 수 있을까요? 우리는 Single Real Number Evalutation Metric을 통해서 Precision/Recall을 얻을 수 있습니다. Precision과 Recall이 모두 높다면, 우리는 매우 확신에 찬 경우에만 판단을 내릴 것이며(Precision) 그러한 경우를 많이 놓치지 않을 것입니다(Recall). 우리는 P와R을 선택하기 위해 P와R의 평균으로 계산할 수도 있지만 이렇게 되면 Algorithm3처럼 y=0으로 항상 예측하여 Precision 또는 Recall이 극단적으로 치우친 상황은 판단해내지 못합니다. 그래서 우리는 F_1 Score 공식을 사용하여 최적의 알고리즘을 판단합니다. $$F_1 Score : 2 \frac{PR}{P+R}$$
5. Data for Machine Learning
[ Designing a high accuracy learning system ]
예를 들어 우리가 For breakfast i ate ________ eggs 의 빈칸에 to, two, too 중에서 어떤 단어를 넣어야 할지를 학습시킨다고 할 때, 연구자들은 여러가지 학습이론을 사용하였고, 많은 양의 Data를 사용하였습니다. 위의 그래프를 통해서 볼 수 있듯이 처음에 성능이 안좋았던 알고리즘이라고 하더라도 Training Set Size가 매우 커지면 다른 알고리즘을 앞지르는 모습을 보여주기도 합니다. 그래서 우리가 얻을 수 있는 교훈은 다음과 같습니다. $$ \text{ It's not who has the best algorithm that wins. It's who has the most data. }$$
[ Large data rationale ]
Feature x 가 y를 예측하기에 충분한 정보를 가지고 있다고 할 때, x는 주변의 단어들을 capture할 것이고 주변의 단어들을 본 후에 two를 선택할 것입니다. 하지만 집값을 예측하는 문제에서 오직 size만이 주어졌을때는 정확한 예측이 어렵습니다. 이런 경우에는 정확한 예측을 하기가 힘든데, 이렇게 Feature가 충분한지 아닌지를 판단하는 기준은 다음과 같습니다. 예를 들어 집값을 예측하는 전문가에게 집의 크기만 주고 집값을 예측하면 정확한 예측을 하지 못할 것이고 이러한 경우에 정보가 부족하다고 판단할 수 있습니다. $$ \text{ Given the input x, can a human expert confidently predict y? }$$ 그리고 Feature x가 y를 예측하기에 충분하다고 할 때, 우리는 다음을 신경써야 합니다.
Using a learning algorithm with many parameters -> $J_{train}(\theta)$ will be small
Use a very large training set (unlikely to overfit) -> $J_{train}(\theta) \approx J_{test}(\theta) $
먼저 우리는 많은 Parameter를 이용해야 합니다. Linear/Logistic Regression을 사용하는 경우에는 많은 Features를 사용해야 하며 Neural Networks를 사용하는 경우에는 많은 Hidden Units를 사용해야 합니다. 그러면 Low Bias Algorithm이 되어 $J_{train}(\theta)$ 가 작아질 것입니다. 거기에 더해 많은 Training Set을 활용한다면 Low Variance Algorithm이 되어 $J_{train}(\theta) \approx J_{test}(\theta) $ 이 될 것이고 많은 Feature들을 사용하므로 $J_{test}(\theta) $ 역시도 $J_{train}(\theta) $ 을 따라서 줄어들 것입니다.
[ Bias/Variance as a function of the regularization parameter $\lambda ]
$\lambda$ 가 작은 경우에는 $\theta$ 가 커져서 Overfit(High Variance) 문제가 발생할 것이므로 Training Set과의 오류를 나타내는 $J_{train}(\theta)$ 는 낮을 것이지만 새로운 Data와의 오류를 나타내는 $J_{cv}(\theta)$ 은 높을 것입니다. $\lambda$ 가 큰 경우에는 $\theta$ 가 작아져서 Underfit(High Bias) 문제가 발생할 것이므로 $J_{train}(\theta), J_{cv}(\theta)$ 모두 높게 나타날 것입니다.
관련 포스팅
- 기계학습이란? (1/11)
- 지도 학습과 비지도 학습 (2/11)
- Model and Cost Function (3/11)
- Gradient Descent (4/11)
- Multivariate Linear Regression (5/11)
- Logistic Regression (6/11)
- Regularization (7/11)
- Neural Networks: Representation (8/11)
- Neural Networks: Learning (9/11)
- Advice for Applying Machine Learning (10/11)
- Machine Learning System Design (11/11)
관련 포스팅
- 기계학습이란? (1/11)
- 지도 학습과 비지도 학습 (2/11)
- Model and Cost Function (3/11)
- Gradient Descent (4/11)
- Multivariate Linear Regression (5/11)
- Logistic Regression (6/11)
- Regularization (7/11)
- Neural Networks: Representation (8/11)
- Neural Networks: Learning (9/11)
- Advice for Applying Machine Learning (10/11)
- Machine Learning System Design (11/11)
'인공지능' 카테고리의 다른 글
CNN(Convolutional Neural Network)란? (0) | 2020.02.09 |
---|---|
Deep Learning(딥러닝) vs Reinforcement Learning(강화학습) (2) | 2020.02.09 |
[Machine Learning] Advice for Applying Machine Learning (0) | 2018.01.15 |
[Machine Learning] Neural Networks:Learning (0) | 2018.01.13 |
[Machine Learning] Neural Networks:Representation (0) | 2018.01.08 |