INDEX
1. 지도 학습 개요
지도 학습은 사람이 먼저 어떤 데이터(x)에 대한 답(y)을 알려주고 이후에 새로운 데이터(x')를 입력받았을 때 x'에 대한 답(y')를 추측하는 학습 방법이다. 어찌 보면 우리 인간이 학습하는 방법과 매우 유사하다. 우리는 어떤 개념을 학습하기 위해 예시들을 접하고 그 예시들(데이터)에서 규칙을 찾으려고 노력하고 이 학습 과정은 뇌에서 일어난다. 이후 보지 못한 상황(데이터)에 우리의 학습된 뇌를 토대로 결과를 도출한다.
컴퓨터의 관점에서 재해석하자면 뇌는 학습하는 모델이다. 즉 모델은 답을 내놓는 몸체인 것이고 이를 학습시키는 것이 데이터인 것이다.
인간의 경우 자신이 얼마나 잘하고 있는지 검증해야 하기 때문에 시험을 보기도 한다(주로 줄세우는 목적이기는 하지만). 지도 학습도 마찬가지로 검증(테스트) 단계를 거쳐서 만들어진 모델이 얼마나 정확한지 확인한다.
위의 그림은 지도 학습의 전반적인 과정을 두 부분으로 나누어 그려본 것이다. 학습 단계에 들어가는 data와 그 data에 상응하는 정답인 output을 모델에 학습시킨다. 학습이 완료되면 간단한 형태의 프로그램이 완성된다. 우리가 프로그램을 만들 필요가 없어진 것이다!! 이후 학습에서는 존재하지 않았던 검증을 위한 data를 프로그램과 함께 결과를 유추하게끔 한다. 이후 다양한 모델 평가 지표를 이용해 모델이 얼마나 정확도가 높은지 평가 받게 된다.
지도 학습은 크게 회귀 모델과 분류 모델로 나뉘게 된다.
- 회귀(Regression)
입력된 변수에 대해 연속적인 형태의 출력 데이터를 예측하는 모델이다. 대표적인 예시로 공부 시간에 따른 성적, 갖가지 변수들에 의한 집값 예측등이 있다. 일반적으로 사용되는 회귀 알고리즘은 선형 회귀, 다항 회귀, 서포트 벡터 머신 회귀등이 있다. - 분류(Classification)
회귀의 맥락에서 출력 데이터를 연속적인 데이터가 아니라 이산적인 데이터로 바꾸면 된다. 즉 출력 데이터는 미리 정해진 클래스로 한정 된다. 예를 들어 0부터 9까지의 손글씨체를 구분한다고 가정하면 클래스는 0, 1, ... , 9가 되는 것이다. 이 상황에서 모델을 학습시키면 모델은 0~9까지 10가지의 클래스 중에서 밖에 답을 내지 못한다. 대표적인 분류 알고리즘은 KNN, SVM, 결정 트리등이 있다.
2. 데이터
형식적으로 데이터에 대해 관찰해보자. 데이터는 $(\textbf{x}, y)$쌍으로 모델에 입력된다. 여기서 $y$는 우리가 추측하고자 하는 부분(타겟 변수)이고 $\textbf{x}$ 는 그에 상응하는 데이터(피쳐 벡터)들이다. 즉 $\textbf{x}$는 $y$임을 입증하는 근거이다. $\textbf{x}$ 는 여러 요소들이 응축되어 있는 데이터기 때문에 벡터(볼드체)로 표현된다. 반대로 y는 실수값(회귀) 또는 클래스(분류), 즉 스칼라이기 때문에 그런 것이 없다.
$$D=\left\{ (\textbf{x}_{i},y_{1}), ...,(\textbf{x}_{n},y_{n}) \right\}\subseteq R^d\times C$$
$R^d$ 는 d차원 피쳐 공간이고 C는 라벨 공간이다. C는 아래와 같이 나타낼 수 있다.
이진 분류 | C = {0, 1} or C = {-1, +1} |
다중 분류 | C = {0, 1, ... , K} |
회귀 | C = R |
3. 피쳐 벡터
어차피 타겟 변수는 우리가 도출하고자 하는 값일 뿐이기 때문에 피쳐 벡터에 더 집중해 보자.
건강 보험 회사에서 회원들에 해단 건강 정보들을 갖고 있다고 가정하자. 이때 회원 한 명에 대한 생체 정보는 $\textbf{x}_{i}=(x_{i}^{1},x_{i}^{2},...,x_{i}^{d})$으로 나타낼 수 있다. 여기서 $x_{i}^{\alpha}$는 사람의 키, 몸무게, 성별, 간수치 등이 될 수 있다. 모든 카테고리가 유의미하게 정보가 차 있으면 이 피쳐 벡터는 dense 하다고 표현한다.
반대로 어떤 문서에서 특정 단어의 출현 빈도수를 사전으로 나타내면 한 번도 나타나지 않은 단어는 0으로 채워질 것이다. 생각해 보면 세상에 존재하는 단어는 매우 많다. 하지만 이 블로그 글만 해도 가능한 백만 가지의 단어들 중에서 많아야 만개의 단어만 사용했을 것이다. 이런 식으로 무의미한 데이터가 다수 끼어 있을 수 있는 상태를 sparse 하다고 한다. 하지만 이런 방법은 필요 없는 데이터까지 같이 저장해서 효율적인 메모리 사용을 할 수 없다. 그래서 선택 가능한 대안이 나타난 단어만 담는 feature hashing이다. 이는 사전을 사용하지 않아도 벡터 형태로 정보를 담을 수 있어 효율적이다.
이미지의 경우 픽셀 단위로 나타낼 수 있다. 흑백 이미지가 아닌 이상 픽셀 하나당 RGB 정보가 포함될 것이기 때문에 $\textbf{x}_{i}=(x_{i}^{1},x_{i}^{2},...,x_{i}^{3k})$ 와 같은 벡터로 표현될 수 있다. 즉 28*28 픽셀 크기의 이미지가 있다면 사실상 3*28*28 크기의 피쳐 벡터가 생성된다.
4. 손실 함수
손실(loss, error) 함수란 어떤 예측을 했을 때 실제 정답과의 차이를 표현하는 지표이다. 예측 값은 hypothesis를 따서 $h(\textbf{x}_{i})$로 표기하고 정답 라벨은 위에서도 봤다시피 $y_{i}$로 표기한다. 결국 우리가 원하는 상태는 손실 함수의 값이 가장 작은 상태이고 이 상태를 만들어주는 파라미터들을 찾는 것이 최종 목적이다.
가장 많이 사용되는 손실 함수 두 개를 비교해 보자.
1. Mean Squered Error(MSE) : ${L}_{sq}(h)=\frac{1}{n}\sum_{i=1}^{n}(h(\textbf{x}_{i})-y_{i})^2$
2. Mean Absolute Error(MAE) : ${L}_{abs}(h)=\frac{1}{n}\sum_{i=1}^{n}|h(\textbf{x}_{i})-y_{i}|$
전체적인 틀은 같다. 예측이 빗나간 정도를 0 이상의 양수로 바꾸어 주고 전체 데이터(1~n)의 총손실의 평균을 낸다. 하지만 디테일적인 차이는 제곱과 절댓값에 있다.
제곱 오차의 경우 오차가 작을 때는 그것이 제곱되어 더 작아지는 경향이 있고 반대로 오차가 크면 뻥튀기된다. 이는 즉슨 어떤 데이터에 대해 오차가 클수록 큰 페널티를 부과하고 작은 차이에는 무던하게 반응하는 모델이 만들어질 것이다.
절댓값 오차의 경우 오차가 크던 작던 양의 값으로만 오차가 누적된다. 그래서 손실 함수가 데이터의 오차 크기에 평등하게 반응한다.
주로 사용되는 손실 함수는 MSE이다. 왜냐하면 MSE는 모든 점에서 미분 가능하기 때문에 다양한 연산을 제한 없이 사용할 수 있기 때문이다. 하지만 MAE의 필요성도 다시 생각해 볼 필요가 있다. 예를 들어 자동차 가격에 대한 가격 예측 모델을 만들고 싶다고 하자. 일반적인 가격 구조에서 벗어나는 초고가의 특수 자동차 데이터는 이상치(outlier)이다. 즉 특수한 경우라서 딱히 우리 모델이 집중하지 않아도 되는 상황이지만 MSE는 오차에 큰 가중을 매겨 '중요한 데이터'인것양 취급할 것이다. 이런 경우에서는 MAE가 더 조용하고 안정적인 모델을 만들어줄 것이다.
5. 데이터 분리
이제 모델을 학습하기만 하면 된다. 예를 들어 100개의 데이터가 있다고 가정한다면 이를 훈련, 검증, 테스트 3개로 분리하는 것이 좋다.
- 훈련>>
말 그대로 모델을 훈련(학습)시키기 위한 데이터이다. 이 단계에서는 모델이 데이터들을 입력받으면서 파라미터들을 조정한다. 일반적으로 80%의 데이터를 훈련 데이터로 사용한다. - 검증>>
이 데이터 셋은 파라미터 업데이트에 관여하지 않는다. 다만 훈련 데이터를 거쳐서 학습한 모델이 오버피팅 되지 않았는지 검사해 주는 역할을 수행한다. 또한 학습을 통해 정해지는 것이 아닌 하이퍼 파라미터(학습률, 에포크)를 조정할 수 있게 도와준다. 검증 데이터에서 긍정적인 정확도를 얻고 나서야 테스트 데이터로 넘어갈 수 있는 것이고 일반적으로 전체 데이터의 10%를 사용한다. - 테스트>>
훈련과 검증을 마쳤으면 마지막으로 모델이 얼마나 쓸모 있는지 나머지 10%의 데이터를 통해 시험을 쳐보는 것이다.
데이터를 나눌 때는 어떻게 나누어야 할까? 일반적인 경우라면 랜덤으로 골라도 문제가 되지 않는다. 하지만 시간의 흐름에 의해 축적된 데이터는 반드시 시간 순서대로 데이터를 분리해야 한다.
앞선 시간대를 훈련으로, 비교적 최근 데이터를 훈련으로 분리해야 하는 이유는 데이터 유출을 막기 위해서이다. 여기서 의미하는 데이터 유출은 다음과 같다. 예를 들어 세 시점 A(미래), B(미래), C(현재)이 있다고 가정하자(여기서 말하는 현재, 미래는 물론 모두 과거 데이터들이다. 하지만 C데이터를 기준으로 책정하면 A와 B가 상대적으로 이후에 일어난 사건이라는 것이다). 시간은 방향성이 하나이기 때문에 과거의 데이터를 학습해서 미래를 예측해야 한다. 하지만 데이터를 뒤죽박죽 섞으면 훈련 데이터에 A, B가, 테스트 데이터에 C가 들어가 버리면 미래의 데이터를 토대로 모델을 학습하는 꼴이 되어 버리기 때문에 데이터의 선후 관계에 문제가 발생한다.
'ML&DL > 머신러닝' 카테고리의 다른 글
[머신러닝] 파이썬으로 선형회귀 BGD, SGD, MSGD 구현 + 실습(광고에 의한 수익 예측) (0) | 2024.01.15 |
---|---|
[머신러닝] 선형 회귀(Linear Regression)의 이해 (4) | 2024.01.11 |