기계학습 6주차 노트 (Coursera, CS229, by Andrew Ng)


#1

온수당 Machine Learing Note (week #6)

  • Advice for applying machine learning

  • progress: 6 주차

  • date: 2016.05.31

  • Note:

  • 1주와 2주는 supervised learing 에서 Linear Regression(선형 회귀)을 공부했습니다.
  • 3주는 classification(군집화)에 대하여 공부했습니다.
  • 4주는 기계학습에서 사용하는 신경망(neural network)을 공부했습니다.
  • 5주는 신경망이 어떻게 학습을 하는지에 대하여 공부합니다.
  • 5주차 이후 중간 복습하는 시간을 가졌습니다.
  • 6주차에서는 기계학습에 도움될 여러가지 것을 공부합니다.

Week6 contents

  • Evaluating a Learning Algorithm

Deciding What to Try Next

Evaluating a Hypothesis

Model Selection adn Train/ᆶᆼValidation/Test Sets

  • Bias vs. Variance

Diagnosing Bias vs. Variance

Regulatization and Bias/Variacne

Learning Curves

Deciding Waht to do Next Revisited

  • Building a Spam Classifier

Prioritizing What to Work On

Error Analysis

  • Handling Skewed Data

Error Metrics for Skwed Classes

Trading Off Precision and Recall

  • Using Large Data Sets

Data For Machine Learning

Evaluating a Learning Algorithm

지도 학습의 방법으로 Linear Regression (선형회기) 와 logistic Regression(구분), Neural netowrk 을 배웠다.

어떤 것을 배워서 아는 것과 그것을 응용하여 무엇인가 만들어 보는 행동은 큰 차이가 있다. 지금까지 배운 기계학습 방법을 응용하여 무언가 만들 때 필요한 기술은 많은 종류가 있는데 이번주는 그것에 대하여 배워보자.

Deciding What to Try Next

집값을 기계학습으로 예측할 때 regularized linear regression 을 다음과 같은 수식으로 정의하였다.

가설을 세우고 학습을 시키면서 예상하지 못했던 것과 거기서 발생하는 오류를 만나게 될 것이다. 이것을 해결하려면 어떻게 해야 할까?

  • Get more training examples
  • 학습할 데이터를 늘린다.
  • 데이터를 늘린다고 해서 항상 도움이 되지는 않는다.
  • 데이터 수를 늘릴지 아니면 다른 것으로 개선할지 결정하는 방법을 배워보자.
  • Try smaller sets of features
  • 영향을 주는 요소를 줄여가 보자.
  • 결과에 영향을 요소가 영향을 주는지 아닌지 아는 것은 어렵다.
  • 어떨때 결과에 영향을 주는 핵심 요소만 뽑을 수 있는지 배워보자.
  • Try getting additional features
  • 영향을 주는 요소가 부족할 수도 있다.
  • 어떨때 결과에 영향을 주는 요소를 늘려가야만 하는지 배워보자.
  • Try adding polynominal features (ᆹᆻx1^2 , x2^2, x1*x2, , etc)
  • 가설 함수에 고차항을 추가 하는 것이 도움이 될 수도 있다.
  • 어떻 때 고차항을 추가하는 것이 도움이 될지 배워보자.
  • Try decreasing LAMDA (λ)
  • regularization 항을 계산하여 바꿔보자.
  • Tyr increasing LAMDA (λ)
  • regularization 항을 계산하여 바꿔보자.

Evaluating a Hypothesis

집값에 대하여 영향을 주는 가설 함수를 세우기 위해서 여러가지를 요소를 가정할 수 있다.

  • x1: size of house
  • x2: no. of bedrooms
  • x3: no. of floors
  • x4: age of house
  • x5: average income in neighborhood
  • x6: kitchen size
  • x100: xxx

이 것을 바탕으로 x1, x2, x3, x4 가 중요한 영향을 준다고 가설을 세우고 가설함수를 다음처럼 세웠다고 하자.

그리고 가설에 대하여 그래프로 (x: size, y: price) 에 따라서 그려보자.

여기서 이 가설 함수가 최적이라고 할 수 있을까? 최적이라면 어떻게 그것을 알 수 있을까?

가설 함수를 학습 시키는 것처럼 가설 함수를 시험해 보는 것도 필요하다.

우리가 수집한 데이터를 가지고 학습(training set) 과 시험(test set) 을 사용해야 할 것이다.

  • 70%는 학습에 사용 (ᇂTraining set: 70%)
  • 30%는 시험에 사용 (Test set: 30%)

학습에 사용할 데이터와 시험에 사용할 데이터는 잘 썪어야만 학습과 시험에 대한 오류를 줄 있수 있다.

잘 학습되었는지 비용함수로 알아보았듯이, 시험이 잘 되었는지 시험에 대한 비용함수를 만들어서 알아 볼 수 있다.

학습에 대한 비용함수와 똑같이 시험에 대한 비용 함수도 square error 를 측정으로 계산할 수있다.

linear regression 에서 학습과 시험에 대한 비용함수를 계산하였듯이, logistic regression 에서도 똑같이 학습과 시험에 대한 비용함수를 계산 할 수 있다.

logistic regression에서 오류는 가설h(θ)에 대한 결과 y의 오류 함수가 될 것이다. 이것을 수식으로 정리하면 다음이 된다.

hθ(x) > 0.5 일 때 예상한 결과는 1이지만 결과가 0이 나왔다면 오류이다.

hθ(x) < 0.5 일 때 예상한 결과는 0이지만 결과가 1이 나왔다면 오류이다.

시험에 대한 오류도 학습에 대한 오류를 계산하는 것과 똑같이 수식을 세우고 계산할 수 있다.

이것이 가설 함수를 평가하는 표준 기술이다.

Model Selection adn Train /ᆶ ᆼValidation / Test Sets

어떻게 해야만 regulatization parameter나 고차항(polynomial) 차수를 줄일 수 있을까?

가설 함수를 세우고 각 요소에 대하여 고차항으로 함수를 세웠다고 하자. 요소가 1, 2, 3, , , 10으로 늘어나는 만큼 고차항의 차수 또한 늘어난다.

고차항의 차수를 d라고 하자.

  • d = 1 (linear)
  • d = 2 (quadratic)
  • d = 3 …
  • d = 10

각 요소에 대한 모델을 세워서 가설 함수를 만들수 있고, 이 것을 비용 함수 J를 이용해서 최적화된 값을 구할 수 있다.

  • d = 1: Jtest(θ1)
  • d = 2: Jtest(θ2)
  • d = 3: Jtest(θ3)
  • d = 10: Jtest(θ10)

강의에서는 d = 5 일 때 가장 작은 비용 함수 값을 가진다고 하였다. 하지만 이것은 시험으로 사용한 데이터에 맞추어 진 것이지, 학습할 전체 대상에 맞추어 진 것이라고는 할 수 없다. 그래서 Cross Validation(CV)를 세워서 교차 평가한다.

이렇게 나누어진 데이터에 대하여 각각 학습 오류, 교차 오류, 시험 오류를 계산 할 수 있고, 이 때 각각의 오류를 평가하기 위한 각각의 비용 함수를 사용한다.

많은 사람들이 기계학습을 실제 데이터로 학습 시키고 평가할 때 test set만 가지고 평가하여 결과 좋다면 OK한다. 이것은 많은 경우 좋은 결과를 가져오기도 하지만, 좀더 좋은 방법론을 말한다면 데이터를 교차 평가와 시험으로 나누어서 평가하는 것이 더 좋다.

Bias vs. Variance

기계 학습을 하였는데 가설에 대하여 High bias, High variance, 그리고 just fit 으로 구분할 수있다. 어떤 때 high bias 라고 하고, 어떨때 high variance 라고 하며 어떨 때 just fit이라고 하는지 알아보자.

Diagnosing Bias vs. Variance

  • High bias (underfit) d = 1

  • Just Right ( best) d = 2

  • High variance (overfit) d = 4

High bias와 high variance 일 때 각각의 비용 함수를 통하여 오류가 어떻게 변화하는지 그래프로 그려보자.

  • d = 1: high bias
  • Jcv의 오류 값은 크다.
  • Jtrain 의 오류 값은 크다.
  • d = 4: high variance
  • Jcv의 오류 값은 크다.
  • Jtrain의 오류 값은 작다.
  • 하지만 계산량이 많다.
  • d = 2: Just right
  • Jcv의 오류값이 최소 값이다.
  • Jtrain의 값은 최소 값은 아니다.
  • 계산량은 적절하다.

  • d가 너무 작을 때: high bias

  • d가 너무 클 때 : high variance

  • high bias

  • 학습 데이터를 잘 반영하여 맞추지 못한다.
  • high variance
  • 학습 데이터를 잘 반영한다.
  • 계산량이 많다.
  • 교차 검증을 하면 값이 커진다.

Regulatization and Bias/Variacne

Regularization LAMDA (λ) 에 대하여 under fit, just fit, over fit을 정리하면.

  • under fit

  • Just fit

  • Over fit

regularization parameter λ 를 구하기 위해서 가설 함수, 비용함수를 세우고,

각각의 λ에 대하여 비용함수 J(theta)를 최소화 하는 theta를 구할 수 있으며 이 때 요소 theta에 대한 교차함수의 비용함수를 정리할 수 있다.

비용함수를 학습을 위한 Jtrain, 교차검증을 위한 Jcv, 시험을 위한 Jtest라고 해서 각각을 정리해 보자.

비용함수 J(θ)에 대하여 regulatization 으로 정리하고, 이것을 학습(train) 과 교차 검증 (cv)에 대한 비용항수로 정리해 보자.

regularization parameter λ의 변화에 대하여 오류 값을 그래프로 그리면 다음처럼 그릴 수 있다.

  • 작은 λ일 때
  • high variance 를 갖는다.
  • over fit
  • 큰 λ일 때
  • hign bias 를 갖는다.
  • under fit

Learning Curves

학습에 사용하는 데이터 수 m에 대하여 알아보자.

학습에 대한 비용함수 Jtrain 과 교차 검증에 대한 비용함수 Jcv를 정리해 보자.

학습에 사용하는 수가 늘어나면 늘어 날 수록 Jtrain 과 Jcv에 대한 오류값을 그래프로 그려보자.

m이 작을 때: Jcv는 큰 오류 값을 가지며, Jtrain은 작은 오류 값을 가진다.

m이 커질 수록: Jcv의 오류 값은 줄어들며, Jtrain의 오류 값은 커진다.

High bias

데이터에 대한 직선 이다.

  • Jtrain

    • training error 는 작은 값에서 점차 커진다.
    • 학습 오류의 비용함수 training error 는 교차 오류의 비용함수와 가까워 진다.
    • 교차검증과 학습의 비용함수는 비슷한 값을 가진다.
  • Jcv

    • 데이터가 늘어남에 따라서 직선에 가까워 진다.
    • 많은 데이터를 사용한다고 해서 Jcv가 개선되는 것은 아니다.

high variance

데이터에 대한 가설함수는 곡선이며 많은 부분을 잘 반영한다.

  • Jtrain

    • m이 작을 때 training error 는 작다.
    • m이 늘어감에 따라 비용함수 값 또한 여전히 작다.
    • 매우 천천히 비용함수 값이 증가한다.
  • Jcv

    • 데이터가 늘어남에 따라서 비용함수 값은 줄어 들기는 하지만 크다.
    • 즉 데이터가 늘어난다고 해서 가설이 잘 맞는다고 할 수 없다.
    • 많은 데이터를 사용한다면 Jcv는 개선된다.

Deciding Waht to do Next Revisited

지금까지 배운 것을 정리해보자.

  • Get more training examples
  • 학습할 데이터를 늘린다.
  • 데이터를 늘린다고 해서 항상 도움이 되지는 않는다.
  • high variance를 개선하는데 효과적이다.
  • high bias에는 도움이 되지 않는다.
  • Try smaller sets of features
  • 영향을 주는 요소를 줄여가 보자.
  • high variance를 개선하는데 효과적이다.
  • high bias에는 도움이 되지 않는다.
  • Try getting additional features
  • 영향을 주는 요소가 부족할 수도 있다.
  • 어떨때 결과에 영향을 주는 요소를 늘려가는 것이다.
  • 가설함수가 간단했기 때문에 요소를 추가하면 할수록 가설함수의 오류를 줄여 준다.
  • high bias를 개선하는데 효과적이다.
  • Try adding polynominal features (ᆹᆻx1^2 , x2^2, x1*x2, , etc)
  • 가설 함수에 고차항을 추가 하는 것이다.
  • high bias를 개선하는데 효과적이다.
  • Try decreasing LAMDA (λ)
  • regularization 항의 영향을 줄이는 것이다.
  • high bias를 개선하는데 효과적이다.
  • Try increasing LAMDA (λ)
  • regularization 항을 영향을 늘리는 것이다.
  • high variance를 개선하는데 효과적이다.
  • ᆫneural network이 작은 경우

적은 layer나 적은 hidden layer 인 경우 네트워크는 under fitting이다. 계산량은 적다.

  • neural network 가 많은 경우

layer는 적으나, network수가 많다. over fit 된 것이다. 교차 검증을 해가면서 layer 수를 늘리는 것이 효과적이다.

  • neural hidden network가 많은 경우

layer가 많다. over fit 된 것이다. 계산 량이 많기 때문에 regularization을 하는 것이 효과적이다.

Building a Spam Classifier

처음에 지도학습에서 분류(Classification)을 이야기 할 때 스팸 메일 분류를 예시로 들었다. 실제로 스팸 메일을 구현하는데 고려해야 할 사항을 공부해 보자. 스팸이 많이 오기는 하지만, 전체 메일에 비하여 적거나 혹은 대다수가 스팸이라면 Logistic regression에 방법에서 발행할 수 있는 문제가 무엇인지 알아보고 이 때 시스템 성능을 평가하는 방법도 함께 알아본다.

Prioritizing What to Work On

  • 스팸 분류는 지도 학습이다. Supervised learning
  • 입력 x : Features of email
  • 출력 y:: Spam (1) or non-spam (0) label
  • Non Spam 로 분류된 이메일

  • Spam으로 분류된 이메일

  • spam/non-spam 을 구별할 수 있는 단어 100개를 추려서 feature x라고 하자.

  • feature x는 스팸으로 분류할 가능성이 높은 단어가 email에 포함되었는지 여부를 나타내는 vector로 표현할 수 있다.

  • 실제 스팸 필터에서는 사람이 수동으로 100개 단어를 뽑는것 보다는 spam으로 분류된 training set에서 가장 자주 나타나는 단어 n개 (10,000~50,000)를 선택한다.

  • 스팸 필터의 성능을 어떻게 하면 효율적으로 만들수 있을까?
    1. 데이터를 많이 모은다 (예: “Honey pot” project)
    2. Email routing information (from email header) 에 기반하여 스팸필터 알고리즘을 개선한다.
    3. Email 본문에 기반하여 스팸을 분류할 수 있도록 알고리즘을 개선한다.
    4. 의도적으로 스팸 필터에 걸리지 않도록 철자를 틀리게 쓴 단어를 검출하는 알고리즘을 개선한다.
      • (예: m0rgage, med1cine, w4tches…)

Error Analysis

오류 분석을 통하여 기계 학습 알고리즘을 개선하는 방법에 대하여 이야기 해보자.

  • 오류 분석을 위해서 추천하는 방법

    1. 우선은 쉽고 빠르게 구현할 수 있는 간단한 알고리즘으로 시작하자.
    2. 빠르게 구현한 알고리즘으로 Test CV (cross-validation) 를 한다.
    3. Learning curve를 그려서 분석한다.
      • 데이터를 늘리거나,
      • feature를 늘리거나,
      • 다른 방법이 도움이 될지 생각한다.
  • Error analysis:

    • 에러를 일으키는 데이터(in cross-validation set)를 하나하나 직접 분석한다.
    • 어떤 종류의 데이터가 일정한 경향의 에러를 발생시키는지 관찰한다.
  • Error Analysis 의 예시

    • 500개 cross-validation data 중 100개 email이 잘못 분류되었다면
    • 100가지 에러를 확인하여 다음과 같은 기준에 의해 분류한다.
      1. 어떤 종류의 이메일 인지? What type of email it is
      2. 어떤 요소가 올바르게 분류할 수 있는데 도움이 될 것인지? What cues (features) you think would helped the algorithm classify them correctly
  • 어떤 종류의 이메일이 스팸으로 분류되었는지 분석의 예

    • 수동 분석 결과
      • Pharma (불법약): 12개
      • Replica/fake (짝퉁): 4개
      • Steal passwords (피싱): 53개
      • Others 기타: 31개
    • Steal password '피싱’으로 분류된 메일에 대하여 효과적으로 분류할 방법을 찾는 것이 가장 효과적일 것이다.
  • 어떤 요소가 올바르게 분류할 수 있는데 도움이 될 것인지?

    • 수동 분석 결과
      • 의도적인 철자법 오류: 5건
      • unusual email routing: 16건
      • unusual punctuation: 32건
    • unusual punctuation (32건)을 잘 검출하는 방법을 찾는 것이 효과적일 것이다.

Error analysis 만으로는 효과적으로 성능 향상이 있을지는 판단하기 힘들다. 따라서 일단 시도해서 그 결과를 분석해가면서 좋은 방법을 찾는 것이 좋다.

  • numerical evaluation
    • 유사 단어는 어떻게 해야 할까?
      • 예시) discount/discounts/discounted/discounting
    • “stemming” software (예 “Porter stemmer”)를 사용하면 분류하는데 도움이 된다.
    • 하지만 소프트웨어는 완벽하지 않으며
    • universe와 university를 같은 단어로 취급하는 오류를 발생할 수도 있다.
    • numerical evaluation (예: cross-validation error)이 필요하다.

