페이지

2018년 3월 26일 월요일

CHAPTER 8 머신러닝의 다양한 문제점 해결하기

이 장에서는 머신러닝 시스템의 성능이 잘 나오지 않을 때 고려할 만한 사항을 살펴보겠습니다. 머신러닝으로 문제를 해결한다는 것은 데이터에 맞는 모델, 적립한 손실함수, 최적화 방법, 평가 방버을 찾는 과정입니다. 처음에서 성능이 잘 나오지 않더라도 너무 실망히지 마시고 개선 방안을 찾아내면 됩니다.

8.1 모델 문제
지금부터 8.2절 '데이터 문제'에서 다룰 데이터 처리, 8.3절 '속도 문제  '에서 다룰 속도 향상 외에 모델 자체에서 비롯된 문제를 해결해서 모텔의 성능을 향상하는 방법을 크게 둘로 나눠 설명합니다. 첫 번째는 학습할 때는 잘 동작했는데 실제로 사용하니 성능이 생각보다 잘 나오지 않는 과학습(오버피팅, 과적합, 과적응) 문제를 해결하는 방안을 알아보고, 두 번째는 데이터에 적합한 모델을 효과적으로 찾는 방법에 대해 알아보겠습니다.

8.1.1 과학습
머신러닝 시스템 시스템을 기존 데이터로 학습시킨 후 평가했을 때는 좋은 성능이 나와 학습이 잘되었다고 판단했는데, 새로운 데이터에서 예상대로 성능이 나오지 않는 경우의 원인은 대부분 과 학습 때문입니다. 과학습은 말 그대로 모델이 과하게 학습 데이터에 집중한 나머지 필요 이상으로 패턴을 학습한 경우입니다. 다음 그림과 같은 경우를 들 수 있습니다.

그림 8-1 과학습의 예. 거시적으로는 선형 패턴(점선으로 표시)을 가지는 데이터인데 필요 이상으로 복잡하게 학습한 경우(실선으로 표시)

[그림 8-1]은 과학습의 한 예입니다. 그래프에서 x로 표시된 점은 관착된 데이터입니다. 얼핏 봐도 데이터가 왼쪽 아래부터 오른쪽 위까지의 선형 패턴을 가집니다. 이 데이터를 기반으로 X값이 7일 때의 Y 값을 예측한다면 11 정도가 될 겁니다. 그런데 전체적인 패턴을 무시한 채 학습 데이터를 완벽하게 예측하는 것에만 중점을 두어 모든 점을 지나는  선을 모델로 만들게 되었습니다. 그 결과 실선과 같은 과학습된 모델을 가지게되고 X값이 7일 때의 Y값을 제대로 예측할 수 없게 된 겁니다.

그렇다면 이문제를 어떻게 해결해야 할까요? 그리고 이런 현상이 일어날지 어떻게 미리 알 수 있을까요? 2.1.5.2절 '정규화'와 2.4.1절 '모델의 일반화 특성 평가'에서 이론상으로 다룬 바 있습니다. 이제부터 과학습을 해결하는 실용적인 방법을 알아보겠습니다.

8.1.1.1 학습- 평가 데이터 나누기

과학습 문제를 발견하는 가장 효과적인 방법은 전체 데이터의 일부분만으로 모델을 학습시키고 나머지 데이터를 이용해 모델을 평가해서 얼마나 데이터의 일반적인 패턴을 잘 학습하는지 판단 하는 겁니다. 일반적인 패턴을 잘 파악하지 못하는 모델은 그렇지 않은 모델에 비해 학습용 데이터에서는 좋은 성능을 보이지만, 평가용 데이터에서는 성능이 잘 나오지 않는 현상을 보이게 됩니다. 자세한 내용은 2.4.1절 '모델의 일반화 특성 평가'를 참조하세요

