brunch

You can make anything
by writing

C.S.Lewis

by 박경아 Oct 18. 2022

8. 다항회귀 (Polynomial Reg.)

선형회귀 알고리즘에서는 무작정 피처를 많이 넣는 게 좋은 게 아니고 서로 상관관계가 높은 컬럼들은 제거하는 게 낫다는 다중공선성에 대해 알아보았다. 다른 피처 엔지니어링 없이 모든 컬럼들을 집어넣은 경우에 비해 다중공선성을 제거한 경우 훈련과 테스트 셋간 오버피팅이 해소되고 테스트 성능이 향상되었다. 


이번 글에서는 이와는 반대로 좀 더 복잡한(?) 선형회귀가 필요한 경우 사용할 수 있는 다항회귀에 대해 알아보도록 하자.



다항회귀(Polynomial Regression)란?


앞서 본 선형회귀는 독립변수가 하나이냐 여러 개냐의 차이지 기본적으로 독립변수와 종속변수의 관계는 선형을 가정한다. 그리고 데이터와 예측값의 차이인 오차합(MSE)이 가장 작은 방향으로 1차 함수의 가중치들을 찾아 선을 긋는다.


다항회귀는 독립변수들과 종속변수가 2차 함수 이상의 관계를 가지는 것으로 따라서 곡선이나 좀 더 복잡한 모양을 표현하는 것이 가능하다. 다만 다항회귀 역시 선형회귀로 간주되는 데 선형회귀의 정의가 단순히 직선이나 곡선과 같은 모양에 있는 것이 아니라 가중치과 독립변수의 선형결합 여부에 있기 때문이다. 아래 다항 회귀식에서 거듭제곱인 독립변수들을 X1, X2, X3..과 같은 변수로 대체하면 다중 선형회귀식과 같아지는 것을 알 수 있다.

다항회귀


다항회귀는 별도의 알고리즘이 있는 것이 아니라 독립변수를 제곱, 서로 곱한 값 등 좀 더 복잡한 값으로 만들어 선형회귀에 넣어 학습시키는 것을 말한다. 한 개의 독립변수와 종속변수가 아래와 같은 비선형 모양을 띈다면 단순히 독립변수를 선형회귀에 넣어 학습시킨 것보다 독립변수를 제곱해서 선형회귀에 입력하면 성능이 향상되는 것는 볼 수 있다. 


X를 넣은 경우 vs. X^2로 해서 넣은 경우



다항회귀 적용하기


독립변수와 종속변수가 곡선 또는 비선형 관계를 보인다면 변수들을 2차항 이상의 값으로 변환해 선형회귀의 성능 향상을 시도해 볼 수 있을 것이다. 


지난 번에 사용한 집값 예측(Housing Prices) 데이터셋을 가지고 다항회귀를 어떻게 사용할 수 있는 지 살펴보도록 하자. 이번에는 해당 데이터셋에 대해 데이터 분석을 통해 결측치를 채우고 이상치를 제거했으며 최종적으로 종속변수와 선형 관계를 띄고 상관지수가 높은 변수들을 선택해 선형회귀 모델을 적용했다.


최종적으로 선정된 8개 컬럼만 선형회귀에 넣었을 때 훈련 데이터의 R2 점수는 0.79이고, 테스트 데이터는 0.8로 훈련 데이터보다 테스트 셋의 성능이 나은 언더피팅(Underfitting)이 발생했다. 훈련 데이터의 점수가 낮은 경우 훈련 데이터가 적절히 학습되지 않습되지 않았다고 볼 수 있는데 이 경우 좀 더 복잡한 머신러닝 모델을 사용하거나 변수들을 좀 더 복잡한 값으로 만들어 학습시켜 볼 수 있다.


Baseline


그렇다면 변수들을 다항으로 만들어 좀 더 복잡한 값으로 학습시켜 보자. 사이킷런의 PolynomialFeatures라는 라이브러리를 사용하면 입력한 독립변수들을 다항으로 변환해준다. 변환하고 싶은 최대 차수를 degree 인수에 입력해 주면 그에 따라 변환된 값들이 나오는데 독립변수가 a와 b이고 2차로 변환하고자 한다면 1, a, b, a^2, ab, b^2와 같은 값들이 자동으로 생성된다. 


degree를 2차로 설정해 변환한 값들을 선형회귀 알고리즘에 입력하니 훈련 데이터의 R2는 0.85, 테스트 데이터의 R2는 0.82로 트레인과 테스트 셋 모두 성능이 향상되었다. 하지만 degree를 4로 설정하면 오히려 테스트 데이터에서 음수의 결과가 발생했는데 훈련 데이터에 아주(?) 피팅이 되었지만 오히려 테스트 데이터에 대한 예측은 완전히 빗나간 경우라 할 수 있겠다.

Polynomial Features


지금까지 진행한 내용을 아래 캐글 노트북에서 확인할 수 있다. Copy & Edit 버튼을 누르고 복사본을 생성하면 직접 코드를 실행해 볼 수 있다.



다항회귀에 규제를 가하는 방법


다항회귀로 만들었을 때 훈련 데이터와 테스트 데이터의 성능이 모두 향상되었지만 훈련 데이터이 성능이 다소 높은 오버피팅이라고 볼 수 있다. 오버피팅은 훈련 데이터가 테스트 데이터 성능보다 나은 경우를 말하는 데 어느 정도까지가 괜찮은 지는 상황에 따라 다를 수 있지만 이 차이가 크면 클수록 테스트 혹은 실제 서비스에서 기대할 수 있는 성능이 떨어진다고 생각할 수 있으므로 역시 크지 않는 게 좋을 것이다. 


그럼 마지막으로  PolynomialFeatures로 다항으로 변환한 값을 선형회귀에 규제를 가한 알고리즘이라 할 수 있는 라쏘(Lasso), 릿지(Ridge)와 같은 알고리즘에 넣어보자. 라쏘, 릿지 역시 기본적으로는 MSE를 최소화하는 방향으로 가중치와 편향을 찾되 가중치들의 절대값의 합이 최소가 되게 조건를 추가한 것이 라쏘이고, 가중치들의 제곱한 값이 최소가 되는 조건을 추가한 것이 릿지이다. 둘 다 손실함수에 가중치의 크기에 따른 패널티를 더함으로써 훈련 데이터에 오버피팅되는 것을 방지한 장치라 할 수 있다. 


릿지 알고리즘에 다항 피처들을 넣은 결과 훈련 R2 점수가 0.83, 테스트 R2 점수도 0.83으로 훈련과 테스트 성능이 비슷하게 나오는 것을 볼 수 있다. 


Ridge 알고리즘



* 더 읽어보면 좋은 자료

1. 앤드류 응의 머신러닝 (4-5):피처와 다항 회귀

2. 선형회귀(linear regression), 라쏘(LASSO), 리지(Ridge)

이전 07화 7. 다중공선성 (Multicollinearity)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari