이번 포스트를 통해서 우리는 수집된 데이터를 어떻게 정제하여 머신러닝에게 학습시킬 지, 특성을 추출하는 방법에 대해서 이야기해 보겠습니다.


원시 데이터를 특성에 맵핑(Mapping Raw Data to Features)


위의 그림에서 왼쪽 부분은 수집된 데이터의 원본인 원시 데이터(Raw Data)입니다. 오른쪽은 실수 벡터로 표현된 특성 벡터(Feature Vector)입니다. 이렇게 원시 데이터로 부터 머신러닝에 적합한 데이터(모델을 학습 시킬 예)로 정제하는 것을 특성 추출(Feature Engineering)이라고 합니다.


보통 머신러닝 프로그래머는 특성을 추출하는데 전체 시간의 75% 정도를 할애합니다.


숫자 값 맵핑(Mapping numeric values)

머신러닝의 모델을 학습 시킬 때 부동 소수점 값을 이용하므로 원시 데이터가 정수 및 부동 소수점인 경우 따로 인코딩을 할 필요는 없습니다.

위의 그림과 같이 이미 실수인 num_rooms의 값을 오른쪽과 같이 6.0의 부동 소수점의 값으로 변환할 필요는 없습니다.


문자열 값 맵핑

머신러닝에서는 문자열 값은 학습할 수 없는 데이터입니다. 그래서 우리는 특성 추출(Feature Engineering)을 통해 필요한 문자열의 값을 숫자로 변환할 필요가 있습니다.



위와 같이 우리가 학습하고 싶은 문자열만 1로 설정하고 다른 문자열을 0으로 하는 원-핫 인코딩 방식으로 치환합니다.


원-핫 인코딩(One-Hot Encoding)이란?

일반적으로 문자열을 표현할 때 사용하는 방식으로, 하나의 요소만 1로 설정하고, 다른 요소들은 모두 0인 벡터를 말합니다.


범주형 값 매핑(Mapping categorical values)

범주형이란 배열로 표현되는 특성을 말하며, 인덱스와 같은 숫자로 치환하여 맵핑 합니다. 아래와 같은 나라 이름이 주어졌다고 하겠습니다.

주어진 나라를 나타내는 숫자로 치환하여 사용할 수 있을 겁니다. 아래 처럼 말이죠.

  • Netherlands => 0
  • Belgium => 1
  • Luxembourg => 2

하지만, 머신러닝 모델에서는 일반적으로 각 특성을 별도의 Boolean 값으로 표현 합니다. 예를 들면, 위의 나라 이름이 아래 처럼 표현됩니다.

  • x1: Is Netherlands? (True or False)
  • x2: Is Belgium? (True or False)
  • x3: Is Luxembourg? (True or False)


HTTP란?

 HTTP란, Hypertext Transfer Protocol의 약자로 인터넷에서 웹 서버와 웹 사용자(인터넷 브라우저) 사이에 문서를 전송하기 위해 사용되는 통신 규약을 말합니다.


HTTP의 특징

  1. TCP/IP(Transmission Control Protocol/Internet Protocol) 응용 프로토콜
    TCP/IP란, 네트워크와 네트워크를 연결하기 위한 프로토콜로서 서로 다른 운영체제의 컴퓨터 간에도 같은 TCP/IP 프로토콜을 사용함으로써, 네트워크 통신이 가능하게 합니다.

  2. 연결 상태를 유지하지 않음
    실시간으로 항상 연결을 유지하는 것이 아닌, 웹 클라이언트의 요청이 들어왔을 때만 네트워크를 연결하여 응답을 보내는 프로토콜 입니다.

  3. 요청(Request) / 응답(Response) 방식의 통신
    서버가 먼저 웹 클라이언트에게 데이터를 보내는 것이 아닌, 웹 클라이언트가 요청(Request)을 해야만 서버에서 응답(Response)하는 방식의 통신을 합니다.


HTTP Method

HTTP 통신에 사용되는 메소드로는 HEAD, GET, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT이 있습니다. 이번 포스트에서는 주로 사용하는 GET, POST, PUT, DELETE만 다루도록 하겠습니다.


 Method