8.1.1.2 정규화
모델의 정규화는 바로 이런 과학습 문제를 해결하기위해 등장했습니다. 정규화는 데이터를 설명할 수 있는 가장 간단한 가정만을 사용한다는 '오컴의 면도날 가정'을 이용하여 과학습을 막습니다. [그림 8-1]을 보면 데이터의 패턴을 설명하기에는 점선이 실선으로 표시된 복잡한 모델보다 더 간단합니다. 이렇게 데이터의 패턴을 복수의 가정으로 설명할 때는 데이터의 패턴에서 심하게 벗어나지 않으면 되도록 간단한 가정을 사용하는 것이 좋습니다.
2.1.5.2절 '정규화'에서 설명했듯이 '데이터의 패턴에서 너무 벗어나지 않는 것'과 '더 간단한 모델을 사용하는 것'의 균형은 정규화 파라미터로 결정합니다. 그렇다면 그 파라미터를 어떻게 결정해야 할 까요? 2.4.1절 '모델의 일반화 특성 평가'에서 설명한 것과 같이 정규화 파라미터를 결정하는 데이터셋을 따로 빼놓고 학습하는 방법을 많이 사용합니다.
정규화 파라미터가 실제로 어떻게 영향을 미치는지 간단한 예제를 통해 알아보겠습니다. 사이킷런의 linear_model.Ridge 클래스는 정규화 파라미터를 지원하는 선형 회귀 클래스입니다. 클래스의 원형은 다음과 같습니다.

class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_State=None)

여기서 정규화와 관련된 파라미터는 alpha인테, 값이 클수록 정규화의 강도가 더욱 강해집니다.
실제로 어떻게 문제가 발생하는지 시각적으로 보여드리기 위해 2차 함수를 따르는 데이터를 만든 후 10차 함수 형태의 모델을 사용하는 경우를 알아보겠습니다(현샐에서는 데이터가 몇 차원 함수를 따르는지 알 수 없으므로 임의로 높은 차원을 가정합니다). 여기서는 구현보다는 어떻게 되는지 설명에 집중하기 위해 자세한 코드는 생략하도록 하겠습니다.

데이터는 다음과 같은 가우스 분포도 생성되었습니다.
y = x*x -2x -1 + 노이즈

그리고 우리 모델은 10차 함수 형태까지 학습할 수 있는 능력을 가진 10차 다항함수를 사용했습니다. 수식으로 나타내면 학습과정에서 상수 부분까지 모두 11개의 파라미터(w10, w9,...w0)를 학습하게 됩니다.

모델이 표현할 수 있는 한계(10차 함수)가 실제 데이터(2차 함수)보다 훨씬 높죠? 이런 경우에 과학습이 심하게 발생할 수 있습니다. 과학습이 나타나는 현상을 실제로 ㄹㄴ덤한 데이터를 만들고 학습해서 시각화해보겠습니다. 먼저 정규화 없이 그냥 모델을 단순하게 학습시킨 결과를 살펴보겠습니다.

[그림 8-2]를 보면 단순히 오목하게 생긴 2차 함수의 패턴을 학습하면 되는데 모델이 필요 이상으로 복잡해서 굉장히 구불구불한 모양으로 학습된 것을 볼 수 있습니다. 똑같은 데이터에 정규화 파라미터 alpha값을 증가시켜 보겠습니다.

그림 8-3 정규화가 있을 때(alpha=0.1)의 변화
[그림 8-2]에 비해 곡선이 훨씬 부드러워졌습니다. 다시 말해, 모델이 표현 가능한 범위보다 좀더 간단한 모델을 사용하도록 강제된 것을 확인할 수 있습니다.

그림 8-4 정규화가 좀 더 강할 때(alpha =1)
[그림 8-4]는 [그림 8-3]보다 더욱 강하게 정규화 값을 설정한 경우입니다. 곡선이 좀 더 부르러워져서 더 간단한 모델이 되었습니다.

이렇게 정규화 파라미터를 조절하면서 필요 이상으로 복잡한 패턴을 학습하지 않도록 머신러닝 모델을 조절할 수 있습니다. 그렇다면 적절한 파라미터 값은 어떻게 찾을 수 있을까요?

그림 8-5 검증용 데이터를 나누어 정규화 파라미터 정하기

