데이터 사이언스/머신러닝 & AI

비선형 모델 및 머신러닝에 대하여 (feat. 튜닝)

라니체 2022. 8. 5. 00:49
728x90

학부때 개인적으로 존경하는 교수님께서

통계학의 꽃은 "회귀분석" 이라고 말씀하셨다.

그리고 "회귀분석"은 아무리 강조해도 지나치지 않다고 말씀하셨다.

그 이유는 회귀분석이 모델링의 전반에 대한 기초체력을 기를 수 있게 해주기 때문일 것이다.

 

회귀분석은 linear regression을 말하는데, linear 라는 특성상 매우 간단하다고 생각하기 쉽다.

하지만 회귀분석은 그 linear한 모형 조차도 매우 신중하게 다룬다.

잔차 plot을 유심히 보기도 하고 적합도 검정(goodness of fit test)을 통해 모형의 goodness를 계속 확인한다.

설명 변수들간의 상관성으로 혹여나 모델의 해석에 왜곡이 생기지는 않는지(다중공선성),

또 그 상관성이 왜 문제가 되는지 수학적으로 풀어헤쳐본다.

이런 과정들을 통해서 데이터 분석에 있어 좋은 모델링이란 무엇인지 기준을 잡게 된다.

즉, 모델링을 하고 예측력 좋으니까 끝.. 이게 아니라, 왜 이 모델이 좋은지, 또는 적합한지를

정량적, 정성적으로 판단하는 방법을 배우는게 회귀분석인 것이다.

 

약간 서론이 길어졌는데

사실 내가 오늘 하려던 말은 회귀분석에 대한 것은 아니다.

사실은 회귀분석(linear regression)으로 커버가 가능하지 않은 경우에 대해 말해보고자 한다.

 

위에서 말한것처럼 정성스럽게 linear regression을 통해 회귀분석을 했는데

잔차 검정이나 적합도 검정을 봤을 때, 모델의 fitting에 문제가 생길 수 있다.

특히, 현실세계의 많은 현상들은 비선형적이기 때문에 linear 가정이 현실적이지 않을 수 있다.

 

이때는 사실 비선형 모델로 가야하는데 비선형 모델로 가기 위해서는 (1)회귀분석의 linear 틀을 가지고 가는 방법

(2)그 틀을 가져가지 않고 black box 방식이라 볼 수 있는 머신러닝으로 가는 방법이 있다. (2)가 (1)에 비해 성능이 더 우월한 경우가 많고, 대신에 (1)이 (2)에 비해 해석가능성(interpretability)은 훨씬 크다고 볼 수 있다.

 

먼저 (1) linear하게 비선형 모델링을 하는 방법에는

 

(a) 다항회귀 (Polynomial Regression)

(b) 스플라인 & GAM (Generalized Additive Model)

 

정도가 있다.

 

다항 회귀는 말 그대로 설명변수의 고차항을 넣는 것이다.

예를 들면, $$y=b_{0}+b_{1}x+\epsilon$$ 라는 회귀 모형이 있다면,

이를 $$y=b_{0}+b_{1}x+b_{2}x^{2}+b_{3}x^{3}+\epsilon$$ 와 같이 x의 고차항을

추가적으로 넣어주는 것이다. 문제는 고차항의 정도를 어느정도로 할 것인지인데

고차항을 크게 할수록 모델이 유연해지지만, 많은 경우에 데이터는 노이즈를 포함하고 있기 때문에

과적합(overfitting)이 일어나기 마련이다. 그래서 어느정도로 유연하게 해야할지 사용자가 임의로

결정해주어야 한다. 그 외에도 다항 회귀의 회귀계수에 대한 유의성을 어떻게 해석해야할지 어려움이 있어서

사실상 실제로는 잘 사용되지 않는다.

 

