본문 바로가기
머신러닝 알아보기

[머신러닝] 4. Linear Regression과 Logistic Regression

by 빈이름 2024. 12. 3.
1. Linear Regression과 Logistic Regression
    1.1. Linear Regression
    1.2. Logistic Regression
2. 손실 함수
    2.1. Linear Regression
    2.2. Logistic Regression
3. 학습 방법
    3.1. Linear Regression의 학습 방법
    3.2. Logistic Regression의 학습 방법
        A. sag, saga
        B. liblinear
        C. newton-cg
        D. lbfgs
4. 학습 규제

    4.1. Early stopping
    4.2. L1, L2 regularizer
5. 장단점
6. Linear Regression과 Logistic Regression의 코드 구현
    6.1. scikit-learn에서의 Linear Regression
    6.2. scikit-learn에서의 Logistic Regression

1. Linear Regression과 Logistic Regression

1.1. 손실함수

Linear Regression은 선형 함수를 이용해 입력과 출력 간의 관계를 예측하는 모델입니다.

이렇게 Linear Regression은 입력 데이터 x와 출력 데이터 y가 존재할 때, 둘 사이의 관계를 선형 함수로 나타냅니다. 선형 함수이기 때문에 수식도 아래와 같이 1차방정식으로 나타낼 수 있습니다.

$$y=w_1x_1+w_2x_2+...w_nx_n+b$$

입력 feature는 여러개일 수 있으므로 n개의 x가 존재할 수 있고, 이에 대응하는 coefficient(w)가 하나씩 존재하게 됩니다.  그리고 마지막에 intercept(b, 편향)를 더해주는 것으로 수식이 완성됩니다.

1.2. Logistic Regression

Logistic Regression은 Linear Regression과 거의 같지만, 마지막에 시그모이드 함수($\sigma$)를 이용해 값의 범위를 0에서 1사이로 줄여주는 작업이 추가로 수행됩니다.

$$\sigma(w_1x_1+w_2x_2+...+b)=\sigma(z)={1\over1-e^{-z}}$$

범위를 0에서 1사이로 줄여주는 이유는 분류 문제에 적용하기 위함입니다. 만약 이진분류 문제를 풀고자 한다면 기존의 Linear Regression으로는 예측이 어렵습니다. 하지만 Logistic Regression은 출력값이 0에서 1사이이므로 0 또는 1로 분류 예측을 하는 것이 가능합니다.

2. 손실함수

손실 함수는 모델이 예측한 값과 실제 값의 차이를 계산하는 함수로, 현재 모델이 얼마나 데이터를 잘 나타내고 있는지를 평가하기 위한 지표입니다. 손실값이 작아질수록 모델의 성능이 좋고, 손실값이 커질수록 모델의 성능이 좋지 않다는 것을 직관적으로 확인할 수 있으며, 모델이 데이터를 표현하기 위한 적절한 파라미터(w와 b)를 예측하는데도 도움을 줍니다.

2.1. Linear Regression

scikit-learn에서 사용하는 Linear Regression의 손실 함수는 Mean Squared Error(MSE)입니다.

$$Loss={1\over n}\sum^n_{i=1}(y_i-\hat{y}_i)^2$$

제곱을 사용하는 이유는 실제값과 예측값이 얼마나 차이나는지를 음수, 양수와 관계없이 절대적인 양을 나타내기 위함입니다.

2.2. Logistic Regression

Logistic Regression은 Cross entropy loss를 사용합니다.

$$Loss=-{1\over n}\sum^n_{i=1}[y_i\text{log}(\hat{y}_i)+(1-y_i)\text{log}(1-\hat{y}_i)]$$

수식이 복잡해 보이지만 사실 간단합니다.

 

만약 실제 값 y=1일 경우, 손실값은 $-\text{log}\hat{y}$로 예측값 $\hat{y}$가 1일 때 손실이 0으로 최소화 되게 됩니다.

 

만약 실제 값 y=0일 경우, 손실값은 $-\text{log}(1-\hat{y})$로 예측값 $\hat{y}$가 0일 때 손실이 0으로 최소화 되게 됩니다.

 