Handling Skewed Data

데이터를 분류하는 Logistic Regression을 좀더 생각해 보자. 우리는 Logistic Regression 에서 양성/악성 종양 분류를 했었다.

  • Cancer classification

    • Logistic regression model hθ(x) 를 이용
      • hθ(x) : y=1 악성 종양 (암)
      • hθ(x) : y=0 음성 종양
  • 이 가설을 기반으로 기계학습 성능을 테스트했더니

    • test set에서의 error가 1% 였다면 정확도는 99% 가 된다.
    • 이것은 정말 잘 작동하는 알고리즘인이다.
  • 만약 환자의 0.5%만이 실제로 암이라면?

    • 항상 y=0으로 결정하는 알고리즘을 기계학습을 시켰더라도.
    • 오류가 0.5% 이므로 0.5%의 오류를 달성하여 99% 정확한 시스템이 된다.
  • 즉 1% 에러율이 딱히 좋은 성능이 아닐 수도 있다.
  • 기계학습의 대상인 데이터가 한쪽으로 편중되어 있는 자료를 skewed data 라고 한다.
  • skewed data의 경우, 에러율만으로는 성능을 평가하는 것은 정말 어렵다.

Error Metrics for Skwed Classes

에러율이 아닌 방식으로 기계 학습 시스템을 평가하는 방법으로 precision 과 recall 이 있다.