스플라인은 다항회귀와 다르게 비모수적 접근 방식이다. 즉, 다항회귀는 회귀계수라는 파라미터가 있고, 함수 자체가 다항함수로써  explicit하게 표현이 되지만, 스플라인은 파라미터가 존재하긴 하지만 그 파라미터가 어떤 실질적인 의미가 있는 것은 아니고, 단지 explicit하지 않은 함수를 표현하기 위해 존재한다. 스플라인의 종류에도 여러가지가 있는데 대표적으로 자연 3차 스플라인, thin plate spline 등이 있다. 스플라인 역시 유연함의 정도를 결정하는 튜닝파라미터들이 있다. 그리고 GAM(Generalized Additive Model)은 이러한 비선형 스플라인 함수들을 변수마다 취해서 더한 모델이다. 즉, 설명변수가 x1,x2,x3가 있으며 스플라인 함수를 s라고 표현한다면, GAM은 아래와 같이 표현할 수 있다.

 

$$y=b_{0}+s_{1}(x_{1})+s_{2}(x_{2})+s_{3}(x_{3})+\epsilon$$

 

여기서 s1,s2,s3 는 각기 다른 스플라인 함수이다. 이로써 다변량 모델 또한 유연하게 표현 가능하다. 두 변수 사이의 interaction 또한 반영이 가능하지만, 이에 대해선 우선 생략하겠다.

 

(2) 머신러닝으로 비선형모델링을 하는 방법은 정말로 다양하게 발전되어왔다. SVM(Support Vector Machines), RF(Random Forest), GBM(Gradient Boosting Machine) 에서부터 ANN(Artificial Neural Network) 까지...

 

이 모델들은 각각 나름의 모델 학습 방법이 있어, 각자의 알고리즘에 의해 학습이 된다.

즉, 각자 최적화하는 loss function이 다르다고 볼 수 있다. 이 때문에 어떤 데이터셋에 대해서는 어떤 모델이 더 우세할 수 있고 어떤 모델은 상대적으로 성능이 떨어질 수 있다. 모든 데이터셋에 대해서 항상 제일 우수한 모델은 없기 때문에

여러 모델들을 try해보아서 최적의 모델을 찾아야 한다.

 

문제는 이런 모델들도 (1)에서와 같이 비선형의 정도를 control하는 튜닝파라미터들이 존재한다. 비선형을 너무 유연하게 줄 경우, 모델이 훈련데이터에서만 잘 맞는 과적합(overfitting)현상이 일어날 것이다. 따라서 적절한 유연도를 찾기 위해서 머신러닝에서의 튜닝은 필수적이다. 그리고 (1)에서는 튜닝파라미터가 1~2개였던 반면, 머신러닝에서 튜닝파라미터는 보통 5개이상으로 매우 많다. 모델의 유연도 뿐만 아니라, 모델의 학습과정, 즉 optimization 과정에서 필요한 파라미터들도 있고 기타 보조적인 파라미터들이 많이 따라온다. 그래서 사실 튜닝이 쉽지는 않다.

 

비선형 모델링을 하기 위해서는 (1)과 (2)의 방법이 있으며, 적절한 유연도를 설정하기 위해 튜닝파라미터들을 설정해야된다는 점을 알았다. 실제로 튜닝파라미터들을 적절히 튜닝하기 위해서는 Cross Validation(CV) 방식을 많이 사용한다.  CV는 훈련데이터를 쪼개서 일부 훈련데이터를 마치 평가데이터처럼 사용하여 유연도의 적절한 정도에 대한 힌트를 얻는 것을 말한다. 이에 대한 자세한 설명도 우선 생략하겠다.

 

CV를 사용하여 튜닝을 할때에는 하나의 튜닝파라미터 조합 당 5번에서 10번의 모델링 작업을 반복해야한다.

만약 튜닝파라미터 조합의 개수가 10가지라면, 최대 100번의 모델링 작업을 해야할수도 있다.

특히 시간이 오래걸리는 머신러닝을 이와같이 돌리는것은 비현실적일 수 있다.

따라서 보통은 튜닝파라미터들 중에서 가장 영향력이 큰 튜닝 파라미터를 먼저 정하고

차례차례 그 영향도가 작아지는 순으로 튜닝을 한다.

 

하지만 이렇게만 말을 하면 사실 감이 잘 잡히지 않을 것이다.

다음 포스팅부터는 대표적인 머신러닝 모형들인 SVM, RF, XGB(eXtreme Gradient Boosting) 을

현실적으로 어떻게 튜닝하는지를 파이썬으로 같이 알아보고자 한다.

그리고 이후에 시간이 된다면 (1) 방법론은 어떻게 튜닝하는지도 알아보고자 한다.