즉, 실제값과 예측값이 일치할수록 손실이 작아지는 이진 분류에 매우 합리적인 손실 함수라고 볼 수 있습니다.

3. 학습 방법

3.1. Linear Regression의 학습 방법

Linear Regression의 손실함수는 이차함수의 형태를 띄고 있습니다. 즉, 아래와 같이 그려볼 수 있겠죠. (편의를 위해 편향 b는 잠시 고려하지 않도록 하겠습니다.)

MSE의 손실함수 그래프

가장 좋은 기울기 $w$는 손실 함수를 최소화하게 될것입니다. 위 손실함수 그래프에서 손실이 최소화되는 지점은 그래프의 맨 아래 부분이죠? 그리고 이 부분의 기울기는 0일 겁니다.

즉, 손실이 최소화되는 지점을 찾는다는 말은, 손실함수의 도함수를 0으로 만드는 파라미터 $w$를 찾는 것과 같다고 말할 수 있습니다. (이는 $b$도 마찬가지입니다.)

 

이를 수식으로 살펴보도록 하겠습니다!

우선 손실 함수부터 다시 봐보도록 하죠. (미분을 편하게 하기위해 분모에 2를 추가로 곱해줬습니다.)

$$Loss={1\over 2n}\sum^n_{i=1}(y_i-\hat{y}_i)^2$$

$\hat{y}$는 $wx$로 나타낼 수 있습니다.

$$Loss={1\over 2n}\sum^n_{i=1}(y_i-wx_i)^2$$

이 때, 입력되는 n개의 입력 데이터셋 $x$들을 행렬 $X$로 쓰면 아래와 같이 행렬 연산으로 간단히 쓸 수 있습니다.

$$Loss={1\over 2n}(y-wX)^T(y-wX)$$

이를 $w$에 대해 편미분을 수행하면 아래와 같이 쓸 수 있습니다.

$${\delta L\over \delta\beta}={1\over n}X^T(wX-y)$$

아까 말했듯, 손실이 최소화되는 지점을 찾는다는 말은, 이 도함수를 0으로 만드는 $w$를 찾는 것과 같다고 했습니다.

$${1\over n}X^T(wX-y)=0$$

이 수식을 정리하면,

$$X^TX\beta=X^Ty$$

즉, 위 수식 계산 하나로 Linear Regression에서 올바른 w를 간단히 찾을 수 있습니다.

 

이는 편향($b$)를 추가하더라도 마찬가지입니다. 편향을 계산하는 방법은 행렬 $X=[x_1,x_2,...,x_n]$에 1을 추가하는 것입니다.

$$X=[1, x_1, x_2, ... ,x_n]$$

이렇게 처리한다면 위에서 살펴 본 수식을 그대로 사용하면서도 편향까지 함께 계산이 가능합니다.

 

그러나, 이 방법의 문제는 데이터의 수가 너무 많을 경우 계산량이 많아진다는 것입니다. 따라서 이 계산량을 감당하기 힘든 경우에는 학습을 나눠서 수행해야 합니다. 이런 방법의 일종으로 Stochastic Gradient Descent(SGD)가 있습니다. SGD는 데이터 전체를 계산하는 것이 아니라 데이터 샘플 하나마다 gradient step을 수행하여 여러번에 걸쳐 적절한 파라미터 $w$와 $b$를 찾아갑니다.

 

각 gradient step은 아래와 같이 수행됩니다.

$$w_{new}=w_{old}-\alpha{\delta L\over\delta w}$$

손실함수를 파라미터 $w$에 대해 편미분하는 것은 똑같지만, 이를 각 데이터 샘플마다 반복하여 적절한 파라미터를 찾아나가게 됩니다. 여기서 $\alpha$는 학습률로 클수록 $w$의 값이 크게 변화하고, 작을수록 $w$의 값이 작게 변화합니다.

학습률이 너무 크면 최적의 $w$ 근처로 더 빨리 갈 수도 있지만, 오히려 너무 커서 수렴을 방해할 수도 있습니다. 만약 학습률이 너무 작으면 수렴이 너무 느려지는 문제가 발생할 수도 있죠. 따라서 적절한 학습률을 찾는 것도 중요합니다.