설명 

 GET

  서버에 요청할 데이터를 URL(URI)에 담아서 보내는 형식

 POST

  서버에 요청할 데이터를 HTTP의 Body에 담아 보내는 형식 

 PUT

  DB에 있는 기존의 데이터를 수정(업데이트)하기 위해 사용하는 메소드(POST와 같이 Body에 데이터를 담아 보냄)

DELETE

  DB에 있는 기존의 데이터를 삭제하기 위해  사용하는 메소드(POST와 같이 Body에 데이터를 담아 보냄)



HTTP 응답코드

가끔 웹으로 어딘가를 접속하려고 할 때 "404 Not Found" 페이지가 뜨는 것을 볼 수 있습니다. 여기서 404는 HTTP 응답 코드의 하나로서 요청한 페이지가 없을 경우 표시되는 코드입니다. 자주 사용하는 HTTP코드에 대해서 다뤄보도록 하겠습니다.


 응답코드

설명 

 200

  클라이언트의 요청에 서버가 성공적으로 응답함

 201

  PUT 메소드에 의해 서버에 성공적으로 데이터가 업데이트 됨

 401

  인증이 필요한 페이지를 요청함

403

  관리자에 의해 페이지 접근이 금지됨

 404

  요청한 페이지를 찾을 수가 없음

 404

  요청한 동작에 대해 서버가 수행 할 수 없는 경우


앞에서 우리는 주어진 데이터 세트에만 과적합한 모델을 만드는 것을 방지하기 위해서 두 개의 하위 세트(학습 세트, 테스트 세트)로 나누어 일반화 시킨 모델을 만들었습니다.


하지만 여전히 이 방법에도 문제점이 하나 있습니다. 바로 학습 세트로 학습 시키고 테스트 세트로 테스트를 진행해 초매개변수를 조정하여 얻어낸 모델이 이번에는 테스트 세트에 과적합한 모델이 될 수 있다는 것입니다.


세 개의 세트로 분할: 학습 세트(Training Set), 검증 세트(Validation Set), 테스트 세트(Test Set)

이렇게 데이터 세트를 두 개로 나누는 것 보다 더 좋은 방법이 있습니다. 주어진 데이터를 세 개의 세트로 나누는 것입니다. 데이터 세트를 학습 세트(Training Set), 검증 세트(Validation Set), 테스트 세트(Test Set)로 나누어 테스트 세트에 과적합한 모델이 될 가능성을 크게 낮출 수 있습니다.


학습 세트를 통해 학습된 모델을 바로 테스트 세트로 결과를 얻는 것이 아닌, 검증 세트를 사용하여 학습 세트의 결과를 평가합니다. 검증 세트의 결과에 따라 모델을 조정하여 가장 우수한 결과를 보이는 모델을 선택한 후, 이 모델을 테스트 세트를 사용하여 다시 평가하는 것입니다.


검증 세트를 활용한 우수한 모델 선택 과정

  1. 학습 세트로 모델을 학습
  2. 학습된 모델을 검증 세트 모델로 평가
  3. 검증 세트 결과에 따라 모델을 조정하고 다시 학습
  4. 검증 세트에서 가장 우수한 결과를 보이는 모델을 선택
  5. 그 모델을 테스트 세트로 모델을 평가

Tip

테스트 세트와 검증세트는 반복적으로 사용함에 따라 마모됩니다. 즉, 초매개변수 설정 또는 기타 모델 개선을 결정할 때와 같이 데이터를 더 많이 사용할수록 이러한 결과가 아직 주어지지 않은 새로운 데이터까지 일반화될 가능성이 낮아지게 되는 것 입니다.
(일반적으로 검증 세트보다 테스트 세트의 마모 속도가 더 빠름)

가능하면 데이터를 더 수집하여 테스트 세트와 검증 세트를 갱신하는 것이 좋습니다. 각 세트를 초기화하고 데이터 세트로 부터 처음부터 다시 설정하는 것도 좋은 재설정 방법입니다.