1. 데이터를 학습 및 검증용(A)과 테스트(B)으로 나눕니다.
2. A를 다시 학습용(C)와 검증용(V)로 나눕니다.
3. 학습용 데이터에 대해 정당한 정규화 파라미터로 학습을 수행한 후 검증용 데이터를 사용해 성능을 측정합니다. 반봅해서 V에서 가장 성능이 좋은 정규화 파라미터를 찾습니다.
4. 과정 3에서 찾은 정규화 파라미터를 이용해서 A에 대해 학습을 수행합니다.
5. 모델 자체에 대한 평가는 B로 하면 됩니다.

과정 2부터 4까지는 교차 검증을 이용해도 됩니다. 교차검증은 2.4.1.2절 '교차검증'을 참조하기 바랍니다.

8.1.1.3 학습을 일찍 끝내기
정규화와 비슷하지만 훨씬 더 간단한 방식이 있습니다. 이 방식은 딥러닝에서 주로 사용되지만, 그 외의 분야에서도 많이 쓰이고 있습니다. 우선 아래 그래프에서 과학습이 되는 시점에 주안점을 두어 살펴보고 이야기를 더 진행하겠습니다.

그림 8-6 머신러닝 모델을 학습할 때 일반적으로 보게 되는 학습 데이터와 테스트 데이터에서의 손실 곡선

[그림 8-6]은 머신러닝 모델을 학습할 때 보게 되는 일반적인 손실 그래프입니다. 위에 있는 고선이 테스트 데이터에서의 손실, 아래 있는 곡선이 학습 데이터에서의 손실입니다. 학습 데이터에서의 손실은 학습을 진행할수록 줄어드는데, 테스트 데이터에서의 손실은 학습데이터에 모델이 과하게 최적화된 이후 오히려 늘어나게 됩니다. 손실이 늘어나기 시작하는 지점이 바로 과학습의 시작점입니다. 이 지점 이전까지는 학습 효과가 좋았으므로 과학습이 나타나는 시점까지만 학습하면 과학습을 예방할 수 있게 됩니다. 물론 '어느 시점'에 그만둘지 결정하는 것은 쉬운 일이아닙니다. 하지만 정규화가 쉽게 되지 ㅏㅇㄶ는 모델에는 이 방식을 더 유욯하게 사용할 수 있습니다.
딥러닝으로 유명한 힌튼 교수는 '일찍 끝내기(early stopping)는 아름다운 공짜 점심'이라고 표현했습니다. 아주 쉽고 거의 공짜로 이득을 본다는 뜻이죠. 실제로 현업에서도 학습을 완전히 수행하기보다는 최대 몇 번까지 반복한다고(예를 들어 100번) 적당히 정해놓고 학습을 하는 식으로 많이 사용합니다.

8.1.1.4 드롭-아웃(딥러닝 기법)
딥러닝에는 뉴렐넷의 과학습을 예방하는 방법으로 드롭-아웃(drop-out)을 널리 사용합니ㅏㄷ. 본 개념을 먼저 살표고벴습니다.

드롭-아웃은 딥러닝 모델으 ㄹ학습할 때 레이어와 레이어를 잇는 연결 중에서 일정한 확률 p로 몇 가지 연결을 무작위로 끊은 채 학습합니다. 즉, 학습이 진행될 때(파라미터를 업데이트 할 때) 마다 연결이 조금씩 달라진 상태로 딥러닝 모델을 학습하게 됩니다.

1. 아래와 같은 딥러닝 모델이 있다고 합시다. 동그라미는 레이어고, 선은 그것을 잇는 가중치 연결입니다.

2. 학습중 일부 업데이트는 아래와 같이 확률 p에 따라 레이어 연결을 임의로 몇 개 누락시키고 업데이트합니다.

3. 또 다른 업데이트는 다른 패턴으로 임의로 몇 개 누락시키고 업데이트 합니다.

4. 학습이 모두 끝난 후 모델을 실제로 사용할 때는 모든 연결을 사용하지만 p 만큼 연결의 강도를 약화시켜서 사용합니다.