3.2. Logistic Regression의 학습방법

Logistic Regression의 경우 scikit learn에서는 solver라는 파라미터로 적절한 해 $w$와 $b$를 찾는 방법을 결정할 수 있습니다. 이 solver들을 자세히 살펴보면 복잡하기 때문에 대략적인 흐름에 대해서 간단히 알아보고 가겠습니다. (이 방법들을 전부 완전히 익히려고 너무 노력하지 않으셔도 됩니다.)

A. sag, saga

이 방법은 앞서 살펴본 LinearRegressor와 SGDRegressor의 절충안으로 볼 수 있습니다.

SAG는 Sthocastic Average Gradient Descent의 약자로 아래와 같은 절차를 통해 학습을 수행합니다.

 

  1. 첫번째 step에서는 전체 데이터에 대한 gradient를 계산한 뒤, 그 평균 값을 이용해 파라미터 업데이트를 한다.
  2. 다음 step부터는 하나의 샘플에 대한 gradient만을 계산한다. 그리고 나머지 샘플들의 gradient는 앞서 계산했던 전체 gradient의 평균이라고 가정하여, 이 둘의 평균값을 이용해 파라미터를 업데이트한다.

전체 데이터의 gradient를 계산하는 것은 오래 걸리기 때문에 첫번째 gradient step에서만 전체 데이터에 대한 gradient를 계산한 뒤, 그 다음부터는 하나의 샘플만 gradient를 재계산하는 식으로 메모리를 아낄 수 있습니다.

 

SAG의 장점은 큰 데이터셋에 대해 SGD보다 해를 찾는 과정(수렴)이 빠르다는 것입니다. 하지만 전체 gradient를 저장해야 하기 때문에 LinearRegressor와 마찬가지로 메모리 문제가 발생할 수 있습니다. 또한 Logistic Regression에서도 과적합이 일어나지 않도록 하는 규제를 적용할 수 있는데, SAG는 L2 penalty만 사용할 수 있다는 단점도 존재한다고 합니다.

 

SAGA는 SAG를 약간 개선한 방법입니다. SAG는 두번째 step부터 새로 계산한 하나의 샘플 gradient와, 기존의 전체 샘플의 gradient를 모두 같은 비율로 계산하지만, SAGA는 하나의 샘플 gradient가 훨씬 큰 비율을 갖도록 하여 $w$의 값이 더 크게 변할 수 있도록 개선한 방법입니다. 또, SAG가 L2 penalty만 사용가능하다는 단점을 개선해 L1 penalty도 사용 가능하도록 했다고 합니다.

 

SAGA는 SAG의 개선버전인 만큼, SAG보다 대체로 안정적이고 빠른 속도를 보이지만, 근본적으로는 SAG와 계산과정이 거의 동일하기 때문에 역시 데이터셋이 많아질 경우 메모리 문제가 발생할 수 있다는 단점은 동일하게 가져갑니다.

B. liblinear

liblinear는 SAGA와 달리 배치 단위의 학습을 수행합니다. 배치 단위란, 데이터를 n개의 배치로 나눠서 gradient step을 수행하는 것입니다. 따라서 SGDRegression보다 빠르게 학습할 수 있으면서도 LinearRegression보다 메모리를 아끼며 효율적으로 학습할 수 있습니다.

liblinear의 또 다른 특징은 파라미터를 하나씩 순차적으로 업데이트 하는 좌표하강법을 사용한다는 것입니다. 선형함수는 feature의 수에 따라서 파라미터의 수도 늘어납니다.

$$\hat{y}=w_1x_1+w_2x_2+...w_nx_n$$

앞의 sag, saga의 경우 이 파라미터들을 모두 gradient step 한번에 업데이트하지만, liblinear는 한번의 step에 하나의 파라미터만 업데이트 합니다. 그렇기 때문에 계산량을 줄일 수 있으며, 메모리도 아낄 수 있습니다. 특히, 작은 데이터셋에 대해 안정적으로 작동할 수 있습니다. 물론 반대로, 큰 데이터셋에 대해서는 수렴 속도가 느리다는 단점이 있습니다.