앞의 포스트를 통해 우리는 일반화를 하기 위해서는 주어진 데이터 세트를 두 개의 하위 세트(학습 세트와 테스트 세트)로 나눠야 한다고 했습니다.


학습 세트와 데이터 세트의 개념

  • 학습 세트(Training Set): 모델을 학습시키기 위한 데이터 세트의 일부분
  • 테스트 세트(Test Set): 모델을 테스트하기 위한 데이터 세트의 일부분

그렇다면 주어진 데이터 세트를 학습 세트와 테스트 세트로 나눌 때 몇 대 몇의 비율로 나누는 것이 좋을까요?


데이터 분할


보통 학습 세트와 테스트 세트로 나눌 때 보통 8:2의 비율이 되게 데이터 세트를 분할 합니다. 이는 데이터 분석자의 편의에 따라 임의로 조절이 가능합니다. 테스트 세트는 반드시 다음의 두 가지 조건을 만족해야 합니다.


테스트 세트의 조건

  • 통계적으로 유의미한 결과를 도출할 만큼 테스트 데이터가 커야 한다.
  • 데이터 세트를 전체적으로 나타내야 한다.
    => 테스트 세트가 한 쪽에 치우치치 않고 학습 세트와 같은 특징을 가지도록 선별해야 한다.

유의 사항: 테스트 데이터로 학습하지 말 것!

모델을 학습 시킬 때 주의해야 할 것이 있습니다. 바로 테스트 데이터로 모델을 학습시키지 않는다는 것입니다. 모델 학습은 학습 세트로만 진행하며 테스트 데이터는 일반화가 잘 되었는지 확인하는 척도로만 사용되어야만 합니다.


만약 모델의 예측 결과가 이상할 정도로 좋은 결과가 나온다면 실수로 테스트 세트로 학습을 시킨 것은 아닌지, 학습 세트에 테스트 세트가 들어간 것은 아닌지 확인을 해보아야 합니다.


학습 세트와 테스트 세트를 통해 일반화된 좋은 모델을 선택하는 과정


여기서 모델을 조정한다는 것은 초매개변수인 학습률(Learning Rate) 조절, 특성(Feature)의 추가 삭제, 완전히 새로운 모델 설계와 같이 모델에서 가능한 모든 요소를 조정하는 것을 의미합니다.

과적합(Overfit)과 일반화(Generalization)

아래의 같이 감기에 걸리 사람과 건강한 사람의 분포 데이터가 주어졌다고 가정하겠습니다. 이 데이터를 우리는 어떻게 분류할 수 있을까요?


과적합(Overfit)

아래와 같이 감기걸린 사람과 건강한 사람을 정확하게 나누는 경계를 그을 수 있을 것입니다.

정확하게 경게를 나눈다면 모델이 학습하는 동안에는 손실이 적지만, 새로운 데이터가 들어왔을 때 잘 예측을 하지 못하는 문제가 발생합니다. 이렇게 주어진 샘플을 필요이상으로 복잡하게 분류한 상태을 과적합하다라고 말합니다.


과적합한 모델: 현재 샘플에 필요 이상으로 정확한(복잡한) 모델


과적합은 모델이 새 데이터에 맞게 잘 일

아래의 그림은 과적합 모델에 새로운 데이터가 들어왔을 때 예측이 어긋나는 경우가 발생하는 것을 보여줍니다.



일반화(Generalization)

그렇다면 감기환자와 건강한 사람을 아래와 같이 나누면 어떨까요?

이렇게 단순하게 모델을 만든다면 모델을 학습시키는데 손실이 조금 발생하지만, 새로운 데이터에 대한 예측은 위에서 다룬 과적합한 모델보다는 더 뛰어날 것입니다.


이렇게 학습에 사용되는 데이터에는 조금 손실이 발생하더라도 새로운 데이터에 대해 올바른 예측을 수행하는 능력을 일반화라고 합니다.

일반화: 모델을 단순화시켜 새로운 데이터에 대한 에측성을 높이는 방법


