일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- loop
- webpack
- var
- JavaScript
- 앙상블
- generic
- machine learning
- AI
- nginx
- dotenv
- Python
- C#
- type
- scss
- VUE
- BOJ
- security
- git
- docker
- C++
- Clone
- leetcode
- vuetify
- property
- condition
- bash
- 보안
- npm
- TypeScript
- vue.js
- Today
- Total
ice rabbit programming
[AI] 회귀분석 - 모델 본문
현재는 AI와는 꽤 거리가 먼 직무를 맡고 있고, 그나마 있는 경험은 학부생 시절에도 관련 수업을 한두 개 들은 정도였다. 12월 한 달 동안 AI의 기초에 관한 강의를 수강할 기회가 있어, 배운 내용들을 정리 및 공유하기 위해 포스팅을 시작하려 한다. 일전에 한 달 정도 포스팅했던 typescript와 비슷할 것 같다.
다만, 지식 공유도 목적에 있기는 하지만 전문가가 아니고, 개념적인 내용 정리에 초점을 맞출 생각이기에 그림 등 시각 자료가 다소 부족하고, 코드가 부족할 수 있다. 프로그래밍에 종사하고 있지만 AI 관련 지식이 없는 사람으로서, 이해한 내용을 최대한 쉽게 정리하려고 했다는 장점이 있지만 좀 더 전문적이고 세세한 설명을 원하시는 분들은 다른 글을 찾아보심이 좋을 것이라 생각된다.
머신러닝(기계 학습)은 크게 지도 학습, 비지도 학습, 강화 학습으로 분류할 수 있다. 셋 모두를 차례대로 다룰 것인데, 첫째로는 지도 학습을 다룬다.
지도 학습은 다시 회귀 분석(Regression)과 분류(Classification)로 분류할 수 있다. 이번 포스팅에서는 이 중에서도 회귀 분석에 대해 이야기하고자 한다.
회귀 분석(Regression)의 개념은 간단하다. 데이터를 가장 잘 표현하는 선을 찾아 결과 값을 예측한다. 즉, 데이터 간의 상관 관계를 찾는다. 이는 바꿔 말하면 선의 Y 절편 및 기울기를 찾아, 상관 관계를 이루는 식을 찾는 것이다.
데이터들과 가장 가까운 선이라는 컨셉은 윗 줄을 읽으면 이해가 갔을 것이다. 그렇다면 '가깝다'는 것은 어떤 것일까? 그래서 나온 개념이 loss function이다.
loss function은 데이터의 실제 갑솨 모델의 예측 값의 차이로, 회귀 분석은 이 loss function을 최소로 하는 모델을 찾는 것이 목표이다. 이를 위해서 Gradient Descent(경사 하강법)를 주로 사용한다. 그래프에서 가장 오목한 부분을 찾아서 이동하는 것이다. 아마 고등학교 수학에서 이차 함수 이상의 꼭짓점을 찾는다고 생각하면 쉬울 것이다.
즉 Gradient Descent는 모델을 찾아가는 과정에서는 올바른 방향이라고 생각되는 방향으로 이동할 뿐이다. 예시를 들면 지도가 없이 산에 있을 때, 꼭대기를 가기 위해서는 현재 위치에서 가장 기울기가 높은 방향으로 지속해서 가다보면 도달할 수 있는 것과 같다.
덧붙여서 Gradient Descent에 대해서 조금 더 자세히 설명하자면, 아주 베이스가 되는 저명한 방법이지만 근본적으로 local optimization(지역 최솟값) 문제와 oscillation(진동) 문제를 가지고 있다. 최적화가 엄청나고 발전된 기법들도 많지만 Gradient Descent가 가진 근본적인 문제이기에 완벽하게 해결할 수는 없다. 두 가지에 대해 간단하게 알아보고 넘어 가자.
- local optimization(지역 최솟값) : 고등학교 수학에서, 극솟점을 생각하면 된다. 극솟점이라고 최솟값은 아니었듯, 전체로 봤을 때에는 최적화 인 부분이 아니지만 기울기를 통해서 계속 나아가서 전환되는 지점이기 때문에 학습이 끝이 난다. 아래 그래프에서 오른쪽 부분이라고 볼 수 있다. 물론 당연하게도 우리의 목표는 왼쪽 최솟값이 목표이기 때문에 문제가 된다.
- oscillation(진동) : 진동은 학습률에 관한 문제인데, 쉽게 표현하면 오래걸리더라도 세밀하게 조금씩 움직일 것이냐, 빠르게 가기 위해 성큼성큼 움직일 것이냐이다. 이 때 빠르게 가기 위해 확확 움직인다면, 딱 최솟값 지점을 찾지 못하고, 좌우로 왔다갔다 하면서 시간을 허비하게 된다. 이 때 발생하는 낭비되는 시간의 문제를 oscillation이라고 부른다.
회귀 분석의 절차는 다음과 같다.
1. X라는 값이 입력되면 Y=B0+B1*X라는 계산식을 통해 값을 산출하는 예측 함수를 정의
2. 예측 함수를 통해 도출된 예측값 pred_y 와 실제 값 y 간의 차이를 계산
3. 계산한 차이에 기반하여 B0과 B1를 업데이트하는 규칙을 정의하고 이를 바탕으로 B0과 B1의 값을 조정
4. 위의 과정을 특정 반복 횟수(iteration) 만큼 반복
5. 반복적으로 수정 B0와 B1를 바탕으로 Y=B0+B1*X라는 회귀식을 정의
이 중에서 일차 함수(선)를 찾는 회귀 모델을 단순 선형 회귀(Simple Linear Regression)라고 한다. 단순 선형 회귀 모델은 Y=B0+B1*X와 같이 변수 하나에 대해서 모델링이 되므로, 변수가 여러 개일 경우에는 다중 선형 회귀, 다항 회귀 등 좀 더 복잡한 알고리즘이 필요하다.
모델링을 하고 데이터를 넣을 때에는 학습용과 테스트 데이터를 분리한다. 왜냐하면 지도 학습은 정답이 주어져 있는 형태이기 때문에, 학습한 내용은 당연히 결과가 잘 나올 수밖에 없다. 그러므로 학습되지 않은 데이터를 테스트 데이터로 사용해야 한다.
다중 선형 회귀(Multiple Linear Regression)은 상술했듯 입력값 X가 여러 개인 경우에 활용한다. 원리는 단순 선형 회귀와 같으므로, 각 X에 대한 계수를 찾는 것이 목표이다(ex. Y=B0+B1X1+B2X2...). 이 경우에는 어떤 입력 값이 결과에 영향을 미치는지 알 수 있다. 하지만 만일 여러 입력 간 사이에 상관 관계가 높을 경우(서로 영향을 미치는 정도가 클 경우)에는 결과의 신뢰성이 낮아질 수 있다.
다항 회귀(Polynomial regression)는 예측 결과값이 선형적이지 않다고 판단될 때 사용한다. 이차항 등 차수를 높이는 방법이다(ex. Y=B0+B1X1+B2X2^2).
단, 차수가 극단적으로 높아지면 과적합(Overfitting) 현상이 발생할 수 있다. 과적합이란 모델이 훈련 데이터에 과도하게 맞춰진다는 뜻인데, 실제로는 훨씬 일반적인(General한) 케이스가 많지만, 훈련 데이터를 학습한 모델이 일반적인 데이터를 제대로 예측하지 못하게 되는 현상이다. 즉, 과거 데이터를 학습한 회귀 모델의 예측 결과가 매우 낮은 경우이다.
과적합 현상은 교차 검증(Cross Validation), 정규화 등으로 방지할 수 있다. 이에 관해서는 다음 포스팅, 회귀 모델 - 검증 편에서 다루도록 하겠다.
'Development > Machine Learning' 카테고리의 다른 글
[AI] 차원 축소(Dimensionality Reduction) (0) | 2021.02.13 |
---|---|
[AI] 군집(Clustering) - K-means, GMM, 평가 지표 (0) | 2021.02.03 |
[AI] 분류 - KNN, 평가 지표 (0) | 2021.01.18 |
[AI] 분류 - SVM, 나이브 베이즈 분류 (0) | 2021.01.13 |
[AI] 회귀분석 - 검증, 평가 (0) | 2021.01.12 |