C. newton-cg

newton-cg도 데이터를 잘 나타낼 수 있는 파라미터를 찾는 과정을 거치지만 손실함수를 미분했던 sag, saga와 달리 Taylor aprroximation을 이용해 해를 찾습니다.

올바른 해 $w$를 찾기 위해선, 가정했던 $w_k$에 어느 정도 양의 값($t$)을 더해서 더 나은 파라미터 $x_{k+1}$을 찾을 수 있는지를 찾는 것이 이 방식의 요점입니다. Taylor approximation을 이용해 이를 수식으로 정리해 보자면 아래와 같이 쓸 수 있습니다.

$$f(w_k+t)\approx f(w_k)+f'(w_k)t+{1\over2}f''(w_k)t^2$$

newton-cg도 위 함수의 도함수가 0이 되는 지점을 찾습니다. 위 함수의 도함수가 0이되는 것을 수식으로 정리해 보면,

$${\delta\over\delta t}f(w_k+t)=f'(w_k)t+f''(w_k)$$

위 수식을 이용해 $t$를 계산하면,

$$t=-{f'(w_k)\over f''(w_k)}$$

따라서, 더 나은 해 $x_{k+1}$은,

$$x_{k+1}=x_k-{f'(x_k)\over f''(x_k)}$$

로 계산할 수 있게 됩니다.

 

이차도함수를 계산하는 과정은 헤시안 행렬이라는 이차도함수들을 원소로 갖는 행렬을 사용해 한번에 계산이 가능합니다.

newton-cg는 Gradient Descent 방식에 비해서 수렴 속도가 빠릅니다. 하지만 이차도함수를 계산하는 과정이 복잡하고 느리기 때문에 학습이 느리고 메모리 요구량도 높다는 단점이 있습니다.

D. lbfgs

lbfgs는 newton-cg를 개선한 방법입니다. newton-cg의 경우, 각 $w$마다 이차 편미분을 계산해야 하는 단점을 갖고 있었습니다. lbfgs는 이차편미분을 다 계산하지 않고 근사를 통해 유사한 값으로 대체하여 사용합니다. 이차도함수를 모두 계산하지 않기 때문에 계산 속도가 빨라지겠죠? 게다가 newton-cg보다 메모리 사용량도 줄여준다고 합니다.

 

따라서 newton-cg보다 훨씬 빠르고 메모리도 적게 듭니다. 하지만 적절한 규제를 가하지 않으면 올바른 해를 찾기 힘들 수도 있다는 단점을 갖습니다.

E. 총정리

많이 길었죠.. 어렵고 기억에 남기도 힘들 것 같습니다. 그래서 하나의 표로 정리해서 간단히 한번 살펴보겠습니다.

  saga liblinear newton-cg lbfgs
기반 알고리즘 Gradient descent Gradient descent newton newton
특징 전체 gradient를 계산한 뒤, 평균값을 사용해 다음 gradient step부터는 하나의 샘플에 대해서만 gradient를 계산함. 배치 경사 하강법을 사용.
좌표 하강법을 사용해 파라미터를 하나씩 최적화함.
Taylor approximation 기반으로 최적의 해를 찾음.
이차도함수를 계산해야 함.
근사를 이용해 모든 이차도함수를 계산하지 않아도 되는 newton-cg의 개선된 버전.
장점 대규모 데이터셋에서 효율적임. 작은 데이터셋에서 수렴이 빠름. Gradient Descent 방식에 비해 수렴 속도가 빠름. newton-cg보다 메모리 사용량이 적고, 수렴 속도가 빠름.
단점 소규모 데이터셋에선 성능이 떨어질 수 있음. 대규모 데이터셋에서 수렴이 느릴 수 있음. 계산 비용이 높아 큰 데이터셋에서는 느릴 수 있음. 완화는 됐지만 여전히 계산 비용이 큼.
규제 L1, L2 모두 사용 가능 L1만 사용 가능, 덤으로 규제가 무조건 필요함. L2만 사용 가능 L2만 사용 가능

크게 나누면 Gradient descent 기반의 방식과 newton 기반의 방식의 차이가 특히 큰데, 두 방식을 비교해보면 아래와 같습니다.

  Gradient Descent newton
미분 1차 도함수만 사용 2차 도함수 필요
수렴 속도 느림 빠름
계산 비용 작음
희소 데이터 잘 다룸 못 다룸
특징 안정적으로 학습이 가능하지만 학습률 선택이 중요함. 볼록하지 않은 형태의 함수나 이차도함수를 담는 Hessian 행렬이 특이행렬일 경우 문제 발생이 가능함.

희소 데이터란, feature에 0이 많이 포함된 데이터를 말합니다. Gradient descent 기반의 방식에서는 이런 데이터들의 항이 0이 되면서 무시하고 계산할 수 있습니다. 하지만 newton 기반 방식은 2차 도함수를 모든 파라미터에 대해 계산을 해야 하기 때문에 계산 비용이 불필요하게 커질 수 있습니다. 따라서 희소 데이터에 대해선 Gradient Descent 기반 방식이 newton 기반 방식보다 좋은 성능을 보일 수 있습니다.

 

그 외로 쉽게 요약하자면, 큰 데이터셋에 대해서는 Gradient descent 기반 방식이, 작은 데이터셋에 대해서는 newton 기반 방식이 적합하다고 볼 수 있습니다.

 

길게 설명했지만 결국엔 모델의 성능을 결정짓는 하이퍼 파라미터 중 하나로 생각할 수 있습니다. 그렇기 때문에 결국 대략적인 이론 배경을 알고 다양한 solver를 실험해 보면서 최적의 solver를 찾는 것이 중요합니다.

4. 학습 규제

학습을 안정적으로 하기 위해선 어느정도 규제를 가해 줄 필요가 있습니다. 특히, 훈련 데이터에 대해서만 잘 작동하고 실제 데이터에선 성능이 떨어지게 되는 과적합은 가장 주의해야 하는 문제 중 하나입니다. 이번 단에서는 학습 규제들에 대해 간단히 소개해 보도록 하겠습니다.

4.1. Early stopping

Early stopping은 모델이 과적합되기 전에 학습을 종료하는 방법입니다.

예를 들면, 훈련 데이터에 대한 손실은 계속 줄어들지만 검증 데이터에 대한 손실 더 이상 줄어들지 않는다면 모델이 과적합되고 있다는 뜻이므로 이 시점에 훈련을 종료합니다.

4.2.  L1, L2 Regularizer

L1, L2 Regularizer는 손실에 규제값을 더해주어 일부 weight들을 0으로 만들어 무시하도록 하여 모델이 좀 더 다양한 측면에서 데이터를 분석할 수 있도록 해주는 방법입니다.

 

예를 들어, 입력되는 특성이 A, B, C 세가지라고 할 때, 모델이 A 특성에만 크게 반응해 학습되고 있었다면, 규제를 통해 의도적으로 A의 weight를 0으로 만들어 B와 C 특성에도 좀 더 집중할 수 있도록 해주는 것입니다.

 

L1 regularizer는 손실값에 L1 norm을 더해줍니다.

$$\text{Loss}_{regularized}=\text{Loss}+{1\over\lambda}|W|$$

(여기서 $W$는 파라미터 값입니다.)

L1 Norm은 일부 파라미터를 0으로 만듭니다. 따라서 불필요한 feature가 많다고 생각되는 데이터에 적합한 규제입니다.

 

L2 regularizer는 손실값에 L2 norm을 더해줍니다.

$$\text{Loss}_{regularized}=\text{Loss}+{1\over\lambda}W^2$$

L2 Norm은 일부 파라미터를 0에 가깝게 줄여줍니다. 그렇기 때문에 feature들이 모두 필요하고, 과적합을 방지하고 싶다할 땐 L1보다 더 적합합니다.

5. 장단점

장점

  • 선형 함수를 사용해 간단하고 해석이 쉽습니다.
  • 활성화 함수로 인해 예측값의 확률을 출력할 수 있습니다.
  • 차원이 낮고 작은 데이터셋에서 좋은 성능을 보입니다.

단점

  • 비선형 데이터 처리가 불가능합니다.
  • 고차원 데이터에 약합니다.
  • 각 특성의 독립성을 가정하기 때문에 특성 간 상관관계가 높으면 계산이 불안정해지고 성능이 떨어질 수 있음.

6. Linear Regression과 Logistic Regression의 코드 구현

6.1. scikit-learn에서의 Linear Regression

https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LinearRegression.html

 

LinearRegression

Gallery examples: Principal Component Regression vs Partial Least Squares Regression Plot individual and voting regression predictions Comparing Linear Bayesian Regressors Logistic function Non-neg...

scikit-learn.org

 

https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.SGDRegressor.html

 

SGDRegressor

Gallery examples: Prediction Latency SGD: Penalties

scikit-learn.org

from sklearn.linear_model import SGDRegressor

clf = SGDRegressor(
    penalty='l2',
    alpha=0.0001,
    early_stoping=False,
)

clf.fit(train_x, train_y)

penalty : 'l1' 규제를 할 지, 'l2' 규제를 할 지를 결정합니다.

alpha : 학습률 $\alpha$를 지정합니다.

early_stopping : early_stopping을 사용할 지를 결정합니다. 만약 사용할 경우, .fit()할 때 임의로 training set에서 일정 비율을 validation set으로 만들어서 과적합 시작지점을 감지합니다.

 

그럼 alpha수치, penalty, early_stopping이 모델 성능에 어떤 영향을 미치는지 직접 실험을 통해 알아 보도록 하겠습니다!

 

https://colab.research.google.com/drive/1FUXt5tJtwsBop-H8wlpWir5DzVsygZhB?usp=sharing

 

Logistic Regression.ipynb

Colab notebook

colab.research.google.com

이번 실험에 사용할 데이터셋은 diabetes 데이터셋입니다. 이 데이터셋은 10개의 신체관련 수치들을 입력 받아 이 사람의 당뇨병 수치를 예측하는 회귀문제입니다.

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split


diabetes = load_diabetes()
diabetes_train_x, diabetes_test_x, diabetes_train_y, diabetes_test_y = train_test_split(diabetes.data, diabetes.target, test_size=0.2)

print(diabetes.data.shape)

 

우선 alpha 수치입니다.

alpha 수치에 따른 성능 변화 그래프. 작을수록 성능이 좋은 것.

그래프를 보면 alpha=0.01일 때 성능이 제일 좋은 것을 확인할 수 있습니다.

 

다음은 early_stopping을 적용해 보도록 하겠습니다.

early stopping을 적용하기 전과 후 비교 그래프(좌), early stopping을 적용하고 난 후의 alpha 수치에 따른 성능 그래프(우)

그래프를 보면 early_stopping을 적용한 모델이 성능이 훨씬 좋은 것을 알 수 있습니다. 적용하기 전엔 과적합이 일어나고 있었다는 뜻이겠죠. 이처럼 early_stopping은 매우 중요합니다!

 

다음은 penalty입니다. 'l1'과 'l2' penalty를 각각 적용해 보겠습니다.

l1 penalty를 적용한 점수(파랑)와 l2 penalty를 적용한 점수(주황)

결과를 보면 l2 penalty를 적용했을 때 더 좋은 성능이 나타나는 것을 알 수 있습니다.

 

정리하면, diabetes 데이터셋에 SGDRegressor를 쓴다면, (alpha=0.01, penalty='l2', early_stopping=True) 옵션을 줬을 때 성능이 제일 좋다는 것을 알 수 있었습니다!

 

이 결과는 다른 데이터셋에서도 똑같이 나타나는 것은 아닙니다. 그렇기 때문에 다른 데이터셋으로 실험을 할 때는 다시 3가지 요소를 바꿔가면서 가장 좋은 성능을 내는 파라미터를 찾는 것이 중요합니다.

6.2. scikit-learn에서의 Logistic Regression

https://colab.research.google.com/drive/1N8y-7B-5gbRAi83blxXeVNqRfk9we5ge?usp=sharing

 

Logistic Regression.ipynb

Colab notebook

colab.research.google.com

 

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(
    solver='lbfgs',
)

다양한 solver에 따른 성능 변화를 좀 더 자세히 알아보기 위해 서로 다른 크기의 3가지 데이터셋에 대해 실험해 보고 결과를 한 번 살펴보도록 하겠습니다.

 

  1. iris : 4개의 꽃잎 특성을 보고 어떤 꽃인지를 분류하는 문제입니다. 총 150개의 데이터 샘플을 담고 있습니다.
  2. breast cancer : 30개의 신체 특성을 보고 유방암일지 아닐지를 판별하는 문제입니다. 총 569개의 데이터 샘플을 담고 있습니다.
  3. digits : 8*8 크기의 이미지를 보고 0부터 9까지 숫자 중 어느 숫자일지를 분류하는 문제입니다. 총 1797개의 데이터 샘플을 담고 있습니다. 
  4. bigdata : sklearn의 make_classification 메소드를 이용해 임의로 만든 대규모 데이터셋입니다. 샘플의 수는 100,000개이며, 40개의 입력 feature가 존재하고 5개의 클래스로 분류해야 합니다.

(데이터셋의 크기는 iris < breast cancer < digits < bigdata 순입니다.)

 

우선 결과를 보면 아래와 같습니다.

성능의 경우 iris 데이터셋에서 liblinear의 점수가 좀 낮게 나타난 것을 제외하고는 전부 유사하게 나타났습니다.

학습 시간을 보면 bigdata를 제외하고는 모두 saga > liblinear > newton-cg > lbfgs 순으로 오래 걸렸습니다. bigdata에서는 liblinear가 saga보다 오래 걸렸는데, 파라미터를 하나씩 최적화하다보니 좀 더 복잡한 데이터에서 시간이 더 오래 걸린 것으로 보입니다.

하나 의외인 점은 bigdata와 같은 대규모 데이터셋에서는 newton 기반이 더 오래 걸릴 것으로 기대했지만, gradient descent 기법의 시간이 더 오래 걸렸다는 것입니다.

이런 결과가 나타난 이유를 정확히 파악하지는 못했지만 몇 가지 이유는 추측해 볼 수 있습니다.

  • bigdata 데이터셋이 생각보다 큰 데이터셋이 아니였을 수도 있다.
  • 규제와 같은 하이퍼 파라미터 조절을 하지 않아 gradient descent 방식이 최적의 학습 성능을 보이지 못했을 수도 있다.

이번 실험을 통해 예상했던 결과를 얻지는 못했지만 데이터셋에 따라 다양한 solver와 하이퍼 파라미터 조절이 학습에 다양한 영향을 미칠 수 있다는 것을 다시 알 수 있었습니다. 이번에 newton 기반 방식이 시간이 짧게 걸렸다고 해서 무조건 newton 기반 방식이 좋은 것도 아닙니다. 언제나 실험을 통해서 가장 좋은 solver를 찾아내는 것은 중요하고, 좋은 solver를 선택할 때나 나타난 실험 결과를 분석하는데 있어서도 이런 solver에 대한 배경 지식은 여전히 중요한 역할을 할 것입니다.

 

내용이 많이 길고 복잡해졌지만 중요한건 이런 이론을 전부 다 머릿속에 외우는 것보다는 어떤 느낌인지 한 번 훑어보고 가는 느낌을 보면 좋을 것 같습니다. 긴 길 읽어주셔서 감사하고 다른 머신러닝 기법들에 대해서도 알아보도록 하겠습니다.

 

1. KNN : https://all-the-meaning.tistory.com/65
2. Decision Tree : https://all-the-meaning.tistory.com/69
3. Random Forest : https://all-the-meaning.tistory.com/70
5. SVM : https://all-the-meaning.tistory.com/72
6. 머신러닝 총정리 : https://all-the-meaning.tistory.com/73