머신러닝의 목표는 이전에 보지 못한 새 데이터를 잘 예측하는 것입니다. 즉, 학습에 사용되는 데이터에서 조금 손실을 보더라도 일반화를 통해 모델을 단순화시켜 새로운 데이터에 대한 예측 정확도를 높인다면 더 좋은 모델입니다.


어떻게 일반화(단순화) 시킬 것인가?

우리에게는 이미 발생한, 즉 주어진 데이터 밖에 갖고 있지 않습니다. 일반화를 하려면 학습 데이터 뿐만 아니라 새로운 데이터가 필요로 합니다. 그렇다고 새로운 데이터가 발생할 때마다 학습시켜 모델을 일반화 하는 것에는 한계가 있습니다.

그래서 우리는 주어진 데이터는 두 세트로 나누어 모델을 학습시키고 마치 새로운 데이터가 주어진 것처럼 테스트를 하여 일반화를 진행 할 수 있습니다.
  • 학습 세트(Training Set): 모델을 학습시키기 위한 데이터 세트
  • 테스트 세트(Test Set): 모델을 테스트하기 위한 데이터 세트

좋은 일반화를 하려면 테스트 세트가 다음의 조건을 만족해야 합니다.
  • 테스트 세트의 데이터가 충분히 많아야 한다.
  • 같은 테스트 세트를 반복해서 사용하지 않는다.

일반화를 하기 위한 전제 조건

모델을 일반화 하기 위해서는 다음의 세 가지 전제 조건을 총족해야 합니다.

  • 데이터를 독립적이고 동일하게(Independently and Identically => i.i.d) 추출해야 한다.
    즉, 각 예(Example)가 서로 영향을 미치지 않아야 한다.
  • 데이터가 변하지 않아야(Stationary) 합니다.
  • 같은 집단(Same Distribution)에서 데이터의 예를 추출해야 합니다.


확률적 경사하강법(Stochastic Gradient Descent)

만약 우리가 모든 데이터 세트를 가지고 모델을 학습 시킨다면 예측의 정확성은 높일 수 있으나, 매우 오랜 시간이 걸릴 것 입니다. 확률적 경사하강법은 랜덤으로 단 한 개의 데이터를 추출하여(배치 크기가 1) 기울기를 얻어 냅니다. 이러한 과정을 반복해서 학습하여 최적점을 찾아내는 것이 확률적 경사하강법입니다.


Cf. 확률적(Stochastic): 기울기를 구하는데 필요한 한 개의 데이터가 무작위로 선택 됨


경사하강법과 확률적 경사하강법의 비교

 

경사하강법 

확률적 경사하강법 

1회의 학습에 사용되는 데이터 

  모든 데이터 사용

  랜덤으로 추출된 1개의 데이터 사용(중복 선택 가능)

 반복에 따른 정확도

  학습이 반복 될 수록 최적해에 근접 

  학습이 반복 될 수록 최적해에 근접 

노이즈

  거의 없음 

  비교적 노이즈가 심함 

해를 찾는 과정의 이미지 비교

 

 



=> 한 번 학습할 때 마다 모든 데이터를 계산하여 최적의 한 스텝을 나아가는 경사하강법과 달리, 확률적 경사하강법은 랜덤하게 추출한 하나의 데이터만 계산하여 빠르게 다음 스텝으로 넘거 갑니다. 그 결과 더 빠르게 최적점을 찾을 수 있게 되었지만 그 정확도는 낮아집니다.


배치(Batch)란?

확률적 경사하강법을 설명할 때 배치(Batch)의 크기가 1이다라는 말을 하였습니다. 배치란, 단일 반복에서 기울기를 계산하는 데 사용하는 예의 총 개수를 의미합니다. 


예를 들어, 배치의 크기가 1인 경우에는 기울기를 구하는데 사용되는 데이터가 1개이고 배치의 크기가 10인 경우는 기울기를 구하는데 사용되는 데이터가 10개라는 것입니다.