드롭-아웃을 이용한 딥러닝 모델 학습이나 학습된 모델을 사용하는 방법 자체는 앞에서 설명한 것처럼 상당히 간단합니다. 연결을 무작위로 끊으면서 학습하고, 학습된 모델을 사용할 때는 연결 강도를 조절하면 됩니다. 또한 텐서플로에서 라이브러리로 제공하므로 그냥 가져다 쓰면 됩니다. 하지만 왜 이렇게 하는 것이 정규화에 도움이 되는지 이해하기 쉽지 않을 겁니다. 그 이유를 순서에 입각하여 살펴보면 다음과 같습니다.

1. 학습 시 연결을 임의로 몇 개를 끊으면 모델이 더 '간단하게'됩니다.
2. 간단한 모델로 학습하면 원래 모델보다 조금 제한된 모델로 학습이 이루어지게 되고 결과적으로 필요 이상으로 모델이 데이터의 복잡한 패턴을 학습하는 것을 방지하는 효과를 발휘하게 됩니다.
3. 이 과정을 반복하면 간단한 모델들의 밈의 조합을 이용해서 데이터를 설명하려는 시도를하게됩니다.
4. 그 결과 모델은 피처와 레이어 사이의 연결 가능한 모든 레이어 간의 조합에 대해 학습을 수행하는 것이 아니라 적은 연결로 전체를 설명하는 방향으로 학습하게 됩니다.

이 과정은 앞에서 설명한 정규화와 비슷하게 모델을 단순화시키는 효과를 볼 수 있습니다. 드롭-아웃은 구현이 쉬우면서도 딥러닝 모델의 성능을 늘리는데 매유 효과적입니다. 만일 딥러닝기법을 사용한다면 도입을 꼭 고려해보기 바랍니다. 참고로 텐서플로에서는 이 기능을 깁본으로 지원합니다.

8.1.2 좋은 모델을 좀 더 수월하게 찾는 방법
머신러닝은 모델에 따라 성능이 크게 좌우됩니다. 딥러닝이 발전하고 데이터양이 증가하면서 모델 자체에 대한 고민은 예전보다 적어진 듯 보이지만, 그럼에도 더 좋은 성능을 얻으려면 더 데이터에 적합한 모델을 이용하여 학습해야 합니다. 따라서 모델의 중요성은 아무리 강조해도 지나치지 않습니다.

이절에서는 데이터에 적합한 모델을 효과적으로 찾는 방법에 대해 알아보겠습니다. 1장과 2장에서도 잠깐 어급했지만'머신러닝을 적용한다'는 것은 '데이터에 적합한 모델과 학습 방법을 차즌ㄴ 일련의 과정을 적용한다'는 뜻입니다. 특히 적합한 모델을 찾는 것은 핵심입니다.

그렇다면 어떻게 하면 적합한 모델을 쉽게 찾을 수 있을 까요? 다음과 같은 방법을 생각할 수 있습니다.

- 간단한 모델부터 적용하기
- 데이터와 모델 시각화 하기
- 모델의 최대 성능 가늠하기

8.1.2.1 간단한 모델부터 적용하기
가장 중요한 원칙은 처음부터 복잡한 모델을 곧바로 적용하는 것이 아니라 간단한 모델을 적용시켜서 성능을 확인해보는 것입니다. 어차피 복잡한 모델이 더 좋은 성능을 낼 확률이 높은데 왜 굳이 시간을 낭비하는지 의문이 들 수도 있을 겁니다. 간단한 모델 부터 테스트해보는 데는 다음과같은 이유가 있습니다.

간단한 모델은 구현이쉽고 학습도 쉽습니다.
대부분의 머신러닝 라이브러리는 선형 휘귀, 로지스틱 휘귀, 레이어가 1개인 뉴런넷 모델 등 간단한 모델을 제공하고 있어 손쉽게 시도할 수 있고 학습도 굉장히 빠릅니다. 또한 적은 학습과 정 튜닝으로 최대의 성능을 쉽게 확인할 수 있습니다. 복잡한 모델은 구현, 학습, 그리고 파라미터 튜닝에 오랜 시간이 걸립니다.

