선형 회귀

버터링학살자·2022년 2월 5일
0
post-thumbnail

선형 회귀 (Linear Regression)

y=xw+b

선형 회귀는 하나 이상의 input 값(독립변수 X)들과 output(종속변수 y)의 관계를 선형적으로 모델링하는 회귀 분석 방법이다.

선형적으로 모델링하는 것이란 아래 식처럼 가중치 곱과 덧셈으로 표현한다는 의미이다.

즉, 선형 회귀 식에서 W(가중치 벡터)의 요소 하나하나가 구하려는 파라미터이다. 이 가중치는 오차의 제곱합의 최소가 되는 방향으로 구해진다.
w의 절댓값이 클수록 해당 피쳐가 타겟에 미치는 영향은 커진다.



Regularization

Regularization은 한국어로는 정규화라고 하는데 보통 정규화를 한다고하면 Normalization도 한국어로는 정규화로 불려서 이와 같이 생각하는 경우가 많다.

  • Normalization : 데이터에 scale을 조정하는 작업
  • Regularization : predict function에 복잡도를 조정하는 작업

Linear Regression에는 회귀 계수들에 제약을 가해 일반화의 성능을 높이기 위해 Regularization 기법을 사용한다.

실제 데이터와 예측 데이터 간의 오차는 모델의 Bias와 Variance로 분해하여 볼 수 있다.
Regularization은 모델의 Variance를 감소시켜 일반화의 성능을 높인다.
(Bias와 Variance에 대한 설명은 아래 참조)


bias 와 variance

Bias는 지나치게 단순한 모델로 인한 error이다.
Bias가 크면 과소 적합(under-fitting)을 야기한다.
모델에 편향이 크다는 것은 그 모델이 뭔가 중요한 요소를 놓치고 있다는 뜻이다.

variance은 지나치게 복잡한 모델로 인한 error이다.
variance가 크면 과대 적합(Over-fitting)을 야기한다.
분산이 큰 모델은 훈련 데이터에 지나치게 적합을 시켜 일반화가 되지 않았다는 뜻이다.

왼쪽 그래프가 오른쪽 그래프보다 오차(실제값과 예측값의 차이)가 더 크다.
오른쪽 그래프는 오차가 0이다. ➡ Bias가 0이라는 의미

왼쪽 그래프는 일반화가 잘 되어 있기 때문에 예측 값이 일정한 패턴을 나타내는 반면에 오른쪽 그래프는 요동치고 있다.(일정한 패턴이 없다.)
즉, 왼쪽 그래프는 Variance가 작고, 오른쪽 그래프는 Variance가 크다.

따라서 Overfitting의 경우 variance가 크고 Bias가 작다.


릿지 회귀 (Lidge) : L2 Constraint

기존 Loss에 패널티(계수의 제곱)를 더해줌으로써 Cost가 커지게 된다. ➡ Cost가 크다면 Weight의 중요도가 줄어든다.

또한 계수의 제곱을 더해주기 때문에 어떤 계수가 덜 중요하더라도 완전히 0으로 수렴하지 않는다.

L2 제약식은 모든 가중치를 균등하게 작게 유지하려고 한다.

라소 회귀 (Lasso) : L1 Constraint

Lasso는 Loss에 각 계수의 절댓값의 합을 패널티로 더해준다. 따라서 릿지와 달리 덜 중요한 계수들은 0으로 수렴할 수 있다.

L1 제약식은 가중치가 작은 값은 0으로 만들어 버려 sparse vector가 되는 경향이 있다.

즉, 릿지(L2)는 일반적으로 학습을 할 때 이용하며, 라소(L1)는 Feature Selection을 할 때 이용한다.


그래프로 살펴보면 직관적으로 이해하는데 도움이 된다.

패널티로 더해주는 값이 빨간색 원과 마름모이다.
파란 가운데 점이 최적값이지만, 제약 조건에 따라 빨간 도형과 맞닿으면서도 오차가 최소가 되는 파란 원형 궤적의 값을 선택하게 된다.

Lasso의 경우 마름모 형태이기 때문에 등고선이 뾰족한 부분에 닿아 일부 weight는 0이 될 수 있다는 것을 직관적으로 파악할 수 있다.


엘라스틱 넷

엘라스틱 넷(Elastic net)은 릿지와 라쏘의 하이브리드 형태이다.

α 를 통해 릿지와 라쏘 제약식의 비율을 조절이 가능하다.

code

### 선형 회귀 분석 ###
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)

# 선형 회귀 분석 계수 확인
print(lr.coef_)

# 선형 회귀 분석 상수항 확인
print(lr.intercept_)

### 릿지 회귀 분석- L2 ###
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1)
ridge.fit(X_train, y_train)

# 릿지 회귀 분석 계수, 상수항 확인
print(ridge.coef_)
print(ridge.intercept_)

### 라쏘 회귀 분석- L1 ###
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01)
lasso.fit(X_train, y_train)

# 라쏘 회귀 분석 계수, 상수항 확인
print(lasso.coef_)
print(lasso.intercept_)

### 엘라스틱 넷 ###
from sklearn.linear_model import ElasticNet
elastic = ElasticNet(alpha=0.01, l1_ratio=0.01) #l1_ration가 0이면 L2만 적용/ l1_ratio가 1이면 L1만 적용
elastic.fit(X_train, y_train)

pred_lr = lr.predict(X_test)
pred_ridge = ridge.predict(X_test)
pred_lasso = lasso.predict(X_test)
pred_elastic = elastic.predict(X_test)

# r2 score
from sklearn.metrics import r2_score
print(r2_score(y_test, pred_lr)
# MSE
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, pred_lr))

0개의 댓글