• [4. 머신러닝의 기본요소] 4-3, 4-4. 데이터 전처리 및 과대적합과 과소적합

    2021. 1. 12.

    by. 민영답게

    데이터 전처리, 특성공학, 특성학습 

     

     

    데이터 전처리

     

     

    1. 벡터화

     

    -  처리해야 할 데이터를 텐서로 변환하는 것

     

    -  신경망에서의 입력과 타깃은 부동 소수 데이터 or 정수로 이루어진 텐서여야 함

     

    -  ex)  앞의 실습에서 텍스트를 정수 리스트로 변환 한 후, one-hot-encoding 을 사용해 float32 타입의 데이터로 변환한것

     

     

    2. 정규화

     

    -  데이터가 비교적 큰 값이거나 균일하지 않을 때 사용하는 방법

       ex)  한 특성의 범위와 다른 특성의 범위가 다른 경우

     

    -  목표

     

        대부분 값이 0~1 이도록 작게 만들기,

     

        모든 특성이 비슷한 범위를 갖도록 균일하게 하기

     

    - 정규화 방법  :  각 특성별로 평균이 0, 표준편차가 1이 되도록 하기

     

    			x -= x.mean(axis=0)
    			x /= x.std(axis=0)

     

    3. 누락된 값 다루기

     

    -  훈련 데이터에 누락된 값이 있는 경우

     

        이 경우에는, 결론적으로 0이 사전에 정의된 의미있는 값이 아니라면 누락된 값을 0으로 입력하면 됨

        (네트워크가 누락된데이터가 0을 의미한다는 것도 학습하기 때문)

       

    -  훈련 데이터에 누락된 값이 없는 경우

     

        이 경우는  네트워크가 누락된 값을 학습하지 못하였기 때문에, 누락된 값이 있는 훈련 샘플을 고의적으로 만들어야 함

        (훈련 샘플 복사 -> test data에서 빠질것 같은 특성 제거)

     

     

     

    특성 공학

     

    -  데이터와 신경망에 관한 지식을 사용하는 단계

     

    -  학습이 아니라, 모델이 수월하게 작업할 수 있도록 데이터를 변환함 

     

    특성을 더 간단한 방식으로 표현하여 문제를 쉽게 만드는것이 목표

     

    -  ex) 시계의 시간을 읽을 때, CNN을 사용하는 것이 아니라

               바늘끝 좌표를 출력하는 파이썬 스크립트를 만들어 머신러닝 알고리즘이 좌표와 시각을 연결하도록 함

     

    딥러닝에서는 대부분 특성 공학이 필요하지 X  

       ( 딥러닝이 알아서 특성을 추출하기 때문 )

     

       그래도 적은 자원, 적은 데이터로 문제를 해결할 수 있으므로 딥러닝에서도 특성공학 사용하면 좋음

     

     

     

     

     

     

    과대적합과 과소적합

     

     

    알아두어야 할 개념

     

     

    1. 과대적합 (overfitting)

     

    -  overfitting 이 발생하면, 모델의 성능이 몇번의 epoch후에 최고치에 다다랐다가 감소됨

     

    훈련 데이터에 너무 익숙해져서 모델이 테스트 데이터에서는 제대로 성능을 보이지 못하는 것

     

     

    2. 과소적합 (underfitting)

     

    -  훈련 데이터의 loss가 낮아질수록 테스트 데이터의 loss도 낮아지는 것

     

    네트워크가 훈련 데이터에 있는 관련 특성을 모두 학습하지 못하여 발생

     

    But, 훈련데이터에 여러번 학습하면 어는순간부터 검증세트의 성능이 멈추고 감소

     

       =  과대적합 발생

     

     

    3. 최적화와 일반화

     

    최적화 : 훈련데이터에서 최고의 성능을 얻으려고 모델을 조정하는 과정

     

    일반화 : 이전에 본적없는 데이터에서 얼마나 잘 수행되는지

     

    -  즉, 머신러닝은 최적화와 일반화 사이의 줄다리기!

        좋은 일반화 성능을 얻는것이 목표이지만, 단지 훈련 데이터로 모델을 학습시키므로 일반화 성능을 제어할 방법이 X

     

     

    4. 이 모두를 고려하는 가장 좋은 방법

     

    가장 좋은 방법은 훈련 데이터를 많이 모으는것

     

    그런데, 불가능 한 경우 '규제'를 통해 과대적합을 피하고 더 나은 일반화 성능을 제공하게 하면 됨

     

    *  규제 : 모델이 수용할 수 있는 정보의 양 조절 or 저장할 수 있는 정보에 제약을 가하는 것

                   네트워크가 적은 수의 패턴만 기억하게 하여 가장 중요한 패턴에만 최적화되게 함

     

     

     

     

    규제 기법

     

     

    1. 네트워크 크기 축소

     

    -  모델에 있는 학습 파라미터의 수를 줄이는 법 = 모델의 용량을 줄이는 것

     

    -  그렇다고 너무 과소적합되지 않도록 충분한 파라미터를 가지게 해야 함

     

        즉, 너무 많은 용량과 충분하지 않은 용량 사이의 절충점을 찾아야 함

     

        절충점을 찾는 방법은 비교적 적은 수의 층과 파라미터로 시작하여

        검증 손실이 감소되기 시작할때까지 층이나 유닛의 수를 늘리면 됨

     

     

        * 실습

     

    네트워크

     

    네트워크의 크기를 축소한 모델이 검증 손실이 더 천천히 증가하는 것을 볼 수 있었음

     

    = 기존보다 더 늦게 과대적합 시작

     

     

     

     

     

     

     

     

     

     

     

    3. 가중치 규제 추가

     

    -  가중치 규제 : 네트워크의 복잡도에 제한을 두어 가중치가 작은 값을 가지도록 강제하는 것

                                ->  가중치 값의 분포가 더 균일하게 됨

     

    가중치 규제의 종류

     

        ˙  L1 규제  :  가중치의 절댓값에 비례하는 비용이 추가 됨

     

        ˙  L2 규제  :  가중치의 제곱에 비례하는 비용이 추가됨          ( = 가중치 감쇠 )

     

    사용 방법 ( in 케라스 )

     

       

              from keras import regularizers

              regularizers.l1(0.001)

              regularizers.l1_l2(l1=0.001, l2=0.001)

     

     

     

    4. 드롭아웃 추가

     

    드롭아웃이란?

     

        무작위로 층의 일부 출력 특성을 제외시키는 것

        가장 효과적인 방법으로, 드롭아웃 비율은 0이 될 특성의 비율을 의미함. 보통 0.2 ~ 0.5로 설정

        

        테스트 단계에서는 어떤 유닛도 드롭아웃 되지 X.  단, 층의 출력을 드롭아웃 비율에 비례하여 줄여줌

     

    드롭아웃이 과대적합을 줄일 수 있는 이유

     

        각 샘플에 대해 뉴런의 일부를 무작위하게 제거하여 뉴런끼리의 부정협업을 방지 -> 과대적합 감소

     

        즉, 노이즈를 추가하여 중요하지않은 패턴을 학습하지 않도록 하는것

     

    사용방법 ( in 케라스 )

     

        층의 출력 바로 뒤에 Dropout층 추가하면 됨!

     

        ex)

     

              model = models.Sequential()

              model.add(layers.Dense(16, activation='relu', input_shape(10000,)))

              model.add(layers.Dropout(0.5))

              model.add(layers.Dense(1, activation='sigmoid'))

     

     

     

    정리

     

     

    신경망에서 과대적합을 방지하기 위해서 할 수 있는 방법

     

    1.  훈련 데이터 더 모으기

     

    2.  네트워크의 용량 감소시키기

     

    3.  가중치 규제 추가하기

     

    4.  드롭아웃 추가하기

     

     

     

     

     

    <케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.

    댓글