간단한 모델의 성능은 다른 모델이 얼마나 잘 동작하는지에 대한 지표가 됩니다.
간단한 모델을 실제 시스템에 사용하지 않더라도 그 성능을 더 복잡합 모델의 성능 지표로 삼을 수 있습니다. 복잡한 모델의 1차 구현물이 간단한 모델의 성능보다 월등히 좋지 않다면 뭔가 개선 방법을 찾아야 합니다. 반대로 간단한 모델보다 성능이 좋다면 모델이 잘 작동한다고 판단하고 튜닝에 돌입하면 됩니다.

간단한 모델은 원인을 파악하기가 상대적으로 쉽습니다.
모델의 성능이 떨어지는 원인은 다양합니다. 데이터 처리 버그, 모델의 학습방법, 아니면 그냥 문제 자체가 예측이 어려운 경우일 수도 있습니다. 이유가 뭐든 간단한 모델일 때보다 복잡한 모델에서 문제의원인을 찾기가 상대저그로 어렵다는 건 두말할 필요 없을 겁니다. 먼저 간단한 모델을 사용해서 전체가 잘 동작하는지 검증한 후 복잡한 모델을 적용하기 바랍니다.

8.1.2.2 데이터와 모델 시각화하기
데이터를 시각화해보는 것도 적합한 모델을 찾는데 도움이 됩니다. 하지만 추가 노력이 들기 때문에 생략하는 경우도 적지 않습니다. 전체 데이터를 완전히 시각화하지 않더라도 패턴을 살펴볼 수 있는 수준이면 도움이 됩니다. 그 이유는 다음과 같습니다.

데이터 이상 파악
예를 들어 일반적인 선형 회귀를 해보려고 생각하고 있었는데, 데이터를 시각화해보니 데이터가 선형적인 양상이 아니라 로그 스케일을 따른다든가, 소수점 단위를 예상하고 있었는데 음수가 나온다든가, 혹은 기본값이 특이하게 들어 있는 경우를 생각할 수 있습니다. 실숫값을 기대하고 있었는데 정숫값만 존재하거나 카테고리 ID가 들어오는 경우처럼 데이터 자체에 대한 가정에 문제가 잇는지 등도 파악하기 좋습니다.

데이터 특성 파악
데이터를 분석할 때 가장 기본적인 것은 데이터가 정규 분포를 따른다고 가정하느 것입니다. 대부분의 경우에는 큰 무리가 없지만, 가끔 데이터가 정규분포를 크게 벗어난느 경우가 있습니다. 예를 들어[그림8-7]과 같이 데이터가 한개 의 정규분포(가우스분포)를 따르지 않는 경우입니다. 이 경우에는 2개의 정규분포를 포함하는 머신러닝 기법이 적합합니다.

모델 동작 방식 이해
데이터를 시각화 하는 것과 함께 모델의동작 결과를 시각화하는 것도 많은 도움이 됩니다. 예를 들어 분류 모델의 경우에는 모델이 각 데이터 포인트를 어떻게 분류하는지, 희귀모델의 경우에는 모델이 출력하는 결괏값이 어떻게 분포된느지 시각화하면 모델이 어떤 방시긍로 동작하는지 이해하는 데 도움이 됩니다.

시각화는 이책의 여러붑ㄴ에서 쓰였는데, 8.2.3.2 절'데이터의 값이 치우쳐 있을 때'에서는 데이터를 시각화에서 데이터의 편중 정도를 파악하고, 8.1.1.2절 '정규화'에서는 모델을 시각화해서 실제로 정규화가 모델에 어떻게 영향을 미치는지 살펴 보았습니다.

아래 URL에 방문하면 사이킷런에서 사용할 수 있는 다양한 시각화 예제를 확인할 수 있습니다.

http://scikit-learn.org/stable/suto_examples/

