Machine Learning (기계학습) - part 3 [로지스틱 회귀(Logistic Regression)]
2021년도에 대학교 과목으로 들었던 '기계학습' 강의를 복습 및 정리 + 추가적인 공부를 위해 이 글을 작성한다. (세종대학교 최유경 교수님 '2021 기계학습'수업)
저번 part에 이어서 이번에도 지도학습의 학습 모델 중 로지스틱 회귀(Logistic Regression)에 대해 알아본다.
이전에 배웠던 KNN같은 경우 학습 데이터 자체분석하여 예측을 진행하였다. 하지만 로지스틱 회귀 모델은 여타 다른 학습 모델과 같이 예측 모델을 만들고 이 모델의 파라미터를 추정하여 예측을 진행한다.
로지스틱 회귀(Logistic Regression)를 알아보기 전 우린 선형 회귀(Linear Regression)에 대해 알아볼 필요가 있다. 선형회귀는 딥러닝의 핵심인 퍼셉트론의 기반이 되는 모델이기에 추후 다룰 딥러닝을 위해 더 자세히 볼 필요가 있다.
선형회귀는 단순선형회귀(Simple Linear Regression), 다중선형회귀(Multiple Linear Regression) 두가지로 나누어진다. 말 그대로 단순선형회귀(Simple Linear Regression)는 변수(특성,feature)가 1개일 때 이용되는 기법이고 다중선형회귀(Multiple Linear Regression)는 변수(특성,feature)가 2개이상일 때 이용되는 기법이다. 사실 단순선형회귀는 다중선형회귀에 포한되는 개념이기도 하고 실생활에서 볼 수 있는 데이터들은 특징이 다양한 데이터들이 대다수기에 다중선형회귀(Multiple Linear Regression)를 기준으로 설명을 진행한다.
다중선형회귀(Multiple Linear Regression)
이론
그럼 다중선형회귀는 무엇일까? 정확히는 수치형 설명변수 X(입력값)와 연속형 숫자로 이루어진 종속변수 Y(목표값)간의 관계를 선형으로 가정하고 이를 가장 잘 표현할 수 있는 회귀계수(가중치, 독립변수가 한 단위 변화함에 따라 종속변수에 미치는 영향력 크기)를 데이터로부터 추정하는 모델이라고 할 수 있다. 간단한 예시를 한번 살펴보면,
먼저 왼쪽 예시는 단순선형회귀(Simple Linear Regression, 특성이 1개)이다. 이 문제는 주택 크기를 의미하는 특성(feature)과 주택 가격을 의미하는 연속형 종속변수(목표값)의 관계를 잘 나타내는 선형(직선)을 찾는 문제라고 생각하면 된다. 두번째 예시는 다중선형회귀(Multiple Linear Regression, 특성이 2개 이상)이다. 이 문제는 x1 과 x2 의 두가지 특성을 통해 y라는 연속형 종속변수(목표값)의 관계를 잘 나타내는 선형(평면)을 찾는 문제라고 생각하면 된다. 결국 선형회귀는 이런 선형(직선 or 평면, ...)을 찾기 위해 학습하는 모델인 것이다.
(차원이 증가할수록 관계를 나타내는 선형의 차원도 증가. ex, 특성 1개 -> 직선(1차원), 특성이 2개 -> 평면(2차원), 특성이 3개 -> 3차원, ...)
다시말해 관계를 나타내는 선형(모델)은 수식으로 표현할 수 있다는 것이다. 그럼 이런 모델을 찾기 위한 방정식은 어떻게 될까?
방정식은 이런 식으로 진행되는데 여기서 중요하게 볼 부분은 회귀계수이다. 결국 선형회귀모델은 데이터 분포를 잘표현하는 회귀계수를 찾아가는 문제라고 생각하면 된다.
그럼 이런 회귀계수들은 어떻게 찾아갈까? 이런 회귀 계수 결정법에는 Direct Solution, Numerical Search 2가지 방법이 있다.
1. Direct Solution
단어의 의미 그대로 직접적으로 찾는 방법이다. 선형회귀의 계수들은 실제값(Y)과 모델의 예측값(Y')의 차이 즉 오차제곱합(error sum of squares)를 최소로 하는 값(즉, 가장 유사한 예측 찾기)을 회귀 계수로 선정하게 되는데 이런 최적의 회귀계수들은 사실 회귀계수에 대한 미분한 식을 0으로 놓고 풀면 명시적인 해를 구할 수 있다. 즉, X와 Y데이터 만으로 회귀 계수를 구할 수 있다. 하지만 이는 이론상 가능한 수식이다. 사실상 변수가 굉장히 많아지는 실제 데이터에서는 불가능하다고 볼 수 있다. 그래서 Numerical Search 방법이 필요한 것이다.
2. Numerical Search
일반적인 회귀계수를 구하는데 가장 많이 사용되는 기법이다. 경사하강법(gradient descent)같은 반복적인 방식으로 선형회귀 계수를 구하는 방법이다. 여기서의 핵심은 '경사하강법'이다. 경사하강법이란, 임의의 함수(목적함수, 비용함수, 에러값)을 최소화하기 위해 임의의 시작점을 잡은 후 해당 지점에서의 경사(gradient)를 구하고, 그 경사의 반대 방향으로 조금씩 이동하는 과정을 여러번 반복하여 경사가 0이 되는 지점을 찾는 방법이다.
그림을 통해 설명하자면 J(w)를 오차제곱합이라고 가정해보자. 즉, 이 함수는 예측값과 실제값의 차이를 표현하는 함수이다. 여기서 우리의 목표는 예측값과 실제값의 차이를 최소한으로 줄여 모델의 성능을 높이는 것이다. 그 말은 즉슨 위의 그래프에서의 J(w)가 최소가 되는 w(회귀 계수, 가중치)를 찾는 것이다. 이는 위에서 설명한 것과 같이 미분(기울기)을 통해서 구할 수 있다. 즉, 기울기가 0이 되는 지점이 J(w)의 최소값이므로 우린 경사하강법을 반복 진행하여 기울기가 0이 되게끔하는 w지점을 찾으면 된다.
이런 경사하강법에는 다양한 종류가 있다.
1) Batch Gradient Descent (GD)
일반적인 방법이다. 파라미터를 업데이트 할때마다 모든 학습 데이터를 사용하여 cost function의 gradient를 계산한다. 이는 말 그대로 모든 학습 데이터를 사용하기에 느리고 그에 따라 매우 낮은 학습 효율을 보일 수 있으며 Local minimum에 빠질 위험이 크다.
2) Stochstic Gradient Descent (SGD)
SGD는 파라미터를 업데이트 할 때, 무작위로 샘플링된 학습 데이터를 하나씩만 이용하여 cost function의 gradient를 계산한다. 모델을 자주 업데이트하여 성능 개선 정도를 빠르게 확인할 수 있고 무작위로 샘플링된 학습 데이터를 사용하므로 GD보다 Local minimum에 빠질 가능성이 적다. 하지만, 여전히 SGD도 최소 cost에 수렴했는지의 판단은 상대적으로 어렵다. 이런 단점들을 계선하고 더 효율적인 수렴을 위한 SGD의 발전된 다양한 기법들이 있기도 하다. (ex Adam, 현재 많이 쓰고 있는 최적화 기법)
3) Mini Batch Gradient Descent
이는 GD와 SGD 의 단점들을 보완하고자 둘의 개념을 혼합시킨 기술이라고 생각할 수 있다. 즉, 파라미터를 업데이트 할 때마다 일정량의 일부 데이터를 무작위로 뽑아 cost function의 gradient를 계산한다. 이를 통해 SGD의 노이즈를 줄이면서 GD의 전체 배치보다 효율적인 결과를 얻어낼 수 있었다. .
하지만 이름에서 알다시피 다중선형회귀는 말그대로 회귀를 초점으로 둔 모델이라고 할 수 있을 것이다. 그럼 분류는 어떻게 진행될까? 예를 들어, 0과 1을 예측해야 되는 분류문제에서 이들의 데이터를 선형으로 분리할 수 있을까?
해당 데이터를 한번 살펴보자. 이는 앞서 설명했던 Yes와 No로 예측을 해야되는 이진분류 문제이다. 여기서 우리가 회귀에서 진행했던 선형으로써 데이터를 표현할 수 있을까? 아니다. 그래서 다중선형회귀를 통해 분류문제를 해결하려면 로지스틱함수라는 것이 필요하다.
로지스틱 함수(Logistic function)
로지스틱 함수란, S-커브 함수를 나타낸다. 즉, 입력값(x)로는 어떤 값이든 받을 수가 있지만 출력 결과(y)는 항상 0에서 1사이 값이 되면서 이진 분류에 있어서의 그 오차를 구하고 이 오차를 줄어드는 방향으로 학습이 가능해진다.
다중분류 또한 선형으로 데이터를 나타낼 수 없기에 다중분류 문제에서는 다항 로지스틱 함수인 소프트맥스 함수를 사용한다.
결론적으로 생각해보자면 우리가 학습하고자 하는 데이터의 종속변수가 수치형, 즉, 회귀문제라면 설정되는 loss function(MSE, ...)을 통해 설명변수(X)와 종속변수(Y, 목표값)의 관계(선형 자체)를 표현하는 일반적인 선형 회귀 모델로 학습이 이루어지는 것이고, 종속변수가 범주형, 즉, 분류문제라면 이 선형 회귀 모델을 로지스틱 함수(시그모이드 함수)와 loss function(오차 함수. ...)를 통해 종속변수(Y)를 범주에 따라 잘 구분하게 해주는 결정경계(선형 자체가 결정경계)를 표현하는 모델로 학습이 이루어지는 것이다.
실습
데이터는 KNN실습과 동일한 iris 데이터, 전처리 기법도 동일하게 진행하므로 생략. [참고]
from sklearn.linear_model import LogisticRegression # 로지스틱 회귀
logit = LogisticRegression(C=200, random_state=11) #L2, auto
logit.fit(x_train, y_train)
logit.score(x_test,y_test) # 0.9333333333333333
# 로지스틱 함수의 경우 정규화를 진행하면 더 좋은 정확도를 보임. -> 0.98...
여기서 중요하게 봐야될 부분은 로지스틱 회귀 함수의 인자들이다. 'C'는 규제강도를 의미한다. 규제란, 일반화(generalization)를 얼만큼 중요하게 생각하느냐 라고 생각하면 된다. C값이 작으면 작을수록 규제화의 강도는 커져 일반화에 대한 중요도가 높아지게 된다. 즉, overfitting(과대적합)의 가능성이 줄어든다. 또한, 로지스틱 회귀 함수는 L1, L2 규제화도 존재한다. 이들의 규제화를 통해 C와 같이 overfitting에 대한 방지가 가능하게 된다. 그렇다면 적절한 규제 방법은 무엇일까? 사실 아무도 모른다. 이 또한 데이터에 따라 천차만별이기에 실험적으로 데이터에 맞게 각각의 조합을 체크하며 최적의 하이퍼파라미터를 구하는 수밖에 없다.