ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Week 6] Machine Learning System Design
    Courses/Andrew Ng - Machine Learning 2022. 1. 18. 20:23

    Building a Spam Classifier

     스팸 메일을 분류하는 모델을 만든다고 가정합시다. 어떤 방법으로 접근하면 효율적일까요? 스팸 메일들을 수집하고 그 데이터를 바탕으로 스팸이면 y=1 , 스팸이 아니면 y=0 인 식으로 분류할 수 있을 것 같습니다. 스팸에서 사용되는 단어들을 변수 x로 둘 수 있을 것 같습니다. 예를 들어 deal 이라는 단어가 있으면 스팸일 수 있습니다. 거기에 coin이나 free같은 단어들이 같이 있다면 더 확률이 높아질 것 입니다. 이렇게 추정 가능한 단어 수백 개를 변수로 지정합니다. 반면 제 이름이 쓰여있다면 상대적으로 스팸일 가능성은 낮아지겠지요.

     100차원의 변수 벡터를 만들었습니다. 스팸 분류 기준으로 선택한 단어들이 순차적으로 부여되어 있고 1이면 스팸일 가능성이 있는 단어, 0이면 스팸일 가능성이 낮은 단어입니다.

     저번에 배웠듯이 많은 데이터셋이 반드시 높은 정확도를 보장해주지 않습니다. 스팸의 경우는 이메일 라우팅 정보를 기반으로 더 정교한 변수 셋을 만드는 것이 좋습니다. 이메일 헤더는 많은 정보를 담고 있기 때문입니다.

     discount와 discounted는 구분해야 할까요? 소문자와 대문자는 구분해야 할까요? w4tches같이 고의로 틀린 스펠링은 어떻게 처리해야 할까요?

    Error Analysis

     처음부터 모든 것을 고려한 복잡한 시스템을 만들 필요는 없습니다. 빠르게 구현할 수 있는 간단한 알고리즘을 먼저 구축하고 교차 검증 셋에서 테스트합니다. 그리고 학습 곡선을 그립니다. 편향인지 / 분산인지 확인하거나 다른 문제가 있는 지를 확인해봅니다.

     또, 교차 검증 셋을 직접 확인해보고 잘못 분류된 스팸을 직접 확인해봅니다. 알고리즘이 잘못 분류하는 패턴을 확인하고 변수 셋을 수정할 수 있습니다.

     예를 들어 봅시다. 500개의 교차 검증 셋에서 100개의 메일이 잘못 분류되었습니다. 이 잘못 분류된 메일들을 직접 조사해보고 분류합니다. 크게 4가지 유형으로 약 판매에 관한 메일이 12개, 가짜 제품 판매가 4개 , 비밀 번호를 훔치려는 피싱이 53건, 기타가 31건입니다. 알고리즘에 피싱에 가장 취약하므로 피싱을 분석해 봅니다. 고의 스펠링 변경은 5건, 16건의 비정상 이메일 라우팅, 32건의 비정상 마침표입니다. 비정상 마침표가 가장 많은 건수를 차지하므로 우선적으로 이 문제를 해결하는데 집중합니다.

     두번째 방법은 숫자로 비교해보는 것입니다. 예를 들어 대소문자 구분 여부가 어떤 영향을 끼치는지 알고 싶다면 예측하기 보다는 실제로 빠르게 구현을 하여 수치로 나온 결과를 비교해보는 것이 더 좋습니다.

     

    Error Metrics for Skewed Classes

     이번엔 한쪽으로 치우친 클래스에 대해 설명합니다.

     암 분류 문제에 대해 로지스틱 회귀를 학습시킨 결과가 1%의 오류라고 합시다. 그렇다면 99% 정확한 진단을 내린다는 것 입니다. 하지만 실제로는 0.5%의 환자만이 암에 걸렸습니다. 선별된 환자 중 절반은 정상이고 절반은 암 환자입니다. 그렇다면 1% 오류는 설득력이 없습니다. 변수의 값과 상관없이 무조건 y=0으로 예측하는 단순한 코드가 있다고 칩시다. 이 경우의 오류는 0.5%로 우리의 로지스틱 회귀보다 오류율이 낮습니다. 한쪽으로 치우친 클래스는 positive와 negative가 한쪽으로 매우 편향된 예제입니다. 단지 모든 변수에 대해 y=1 or y=0으로 예측해도 좋은 결과를 얻습니다. 이런 경우 정확도만 따지는 것은 위험합니다. 

     이런 경우 다른 평가 지표가 필요합니다. 정확도(Precision) 과 재현율(Recall) 입니다. 실제 클래스와 예측 클래스가 같을 때는 True를 붙이고 , 예측 클래스가 1이면 Positive, 예측 클래스가 0이면 negative로 분류합니다. 예를 들어 암이라고 예측했는데 실제로 암이 있었다면 True positive입니다.

     정확도는 (예측한 암 환자 중 실제로 암인 수) / (예측한 암 환자 수) 입니다. 내가 예측한 범위 내에서 얼마나 정확한지를 알려줍니다. 100명의 환자 중 10명이 암이라고 예측했는데 실제로는 8명만 암이었다면 정확도는 80%입니다.

     재현율은 (예측한 암 환자 수) /(실제 암환자 수) 입니다. 두 지표는 높을 수록 좋습니다. 항상 y=0이라고 예측하는 코드에서 오류율은 낮아도 재현율은 0입니다. 왜냐햐면 True positive 값이 0이기 때문입니다.

     

    Trading Off Precision and Recall

     정확도와 재현율은 트레이드 오프 관계입니다. 정확도가 높으면 재현율이 낮아지고 , 재현율이 높으면 정확도가 낮아집니다. 

     그 관계를 표현한 것 입니다. 로지스틱 회귀에서 값이 0.5 이상이면 1이라고 예측하고 0.5 이하면 0이라고 예측합니다. 그때 재현율-정확도 관계는 그래프의 파란선입니다. 이 0.5를 임계값이라고 하고 값을 바꾸면 그래프의 모양도 변화합니다. 임계값이 높을 수록 정확도는 높아지지만 재현율은 낮아집니다.

     그렇다면 어떻게 재현율과 정확도 사이에서 타협을 봐야할까요? 평균을 낼 수 도 있겠지만 그렇다면 3번 알고리즘이 선택됩니다. 하지만 3번 알고리즘의 정확도는 너무 낮습니다.

     우리는 F score라는 공식을 활용하여 알고리즘을 평가할 수 있습니다. 이 공식을 적용하면 1번 알고리즘을 선택하게 되고 정확도와 재현율을 모두 타협한 수치로 평가하게 됩니다.

     

    Data For Machine Learning

     이번에는 많은 데이터 셋이 알고리즘 향상에 도움이 되는 경우에 대해 알아보겠습니다.

     문장 사이 빈칸에 적절한 단어를 넣는 문제에 4가지 알고리즘을 적용하여 정확도를 측정하였습니다. 4가지 알고리즘 모두 데이터 셋이 많을 수록 정확도가 향상되는 경향을 보였습니다. 그렇다면 언제 많은 데이터셋이 효과적일까요?

    1.  문제에서 변수 x가 y에 대해 충분한 정보를 갖고 있을 때
    2.  알고리즘이 높은 분산일 때

    1번의 경우 이렇게 판단합시다 : 사람이 이 정보를 보고 결과를 예측할 수 있는가? 단어 끼워넣기 같은 경우 예시로 나온단어들을 보면 사람은 충분히 판단할 수 있습니다. 반대로 집값을 예측하는 변수가 오직 방의 개수라면 그 누구도 집값을 예측할 수 없겠죠. 즉 변수는 유효한 정보를 담고 있어야 합니다.

     

    2번의 경우 : 수많은 변수를 갖고 있다면 낮은 편향성을 띄고 있고 변수가 많아도 학습 셋이 훨씬 더 크다면 과적합이 발생하지 않습니다. 따라서 많은 변수와 방대한 학습 셋으로 고성능의 알고리즘을 만들 수 있습니다.


    혼자서 강의를 듣고 정리한 것이니 틀린 점이 있다면 언제든지 지적 부탁드립니다 :)

    'Courses > Andrew Ng - Machine Learning' 카테고리의 다른 글

    [Week 7] Kernels  (0) 2022.01.23
    [Week 7] Support Vector Machine  (0) 2022.01.23
    [Week 6] Bias vs. Variance  (0) 2022.01.16
    [Week 6] Evaluating a Learning Algorithm  (0) 2022.01.14
    [Week 5] Backpropagation in Practice  (0) 2022.01.10

    댓글

Designed by Tistory.