Trading Off Precision and Recall

어떻게 하면 최적의 threshold를 결정할수 있을까?

  • Precision 과 recall을 가지고 기계 학습 시스템을 평가할 수 있도록 수식이 되었다.
  • 각각의 수식을 비용함수처럼 하나로 표현하는 것이 좀 더 판단하는데 도움이 될 것이다.

  • 두 숫자의 평균을 내어 보자.

  • 한쪽으로 치우진 skewed data는 이러한 평균으로 시스템을 평가하면 오류가 발생한다.

  • skewed data에서는 F-score가 일반적으로 사용한다.

  • P=0, R=0 이면 F-score는 0이 되고,

  • P=1, R=1이면 F-score가 1이 된다

  • F-score를 이용하면 Algorithm 1이 최적의 알고리즘으로 선택된다.

Using Large Data Sets

Data For Machine Learning

  • 여러 알고리즘을 평가하였다.
  • Perceptron (logistic regression)
  • Winnew
  • Memory-based
  • Naive Bayes

  • 여러 알고리즘이 모두
  • training data가 늘어날수록 성능이 향상된다.
  • 데이터가 적을 때 성능이 떨어 지는 알고리즘도
  • 데이터만 많으면 성능이 좋은 알고리즘으로 볼 수 있게 된다.

“It’s not who has the best algorithm that wins. It’s who has the most data”

  • 아무리 데이터 수가 많다 하여도
  • 입지, 방 갯수 등의 조건 없이 면적만으로 집값을 정확하게 예측하는 것은 어렵다.
  • 많은 요소 feature 를 같는 Logistic / Linear regression이나 신경망 Neural Network에서는 많은 hidden layer가 있게 된다.
  • 유용한 평가 방법은 사람(전문가)가 주어진 x에 대하여 y로의 가설함수가 믿을 수 있는지 검증하는 것이다.