Artificial Intelligence/Machine Learning

[Machine Learning] Linear Regression_Part 2

Luna Oculta 2023. 9. 12. 23:29

 

import matplotlib.pyplot as plt
plt.plot(ridge.coef_, 's', label='Ridge alpha=1')
plt.plot(ridge10.coef_, '^', label='Ridge alpha=10')
plt.plot(ridge01.coef_, 'v', label='Ridge alpha=0.1')

plt.plot(lr.coef_, 'o', label='LinearRegression')
plt.hlines(0, 0, len(lr.coef_))
plt.ylim(-25, 25)
plt.legend()

해당 그래프를 보면 규제에 대해서 더 직관적으로 볼 수 있다. 릿지 회귀에서 alpha의 값이 작을수록 규제를 적게 한다고 이야기 하였다. 하지만 훈련 세트와 테스트 세트에 대한 결과 값을 보았을 때 규제 값을 0.1로 했을 때가 규제 값을 1이나 10으로 했을 때보다 더 좋은 결과값을 낸다는 것을 볼 수 있다. 하지만 해당 그래프를 보면 알 수 있듯이 규제 값이 0.1인 경우 계수 값들이 한곳에 모여있는 것이 아니라 고루 퍼져있는 것을 볼 수 있다. 그에 반해 규제가 10인 경우에는 특정 값 주위 즉 -3부터 3 사이에 분포하고 있다는 것을 볼 수 있다. 규제 값이 0.1로 할 때 더 좋은 점수가 나오더라도 규제를 더 많이 할수록 해당 값에 수렴하기 때문에 규제를 조금만 주는 것 보다 적당한 값으로 규제 값을 정하는 것이 좋다.

규제가 해당 모델에 어떠한 영향을 미치는지 알기 위한 다른 방법이 있다. 다음 그래프를 보면 모든 데이터 양에 대하여 릿지 회귀와 선형 회귀 둘 다 훈련 점수가 테스트 점수보다 높은 것을 볼 수 있다. 왜냐하면 릿지는 규제되어있고,  릿지의 훈련 점수는 선형 회귀에서의 훈련 점수보다 낮을 수 밖에 없다. 그러나 테스트 점수 부분에서는 릿지가 더 좋은 모습을 보여준다. 특히 데이터가 작을 수록 말이다. 400 데이터 이하의 경우 선형회귀는 아무것도 배울 수 없다. 두 모델 다 더 많은 데이터가 있을 때 향상되긴 하고, 결국 선형회귀 모델의 테스트 셋 점수가 릿지회귀 모델의 테스트 셋 점수를 따라 잡는다. 이곳에서의 중심은 충분한 훈련데이터가 존재한다면 규제는 중요하지 않게 되고, 충분한 데이터가 존재한다면 릿지와 선형회귀 모델 둘다 같은 성능을 가질 것이라는 이야기이다. 

 

<Lasso Regression>

릿지 회귀에 대한 대안으로 선형 회귀 모델을 정규화 하는 과정이 바로 라쏘 회귀이다. 릿지 회귀에서와 같이 라쏘 회귀 또한 계수가 0에 가까워지도록 규제를 가한다. 하지만 조금은 다른 L1 규제 방식으로 규제를 가한다. 라쏘 회귀를 사용할 때 L1 규제에 대한 결과는 거의 계수가 0이 된다는 것이다. 이 말의 뜻은 몇몇의 특징 데이터는 거의 모델에서 무시된다는 것이다. 계수를 0에 가깝게 만드는 것은 모델의 y값을 쉽게 구할 수 있게 만들고, 해당 모델에서 중요한 특징들을 드러나게 해준다.

from sklearn.linear_model import Lasso
lasso = Lasso().fit(train_input, train_target)
print('train score = {}\n'.format(lasso.score(train_input, train_target)))
print('test score = {}\n'.format(lasso.score(test_input, test_target)))
print('features used = {}\n'.format(sum(lasso.coef_ != 0)))
train score = 0.29323768991114607

test score = 0.20937503255272294

features used = 4

보다시피 라쏘는 훈련데이터와 테스트 데이터에 대하여 매우 나쁜 결과값을 반환한다. 이것은 과소적합 되었다는 것을 암시하는데, 105개의 특성 데이터 중에서 단 4개의 특성데이터가 사용되었다는 것을 알 수 있다. 릿지 회귀와 유사하게 라쏘 회귀 또한 alpha라는 매개변수로 규제를 가한다. alpha는 계수를 0으로 만들기 위해서 강하게 밀어붙이곤 한다. 이전의 예시에서 우리는 alpha의 값을 1.0으로 사용했다. 과소적합을 줄이기 위해서 alpha의 값을 줄여보자. 이렇게 할때면 max_iter의 값을 올려주어야 한다. 

lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(train_input, train_target)
print('train score = {}\n'.format(lasso001.score(train_input, train_target)))
print('test score = {}\n'.format(lasso001.score(test_input, test_target)))
print('features used = {}\n'.format(sum(lasso001.coef_ != 0)))
train score = 0.8962226511086497

test score = 0.7656571174549982

features used = 33

 

 낮은 규제값은 훈련 데이터와 테스트 데이터를 더 복잡한 모델으로 훈련시키는 것을 허용한다. 그리고 릿지 회귀를 사용했을 대 보다 성능이 약간 상승하였고, 105개의 특성 중 33개의 특성을 사용한다. 만약 우리가 alpha의 값을 너무 낮게 설정하면 어떻게 될까. 우리가 릿지 회귀에서 보았듯이 낮은 alpha의 값은 선형 회귀에서와 마찬가지로 과적합이 진행된다.

lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(train_input, train_target)
print('train score = {}\n'.format(lasso00001.score(train_input, train_target)))
print('test score = {}\n'.format(lasso00001.score(test_input, test_target)))
print('features used = {}\n'.format(sum(lasso00001.coef_ != 0)))
train score = 0.9507158754515463

test score = 0.6437467421272821

features used = 96

  

다음 보기에서처럼 규제 값을 너무 낮추게 되면 선형 회귀 모델과 같이 과적합이 발생하므로 라쏘 회귀 또한 적정한 규제 값을 잘 선택해야 한다. 

plt.plot(lasso.coef_, 's', label='lasso alpha=1')
plt.plot(lasso001.coef_, '^', label='lasso alpha=0.01')
plt.plot(lasso00001.coef_, 'v', label='lasso alpha=0.0001')

plt.plot(ridge01.coef_, 'o', label='ridge alpha=0.1')
plt.legend(ncol=2, loc=(0, 1.05))
plt.ylim(-25, 25)

alpha의 값이 1일 때 계수의 대부분의 값이 0인 것을 볼 수 있다. 하지만 남아있는 계수들 조차도 0에 수렴하게 작은 값을 가진다. alpha의 값을 0.01로 줄이면 0에 거의 가깝게 적당한 값을 얻는다. 하지만 alpha의 값을 0.00001로 하게 되면 해당 모델이 규제화 되어 있지 않다고 생각되게 된다. 릿지 회귀에서 alpha 값을 0.1로 했을 경우와 라쏘 회귀에서 alpha 값을 0.01로 했을 경우 비슷한 수행 능력을 갖지만 한가지 차이점은 릿지 회귀에서는 계수가 0이 아니라는 점이다.

만약 우리가 많은 특성과 그중 중요한 몇가지 특성을 골라야 한다면 Lasso 회귀를 선택하는 것이 좋다. 하지만 릿지 회귀의 경우 먼저 사용한 후 해당 모델이 부적합할 경우에 라쏘 회귀로 넘어가는 경우가 많다.