미니 배치 확률적 경사하강법(Mini-batch SGD: 확률적 경사하강법의 한계를 보완하다

확률적 경사하강법은 단일 반복에서 기울기를 구할 때 사용되는 데이터가 1개여서 노이즈가 너무 심하다는 한계가 있습니다.

이를 보완하는 것이 바로 미니 배치 확률적 경사하강법(Mini-batch SGD)입니다. 미니 배치 확률적 경사하강법은 전체 배치 반복과 SGD 간의 절출안으로써 배치의 크기가 10 ~ 1000 사이로 설정합니다.
미니 배치 확률적 경사하강법은 SGD의 노이즈를 줄이면서도 전체 배치보다는 더 빠르게 최적점을 구할 수 있습니다.



학습률(Learning Rate)

앞의 경사하강법에서 시작점에서 다음점으로 이동할 때 보폭(학습률) 만큼 이동한 점을 다음점으로 정한다고 하였습니다. 학습률인란, 현재점에서 다음점으로 얼만큼 이동할지, 다르게 말하면 모델이 얼마나 세세하게 학습을 할지를 말합니다.


학습률이 작다면 손실이 최적인 가중치를 찾는데 오랜 시간이 걸릴 것이며, 학습률이 너무 크다면 최적점을 무질서하게 이탈할 수도 있습니다.

초매개변수(Hyperparameter)

학습률과 같이 우리가 직접 조정하는 값을 초매개변수라 합니다. 우리는 직접 학습률을 여러 개 대입하여 가장 효율적이게 학습을 하는 학습률을 찾아야 합니다.

경사하강법(Gradient Descent)

앞의 포스트에서 매개변수를 업데이트를 하는 과정에서 손실을 줄이기 위해 가중치와 편향 값을 수정한다고 하였습니다. 하지만 그냥 아무 값이나 넣는다면 최적화된 값을 찾는데 매우 오랜 시간이 걸릴 것입니다.

경사하강법이란, 손실이 최소가 되는 최적의 가중치를 찾는 방법입니다. 먼저 함수의 기울기(경사)를 구하여 기울기가 낮은 쪽으로 계속 이동시켜서 극값에 이를 때 까지 반봅하는 작업을 반복하면 최적의 가중치를 을 수 있습니다.


경사하강법: 함수의 기울기(경사)를 구하여 기울기의 절댓값이 낮은 쪽으로 이동시켜 극값(최적값)을 찾는 방법


여기서 쓰이는 함수란, 손실이 최소가 되는 최적의 가중치를 구하기 위한 모든 w값의 손실을 나타내는 함수입니다. 이를 그래프로 그리면 아래의 그림과 같은 모양이 그려집니다.

가중치의 크기에 따른 손실 그래프를 그려보면 위의 그림과 같이 아래로 볼록한 모양이 됩니다. 왜 아래로 볼록한 모양이 나오는 것일까요?

손실이 최소가 되는 가중치의 최적점(점 A)이 있다고 가정하겠습니다.  이 점은 이미 손실이 최소인 점 A는 그보다 더 작은 가중치와 더 큰 가중치에서는 더 높은 손실을 나타낼 것입니다. 그리고 이 최적점에서 멀어질 수록 그 손실은 더 커지게 되어 위와 같은 아래로 볼록한 모양의 손실-가중치 그래프가 그려지게 됩니다.



경사하강법으로 최적의 가중치를 찾는 과정

1. 가중치(w)의 시작점 정하기

시작점을 정하는 것은 별로 중요하지 않습니다. w를 0으로 설정해도 좋고, 임의의 값을 설정해도 괜찮습니다. 이번 예에서는 0보다 조금 더 큰 값으로 시작점을 설정하겠습니다.


2. 시작점의 기울기를 구해 다음 점의 이동 방향 결정

시작점의 기울기를 편미분을 하여 구해줍니다. 그 다음 기울기의 크기의 반대 방향으로 점을 이동시켜줍니다.

우리가 설정한 시작점의 기울기는 음수(-)이니 점을 양수(+) 방향으로 이동시켜줍니다.



3. 기울기의 크기의 일부를 시작점에 더한 만큼 다음 점으로 이동

기울기의 크기의 일부를 시작점에 더해 다음 점으로 이동을 시켜줍니다. 이렇게 더해진 값을 보폭(Step)이라 합니다. 이 보폭을 어떻게 결정하는 지는 다음 포스트(06_학습률)에서 다루도록 하겠습니다.

이번 포스트에서는 머신러닝 모델이 어떤 방식으로 손실을 줄이는지 다뤄보도록 하겠습니다. 머신러닝은 기본적으로 주어진 데이터를 여러번 학습하는 반복 학습 방식을 통해 예측의 정확성을 높입니다.



반복 방식

머신러닝의 기본적인 학습 방법인 반복 방식은 입력된 특징(Feature)들을 임의의 가중치(Weight)와 편향(Bias)로 예측 값을 산출하여 실제 값(Label)과 비교하여 그 차이(Loss)를 0 또는 최소화가 되게 하는 가중치와 편향 값을 찾는 방식 입니다.


위의 그림은 머신러닝에서 반복 방식이 동작하는 과정을 나타낸 그림입니다. 그 과정을 풀이하면 다음과 같습니다.

  1. 임의의 가중치과 편향이 설정된 모델(Model)에 특징(Feature)를 넣습니다.
  2. 모델의 예측 함수(y' = b + wx)를 통해 산출된 예측 값(Prediction)을 실제 결과(Label)과 차이를 계산하여 손실을 알아냅니다.
  3. 가중치(Weight)와 편향(Bias)를 재설정하여 모델을 새롭게 만듭니다.
  4. 손실이 0 또는 최소가 될 때까지 위의 과정을 반복합니다.
이런 반복 과정을 통해 전체 손실이 변하지 않거나 느리게 변하게 되면 이때 모델이 수렴했다고 말합니다.

반복 방식: 초기에 임의로 가중치와 편향을 설정하고 예상 손실 값이 가장 적은 가중치와 편향을 학습할 때까지 매개변수를 조정하는 방식



학습과 손실

  • 학습(Training):
    Label이 있는 데이터로부터 모델을 학습시켜 적절한 가중치(Weight)와 편향(Bias)를 찾는 것
  • 손실(Loss):
    예측한 값과 실제 값간의 차이를 의미하며, 잘못된 예측에 대한 벌점과 같음. 모델의 예측이 실제 데이터보다 차이가 많이 날 수록 손실은 커지게 됨.

모델 학습의 목표: 모든 예(Example)에 대해서 가장 작은 손실(Loss)을 갖는 가중치(Weight)와 편향(Bias)의 집합을 찾는 것


위의 그래프에서 파란선은 예측(Prediction)을, 빨간선은 손실(Loss)를 의미합니다. 빨간색 선의 길이가 비교적 짧은 왼쪽 그래프가 오른쪽 그래프보다 더 좋은 예측을 하는 모델입니다.



제곱 손실(Squared Loss)

손실을 표현하는 함수 중 가장 잘 알려진 제곱 손실 함수는 손실 값을 양수로 표현하기 위해 각 손실에 제곱을 취해 모든 손실을 더한 것을 말합니다.


제곱 손실을 이용할 경우에는 손실의 차이를 양수로 다 더해 손실의 총 크기를 알기 쉽다는 장점이 있지만, 입력된 x의 개수가 다른 두 모델의 대해 손실 정도를 비교하기 어렵다는 단점이 있습니다. 이러한 단점을 보안하기 위해 실제로는 평균 제곱 오차(Mean Square Error)를 주로 사용합니다.



평균 제곱 오차(Mean Square Error)

예시의 수가 다른 두 모델을 비교할 수 없는 제곱 손실의 단점을 보완하는 방법이며, 아래의 식으로 표현할 수 있습니다.

  • (x, y): 모델 학습에 사용되는 예(Example)
    - x: 모델이 예측하는데 사용되는 특징(Feature)
    - y: 라벨(Label)
  • prediction(x): 특징(x)와 가중치의 곱과 편향값의 합으로 된 함수 => y' = b + w*x
  • D: 라벨이 있는 예가 포함된 데이터 세트
  • N: D에 포함된 예의 수


+ Recent posts