|2차원 이상의 데이터 시각화하기|
2차원 이상의 데이터를 시각화하는 일은 쉽지 않습니다. 데이터들의 상관관계를 이용해서 2차원으로 관곌르 재정의해서 그리는 방법이 있는데, 데이터의 절대좌표를 직접 입력하는 것이 아니라 한 데이터의 위치가 다른 데이터와 얼마나 다른지 상대거리를 이용해서 시각화하게 됩니다. 그리고 데이터의 절대거리보다는 근처에 있는 점들과의 관계를 보존하는 방법으로 시각화합니다. 이런 경우에 t-SNE 같은 방법이 특히 많이 이용됩니다. 예를 들어 텐서플로 튜터리얼에서 t-SNE를 사용하여 단어 벡터들을 시각화한 예를 착을 수 있습니다. 더 자세한 사항은 해당 튜터리엉ㄹ을 참고하세요. 대표적으로 Isomap, L.I.E, MIDS와 같은 방법이 있습니다. 자체한 사항은 사이킷런 홈페이지를 참고하세요.

8.1.2.3 모델의 최대성능 가늠하기
구현한 모델이 99.99% 정확도를 보인다면 더할 나위 없겠죠, 반대로 성능이 너무 좋지 않나면 더 적극적으로 새로운 모델을 찾아봐야 할 겁니다. 그러면 과연 성능이 얼마나 좋은지 어떻게 판단 할 수 있을까요? 지금 얻은 성능의 수치는 낮지만 사실 엄청나게 잘하고 있는것 아닐까요? 단순히 성능 수치만으로는 애매한 부분이 있기 때문에 가능한  한 최고 성능르 가늠해보고 현재 어느 정도 수준인지 판단하는 것이 중요합니다.

물론 최고 선을을 가늠하는 것은 쉽지 않은 일입니다. 대에 따라 다르겠지만 다음과 같은 시나리오를 생각할 수 있습니다.

머신러닝 시스템과 사람의 성능 비교
사람의 직접 해당 일을 수행했을 때 얻을 수 있는 정확도 등의 예측 성능은 좋은 지표가 됩니다. 예를 들어 몇 명의 수동으로 이미지에 보이는 몰체를 태깅하거나 분류한 다음 평균 성능을 평가하여 머신러닝 시스템이 얼마나 잘 동작하는지 가늠해보는 겁니다. 예를 들어 아마존 메커니컬 피크는 수많은 사람에게 태깅을 부탁하고 소액을 지불하는 크라우드 소싱을 이용합니다. 만일 사람조차도 공통 의견을 만들기가 쉽지 않다면 머신러닝 시스템도 좋은 성능을 내기 쉽지 않을 겁니다.

이론상 성능의 한계나 보장된 값이 존재할 때
데이터에 따라 다소 제한적이긴 하지만 보장된 성능이 존재하는 경유가 있습니다. 예를 들어 제품의 불량률이 정해져 있고, 센서가 얻을 수 있는 불량에 대한 정보에 한계치가 있다면, 이 두요소에 의존하여 불량을 판볻하는 시스템의 성능에는 한계가 있겠죠. 이와 같은 정보를 미리 알면 현재 머신러닝 시스템이 얼마나 잘 동작하는지 알 수 있습니다.

8.2 데이터 분제
학습 데이터가 어떻게 구성되어 있는지에 따라 학습 성능이 크게 달라집니다. 이 장에서는 데이터가 너무 많거나 너무 적거나, 아니면(가장 일반적인) 치우침이 심할 때 어떻게 하면좋을지 살펴보겠습니다. 참고로 8.1.2.2절 '데이터와 모델 시각화하기'에서 언급한 데이터 시각화도 이런 데이터의 특성을 이해하는데 도움이 됩니다.

