본문 바로가기

머신러닝/[단단한 머신러닝]

선형 모델 / LDA / 클래스 불균형

 머신러닝을 이용한 사업 예측이라는 프로젝트의 복잡한 PPT가 대개는 선형 모델을 이용한 예측이더라-라는 우스꽝 스러운 글과 그림을 어디선가 본 적이 있는데, 막상 찾으려니 안보이네요. 이번 3단원에서는 이 선형 모델으로 이야기를 시작합니다. f(x) = wx + b 라는 수식으로 표현되는 이 모델은, 매우 간단하면서도 머신러닝의 중요한 사상을 담고 있습니다. 머신러닝의 대장격인 딥러닝도 결국은 많은 선형모델을 쌓아올리되 사이사이 비선형성을 추가시킨 개념입니다. 

 선형 모델은 w,b라는 놈들의 최적해(Optimum solution)을 찾기 위해 최소제곱법(Least square method)를 활용하는데, 그 목적함수(Objective function)은 컨벡스(Convex)한 덕에, w에 대해 미분한 식과, b에 대해 미분한 식이 각각 0이 되도록 만족하는 w,b가 바로 최적해가 됩니다. y = x^2이 최소값을 갖는 x를 찾을 때, y' = 2x = 0 를 만족하는 x = 0 을 찾던 것을 떠올리시면 되겠네요. 다만 모든 (X,y) 데이터셋들이 선형적인 관계를 갖지는 않으니, 당연히 최종 결과(wx + b)에 지수승이라든지, 혹은 다른 비선형함수를 거쳐서 최종 결과값으로 연결할 수 있다면 더 정확해질겁니다. 이런 모델들 - y = g(wx + b) - 을 일반화 선형 모델(Generalize linear model)이라 부릅니다.

 이렇게 생각해보면 선형 모델은 실수값의 범주를 갖게됩니다. 지금 이상태로는 회귀 모델인거죠. 내가 만약 분류문제를 풀고 싶다면 어떻게 하면 좋을까- 에 대한 답이 로지스틱 회귀(Logistic regression)입니다. 위에서 언급했던 g를 단위 계단 함수(Unit-step function)으로 가져오면 됩니다. 가령 어떤 실수값 z가 나오면, 이게 0보다 작을 때는 양성(True, 1)으로, 0보다 클 때는 음성(False, 0)으로 쏴주는 함수를 세팅해주면 되겠죠. 다만 진짜로 계단 함수를 쏴주면 이건 불연속적이니까 영 좋지 못해요. 그래서 계단 함수랑 비슷한데, 연속 성질은 갖는 놈을 세팅하고 싶습니다. 그래서 로지스틱 함수(Logistic function)을 사용해요. 흔히 말하는 시그모이드 함수(Sigmoid function)과 같은 수식입니다. 이에 연결해서 오즈(Odds), 로짓(Logit) 등의 개념이 나오는데, 이는 일전에 글을 작성한 적이 있으니 생략하도록 하게습니다. 쨋든 이런 로지스틱 회귀는, 클래스를 분류해줄 뿐 아니라, 확률에 대한 정보도 뱉어냅니다. 로지스틱 함수가 0과 1사이의 값을 쏴주게 되니까요. 게다가 이 경우에도 목적함수가 컨벡스한 덕에, 최적해를 구하는게 가능합니다. 경사하강법(Gradient descent method), 뉴턴법(Newton method) 등을 사용하면 되겠습니다.

 선형 판별분석(Linear discriminant analysis, LDA)도 분류를 위한 알고리즘인데, 그 아이디어는 단순합니다. 샘플들을 어떤 공간에 찍어놓고, 그 점들을 어떤 직선위에 투영시키는데, 그 직선을 뭘 기준으로 잡아줄 것인가? - 첫째는, 같은 클래스에 속하는 샘플들끼리는 최대한 붙어있을 것. 둘째는, 다른 클래스들끼리는 서로 최대한 멀어질 것. 이러한 직선을 한번 찾아놓으면, 새로운 샘플이 들어왔을 때, 그 샘플을 직선위로 투영시키고, 어떤 클래스에 더 가까운지로 분류를 시행하면 되겠습니다. 이러한 LDA는 분류 알고리즘임과 동시에, 곰곰히 생각해보면 n 차원의 샘플들을 암만커봐야 n-1 차원의 직선으로 매핑시키기 때문에, 차원 축소(Dimension reduction) 기법 중 하나로 바라볼 수도 있습니다.

 여태까지는 이진 분류(Binary classification)에 대해 계속 이야기했는데, 현실의 문제는 참 또는 거짓으로 분류되는 경우보다 다양한 범주를 갖는 경우(다중 분류)가 더 많겠죠. 이럴 경우 어떻게 처리해야할까-에 대한 답은 사실 단순할 것 같습니다. 이진트리와 같은 사고방식을 구현하면 될 듯한데, 더 구체적으로 3가지 방향성이 있습니다. 일대일(One vs One, OvO), 일대다(One vs Rest, OvR), 다대다(Many vs Many, MvM)인데, 이에 대해 구체적인 설명은 하지 않겠습니다.

 다음은 클래스 불균형(Class imbalance) 문제에 대해 서술하고있습니다. 이도 당연한 것이, 실제 데이터셋의 라벨데이터는 각 클래스 별로 동일한, 또는 비슷한 샘플들이 존재할 가능성이 별로 높지 않습니다. 그럴 수 없는 상황도 많을 것이구요. 암에 걸린 환자, 암에 걸리지 않은 환자 정도만 생각해보더라도, 전자가 압도적으로 적은 수를 가질테고, 그럼 암이냐 아니냐를 예측하는 모델이 무조건 암에 안걸린다- 하기만 해도 그 정확도가 높을 것 같습니다- 만 이건 굉장히 멍청한 모델이겠지요. 이에 대해 3가지 대응법이 있습니다. 언더샘플링(Undersampling), 오버샘플링(Oversampling), 임계값 이동(Threshold-moving). 단순하게 이진 분류 데이터셋에서, 양성 클래스의 샘플이 90개, 음성 클래스의 샘플이 10개 있다고 칩시다. 이 때 양성 클래스의 샘플을 10개로 만들어서 균형있게 만들면 언더샘플링, 음성 클래스의 샘플을 90개로 만들면 오버샘플링, 분류를 시행할 때 사용되는 임계값(앞서 사용하기를 0.5)을 양성과 음성의 비율을 이용해 조정하면 임계값 이동입니다. 다만 샘플링을 진행할 때는 그냥 랜덤으로 하면 당연히 문제될 요소가 굉장히 많고, 언더샘플링은 이지 앙상블(Easy ensemble), 오버샘플링은 스모트(SMOTE)를 주로 사용합니다. 추가로, 임계값 이동의 개념은 추후 비용민감 학습(Cost-sensitive learnig)과 이어지는데, 딥러닝 학습시에 Weighted loss, Focal loss 등을 사용하는 것을 떠올리면 될 것 같습니다. 

 이상입니다.