본문 바로가기

AI 머신러닝, 딥러닝

[머신러닝] 지도학습 / 당뇨 데이터로 다중 선형회귀, 다항회귀 하기 (multiple linear regression, polynomial regression)

꾸준히 하면, 언젠가는 실력이 나아져 있지 않을까 ?

이번 포스팅에서는 당뇨 데이터로 다중 선형회귀와 다항회귀를 해보도록 하겠습니다. 

 

[다중 선형회귀란?]  

 

  • 다중 선형회귀 = 하나의 입력 변수가 아니라 여러개의 입력 변수를 사용해서 목표 변수를 예측하는 알고리즘 
  • simple linerar regression 단순 선형회귀에서의 가설함수 : y = mx + b 
  • multiple linear regression 다중 선형회귀에서의 가설함수 : y = theta0 + theta1 * x1 + theta2 * x2 ... + thetan * xn 
  • 다중 선형회귀의 목적 : theta값을 조정해서 데이터에 가장 잘 맞는 가설함수를 찾는 것이 목적 
  • 역시나 손실함수의 값이 최소화되도록 theta값을 조정한다. 다중 선형회귀 

다중 선형회귀의 방법은, y=mx+ b 가설함수의 선형회귀 하는 방법과 거의 같다. 

오늘 활용할 diabetes 데이터는,  나이, 성별, bmi등에 따른 당뇨 수치를 나타내는 데이터이다. 

역시나, 'data'가 입력변수(나이, 성별, bmi, 혈전 종류 등)가 되고, 'target'이 당뇨 수치인 목표변수가 된다.  

속성과 타겟을 보기 좋게 정리하면 다음과 같다. 

이후에는, 선형회귀에서 배웠던 방법 그대로, 데이터 분리 / 선형회귀하기의 과정을 거치면 된다. 

다중 선형회귀는 하나의 목표 변수에 영향을 미치는 입력변수가 많기 때문에, 

일전에 배웠던 plt.plot()으로는 그래프를 그리지 못한다. 

다중 선형회귀 및 다항회귀 그래프 그리는 법은 추후에 다시 포스팅하도록 하겠다. 

 

다음으로는 다항회귀이다. 

 

[다항회귀란? polynomial regression]

  • 데이터들을 가장 잘 나타내는 선이 직선이 아닐 수 있다. ex) 기업의 성장단계- J 커브, 주택 전기요금 
  • 가설함수를 곡선으로 바꿔주려면,  가설 함수의 차수를 늘려주면 된다. 이차 함수와 삼차함수의 굴곡을 생각해봐라. 
  • 함수의 차수가 높을 수록 굴곡이 많은 곡선, 우리가 데이터를 보고 적합할 것 같은 모양을 골라주면 된다. 
  • sklearn.preprocessing의 PolynomialFeatures 모듈을 통해서, 가설함수의 차수를 변경시킬 수 있다. 
  • x^2, x^3을 밑에 있는 x2, x3처럼 취급해주면 된다. 가상의 열을 추가해서  속성을 제곱한 값, 세 제곱한 값을 넣고 입력변수가 여러개 인것처럼 취급해주면 된다  => 다항식으로 만든 후, 다중 선형회귀처럼 취급한다. 
  • 데이터의 특성을 잘 보여주면서도, 적절한 차수를 결정하는 것이 중요하다. 

 

Polynomial Regression Data Fit에서 각 차수 별 그래프 모양을 볼 수 있다. 

<과소적합의 예>

 

위 그래프는 과소적합의 예이다. 그래프가 어느 정도 데이터를 표현하기는하지만, 충분하지 않게 적합해 있다. 

이런 경우 차수를 늘려서 좀 더 적합한 그래프를 만들어 주는게 좋다. 

 

<과대적합의 예>

위 그래프는 과대 적합의 예이다. 이 그래프는 훈련 데이터에 대해서는 100% 정확도가 있지만, 일반화하기에는 절대 불가능하다. 실제 데이터와의 오류가 너무 크기때문이다. 

이번에도 당뇨데이터를 활용해보도록 하겠다. 

전처리 하기 전의 당뇨 수치 예측 데이터는 10개의 속성을 가지고 있다. 

데이터 전처리란 분석에 적합하게 데이터를 가공해주는 것을 말한다. 

우리는 일차식으로만 이루어진 속성을 다항식의 데이터로 변형시켜 줄것이다. 

우선 PolynomialFetures모듈을 불러와 n차식을 만들어준다. 

그리고 이 n차식을 poly라는 변수에 저장해준다. 

이 n차식에 fit_transform(X), X를 넣어서 다항식의 데이터로 가공해준다. 

 

가공한 데이터를 다시 데이터 프레임으로 바꿔주면 다음과 같다. 

PolynomailFeatures(degree = n ).get_features_names_out()을 통해서 새로운 다항식의 속성값을 구할 수 있다. 

지금부터는 다중 선형회귀처럼 취급해주면 된다! 

훈련데이터와 테스트 데이터 분리하고, 선형회귀 해주기~ 

단순 선형회귀, 다중 선형회귀와 같은 방법으로 처리해주면 된다. 

 

모델의 성능을 측정해보면 다음과 같다. 

2차항까지는 다중 선형회귀와 성능이 비슷하다가 4차항까지 가면 성능이 1, 즉 100%에 도달하는 모습을 보인다. 

다항회귀는 이렇듯, 복잡한 고차식에 데이터를 맞출 수 있다는 장점이 있다. 

또한, 다항회귀는 속성사이의 복잡한 관계를 프로그램에 학습시킬 수 있다. 

예를 들어, 집 값에 영향을 미치는 변수로 높이와 너비가 있다고 가정해보자. 단순 선형회귀를 활용하면 집의 높이와 집의 넓이의 변수가 독립적이기 때문에, "높이와 너비가 같이 커야지만 집 값도 커진다."는 관계를 학습할 수 없음. 하지만, 높이와 너비를 곱한 것을 속성으로 차항을 높여주면, 속성 사이에 있는 복잡한 관계를 프로그램에 학습시킬 수 있다. 

 

 

블로그 정리를 시작하면서, 그동안 내 공부의 문제점을 파악한 기분... 

지금부터라도 하면 되지 ~ 다음 포스팅에서는 지도 학습의 마지막인 로지스틱 회귀에 대해서 다뤄보려고 한다. ㅇ