8.2.1 데이터가 너무 많을때
앞서 머신러닝에서 데이터가 많을 수록 좋다고 언급했습니다. 이론상으로는 데이터가 많을 수록 성능이 좋은 모델을 얻을 수 있지만, 데이터가 많으면 처리 시간이 오래 걸리기 때문에 문제가 될 수 있습니다. 특히 같거나 비슷한 데이터가 많이 들어오는 경우를 생각해 봅시다. 예를 들어 1분마다 물체의 움직임을 감지하여 데이터를 송신하는 센서를 이용하여 물체의 이동 곙로를 학습하는 모델을 만들려고 할 때 물체가 거의 정지해 있다면 대부붕의 데이터가 움직임 없음(0)으로 채워질 겁니다. 또 다른 경우는 특정 분류 항목의 데이터가 너무 많아서 전체 적으로 학습이 오래 걸리는데 그렇지 않은 항목은 적은 경우가 있습니다. 예를 들어 사진 데이터에서 하늘이나 구름 사진은 어첨 많은데 휘귀한 동뭀진은 적은 경우가 있습니다. 이를 해결하기 위해 다음과 같은 방법을 생각해 볼 수 있습니다.

과소표집
과소표집(언더샘플링)은 전체 데이터셋에서 데이터를 무작휘 확률로 선택해서 선택된 데이터로 이우러진 작아진 데이터셋을 사용하는 방식입니다. 데이터를 무작위로 선택하는 방법은 다양하지만, 가장 중요한점은 데이터의 특성과 상관없이 뽑아야 한다는 것입니다. 예를 들어 사용자 구매 이력 데이터에서 50%확률로 데이터를 뽑는것은 괜찮지만, 사용자 이름 가나다순으로 정렬된 데이터셋의 앞부분 절반만 사용하는 것은 데이터으 ㅣ특성을 바꿀 수 있기 때문에 안됩니다.

중요도 표집
중요도 표짐(중요도 샘플링)은 데이터의 중요도에 따라 선택 확률을 변도하여 샘플링하는 기법이다. 무작위 확률로 선택하다 보면 특정 경우에 해당하는 데이터가 거의 없어지는 문제가 발생할 수 있습니다. 예를 들어 이미지 분류 문제를 푼다고 가정합시다. 학습용 데이터에서 '하늘'에 해당하는 이미지는 엄청 많은데 '오리너구리'에 해당하는 이미지는 적다고 합시다. 이런 경우 이미지를 무작위로 선택하면 오리너구리 이미지는 정말로 적은 수만 남게 됩니다. 그러면 오리너구리에 대한 학습이 제대로 이루어지지 못하겠죠. 이런 경우에는 데이터의 중요도에 따라 선택확률을 변동시키는 방법이 더 적합합니다. 예를 들어 하늘에 해당하는 사진은 10%의 확률로 뽑고 오리너구리 사진은 너무 개수가 적으니 80%의 확률로 뽑는 방법을 고려 할 수 있습니다.

피처 선택
'피처 선택'은 중요한 피처만 선택해서 전체 학습률과 성능을 증가시키는 방법입니다. 피처가 많으면 학습에 사용하는 데이터가 많아 학습률이 느려지고,  모델이 복잡해져서 과학습을 할 우려가 있습니다. 피처를 고르는 방법으로 '카이제곱 피처 선택법', '상호-정보 피처 선택법', '검증셋에서의 성능'이 주로 사용됩니다. 어떤 방법을 사용하든 성능에 도움이 되는 피처는 고르고 그렇지 않은 피처는 삭제하는 방향으로 진행됩니다.

1. 카이제곱 피처 선택법(이하 카이제곱 선택법): 피처와 성능 간의 통계학적 독립성을 테스트하는 방법입니다. 성능과 연관이 많은 피처는 나두고 그렇지 않은 피처는 제거합니다.
2. 상호-정보 피처 선택법(이사 상호 정보 선택법):중요한 피처만 선택하는 것은 카이제곱 선택법과 같지만, 실제로 계산하는 방법과 의미는 약간 다릅니다. 카이제곱 선택법이 각 피처가 모델의 성능에 얼마나 통계적으로 유의미한 기여를 하느냐를 검토한다면, 상호-정보 선택법은 선택한 피처 한 쌍이 서로 예측하는 데 얼마나 도움이 되느냐를 검토합니다. 결과적으로 상호-정보 선택법은 카이제곱 선택법보다 좀 더 자주 나오는 피처를 선택합니다.

