본문 바로가기
Book Review/[혼공머신] 리뷰

기본적인 회귀 알고리즘: 선형회귀, 다항회귀

by 3n952 2022. 12. 7.

앞선 포스팅에서 지도학습이 무엇인지 확인했습니다.

지도학습에는 대표적으로 회귀, 분류와 같은 문제에 적용되어 해결책을 제시해줍니다.

그렇다면 회귀에는 어떠한 종류가 있을까요?

 

다양한 종류가 있지만  이번 포스팅에서는 이해하기 쉽고, 기본이 되는

선형회귀와 다항회귀에 대해 알아보겠습니다.

 


1.선형회귀

우선, 선형회귀는 말 그대로 선형의 형태의 학습 알고리즘으로 값을 예측하는 것입니다.

즉, 선형회귀는 특성과 타깃 사이의 관계를 가장 잘 나타내는 선형 방정식을 찾는 것을 의미합니다.

 

일차 방정식의 형태는 특성이 하나인 경우에 적합합니다.

일차 방정식의 직선은 하나의 특성을 잘 표현하는 형태로 나타나야 학습도 잘 이뤄졌다고 할 수 있겠습니다.

수학시간에 배운 일차방정식을 생각해보세요.

y = ax + b 꼴의 직선을 생각해보면, x가 특성이 될 것입니다.

x데이터에 대해서 y를 잘 설명할 수 있는 a, b값을 찾는 것이 선형회귀의 궁극적인 목표입니다!

 

그림1) 데이터를 잘 설명하는 직선

 

그림1을 보면 데이터를 잘 설명하는 직선이 무엇인지 시각적으로 파악할 수 있습니다.

3번 직선이 데이터를 가장 잘 설명해주는 직선이겠네요.

 

선형회귀를 코드로 구현하기 위해서는 사이킷런의 sklearn.linear_model 패키지의 LinearRegression클래스를 임포트 해줘야 합니다.

클래스의 객체를 만들어서 구현해야 합니다.

fit()을 통해 학습을 하고, score()로 모델 검증, predict()로 새로운 데이터의 예측값을 확인할 수 있습니다.

간단한 코드로 예를 들어보겠습니다.

from sklearn.linear_model import LinearRegression #패키지 임포트
lr = LinearRegression() #선형회귀 클래스 객체 생성

#선형회귀 훈련
lr.fit(train_input, train_target)

#선형회귀 모델 성능 측정
lr.score(train_input, train_target) #훈련데이터로 측정
lr.score(test_input, test_target) #테스트데이터로 측정

#새로운값 예측
lr.predict(new_input)

 

여기서 train_input등과 같은 데이터 변수명은 제가 지어낸 것으로 사용자에 맞는 변수를 만들어 적용하면 학습이 이뤄집니다.

또한 추가적으로 알아두면 좋은 것은 객체를 만들면 객체에 coef_와 intercept_속성에 그 값이 들어있다는 것입니다.

y = ax + b의 선형 방정식에서 coef_는 a를 의미(기울기)하고, intercept_는 b를 의미(절편)합니다.

코드로 확인하고 싶으면 다음과 같습니다.

print(lr.coef_, lr.intercept_)

 

 

 

2.다항회귀

선형회귀는 간단하지만 꽤나 강력한 모델입니다. 하지만 단순선형회귀는 직선 형태의 학습이 이뤄지기 때문에 표현하지 못하는 데이터에 대해서 해결책을 제시해주지 못합니다.

실제 데이터에 대한 회귀는 직선의 형태로 표현되기보다 곡선의 형태로 표현되는 것이 현실적일 것입니다.

따라서 최적의 직선을 찾는 선형회귀보다 최적의 곡선을 찾는 다항회귀가 보다 적합할 때가 많습니다.

 

다항회귀는 하나의 특성(독립변수,x)이 다항으로 구성되는 회귀모델입니다.

여기서 주의할 점은 여러가지 특성에 대한 것이 아닌 하나의 특성에 대해 차수가 높아지는 형태로 구성된 비선형적인 모델이라는 것입니다.

식으로 표현하면 다음과 같습니다.

그림2) 다항식

 

 

다음 그래프와 같이 다항식으로 표현을 하면 직선으로 표현하지 못하는 한계를 어느정도 극복할 수 있습니다.

 

그림2-1) 다항식 그래프

 

다항회귀를 코드로 간단하게 구현해보겠습니다.

lr = LinearRegression()

lr.fit(train_input, train_target) #train_input에는 각 차수에 대한 값들이 있어야합니다.

lr.score(train_input, train_target)
lr.score(test_input, test_target)

lr.predict(new_input)

print(lr.coef_, lr.intercept_)

앞선 단순선형회귀의 코드와 주석을 참고하면 이해하기 편합니다.

 

 

이번 포스팅에서는 선형회귀에 대해 알아보고 코드로 어떻게 구현하는지 알아보았습니다.

선형회귀와 다항회귀를 통해 적절한 표현식을 찾고 값을 예측하는 것 선형회귀의 목표입니다!