3. 검증셋에서의 성능: 학습용 데이터에서 검증용 데이터를 따로 분리하여 피처의 일부만을 사용해서 모델을 학습한 후 검증셋에서의 성능 평가를통해 어떤 피처가 좋을지 측정합니다.
앞의 방법을 통해 전체 피처 셋에서 피츠를 하나씩 제외하거나, 아니면 아무것도 없는 상태에서 가장 많이 도움 되는 피처를 하나씩 추가하는 식으로 사용할 피처를 결정합니다.

8.2.2 데이터가 너무 적을때
데이터가 적을 때 할 수 있는 일은 그렇게 많지 않습니다. 다음과 같은 방법을 통해 약간이나마 개선해볼 수는 있습니다.

8.2.2.1 레이블된 데이터는 별로 없지만 일반적인 데이터가 많은 경우(표현형 학습)
이런 경우에는 먼저 데이터의 일반적인 특성을 배우는 학습을 휴행하여 얻어진 정보를 이용해서 추가로 학습하ㅕㄴ 어느 정도 효과를 볼 수 있습니다.

예를 들어 제품 리뷰를 받는 사이트에서 제품에 대한 리뷰가 호의적이거나 적대적인지 판단하는 모델을 만든다고 가정해 봅시다. 이 모델을 학습시키면 각 리뷰에 대해 '호의적' 또는 '적대적' 레이블이 붙어 있어야 합니다. 사용자가 리뷰를 작성할 때는 호의적 또는 적대적이라고 명시하지 않으므로 이런 데이터셋을 만들려면 사람이 수작업으로 각 리뷰가 어떤 성격인지 일일이 체크해야 합니다(별점 데이터가 있다면 4점 이상이면 호의적, 2점 이하면 적대적이라고 레이블하기도 하지만, 이 경웅에도 문장 단위의 호의적 또는 적대적 레이블은 어렵습니다). 이런 수작업 레이블이 없는 이뷰는 손쉽게 많은 양을 얻을 수 있습니다. 그렇다면  이러한 리뷰를 통해 리뷰의 일반적인 패턴(예를 들면 어떤 단어가 많이 나오는지 파악해서 단어의 의미를 추론)을 먼저 추출해서 리뷰를 잘 표현할 수 있는 간명한 표현ㅅ형을 만든 다음, 실제 레이블을 가진 리뷰를 표현형으로 변환한 뒤 이를 이용해 분류를 합니다. 이렇게 데이터 자체에 대해 알고 있는 정보의 도움을 받아서 성능을 향상할 수도 있습니다.
이러한 과정을 딥러닝에서는 표현형학습 혹은 비지도 선행학습 등의 분야에서 다룹니다. 유명한 방식으로는 오토인코더나 토픽 모델링이 있습니다. 이 중 토픽 모델링은 5.2절 '토픽 모델링'에서 다뤘습니다.

8.2.2.2 전이학습
전이학습은 성격이 다른 데이터셋(예를 들면 이미지와 텍스트 데이터)을 이용해서 학습시킨 모델을 현재 데이터셋에 적용하는 방법입니다. 넓은 의미로는 다른 데이터셋에서 얻은 정보를 이용해서 현재 문제의 성능을 향상시키는 방법도 포함합니다. 앞서 다룬 방법에서는 데이터 성격이 모두 같았지만, 전이 학습에서는 데이터 성격이 다릅니다. 예를 들어 리뷰 데이터 분석을 하는 경우 백과사전이나 제품의 이미지 등을 이용해 모델을 학습시킨 후, 그 모델을 이용해 리뷰가 호의적인지 적대적인지 예측하는 겁니다.

이렇게 다른 성격의 데이터를 이용하여 학습시킨 모델을 활용하는 방법은 생각보다 쉽지 않습니다. 다행이 딥러닝에서는 중간 레잉어를 공유하는 방식으로 생각보다 쉽게 이런 정보를 이용할 수 있습니다. 더 자세한 내용은 이 책의 범위를 벗어나므로 이런 정보가 있다는 정도만 알아두기 바랍니다.






댓글 없음: