코딩헤딩

[ML(머신러닝)] KNN 회귀모델 -5 <다항회귀모델(곡선)> 본문

머신러닝 | 딥러닝

[ML(머신러닝)] KNN 회귀모델 -5 <다항회귀모델(곡선)>

멈머이 2023. 12. 28. 22:39
728x90

<다항회귀모델>

  - 데이터의 분포가 선형이면서 곡선을 띄는 경우에 사용됨
  - 곡선(포물선)의 방정식이 적용되어 있음
  - y = (a * x^2) + (b * x) + c
  - 독립변수는 2개가 사용됨 : x와 x^2 값

 

* 훈련 및 테스트데이터의 독립변수에 x^2 값 추가하기

# - 훈련독립변수
train_poly = np.column_stack((train_input**2, train_input))

# - 테스트 독립변수
test_poly = np.column_stack((test_input**2, test_input))

train_poly.shape, test_poly.shape

결과 : ((42, 2), (14, 2))

 

* 모델 생성하기

# - 선형, 다항, 다중회귀모델은 하나의 모델(클래스) 사용
lr = LinearRegression()
lr

 

 - 직선, 곡선에 대한 구분은 독립변수의 갯수로 모델이 알아서 구분해 준다.

 

 

 

* 훈련시키기

lr.fit(train_poly, train_target)

 

- 훈련 및 테스트 검증하고, 과적합 여부 확인하기

 

 

 

 - 정확도 확인하기

train_r2 = lr.score(train_poly, train_target)

test_r2 = lr.score(test_poly, test_target)

train_r2, test_r2

결과 : (0.9706807451768623, 0.9775935108325121)

 - 훈련 < 검증 => 과소적합

 

 

* 임의값 50으로 예측하기

pred = lr.predict([[50**2, 50]])
pred

결과 : array([1573.98423528])

 

 

<추세선 그리기>

  - 추세선을 그리기 위해서는 곡선의 방정식에 사용할 계수 a, b와 절편 c를 알아야 한다.

print(f"계수 : {lr.coef_} / 절편 : {lr.intercept_}")

a = lr.coef_[0]
b = lr.coef_[1]
c = lr.intercept_
print(f"a : {a} / b: {b} / c : {c}")

결과 :
계수 : [  1.01433211 -21.55792498] / 절편 : 116.05021078278259
a : 1.0143321093767304 / b: -21.557924978837356 / c : 116.05021078278259

 

* 추세선 그리기

plt.scatter(train_input, train_target)
plt.scatter(50, pred[0], marker="^")

### 추세선
# - 추세선이 사용할 x축 값 지정(0~50까지의 순차적인 값 사용)
point = np.arange(0, 51)
plt.plot(point, a*point**2 + b*point + c)

plt.grid()
plt.show()

 

<해석>
 - 종속변수의 값은 음수가 나오지 않지만 선형 회귀모델의 경우에는 음의 절편 값이 나타나는 모델이었으나, 다항회귀모델의 경우에는 이를 해소할 수 있었음.


 단, 길이(x)가 10 이하의 독립변수는 사용하며 안됨
  - 다항회귀모델의 훈련 및 테스트 결정계수의 결과 미세한 과소적합을 보이고 있으나, 사용가능한 모델로 판단됨.


  - 선형회귀모델에 비하여 독립변수들이 전체적으로 추세선에 가깝게 위치하고 있기에 오차가 적은 모델이라고 판단됨.

 

 

<과소 / 과대 적합을 해소하기 위한 방법>


  - 데이터 양(row 데이터, 행)을 늘릴 수 있는지 확인
  - 분석모델이 좀 더 집중해서 훈련할 수 있도록 -> 특성(독립변수)을 추가하는 방법 확인
    --> 특성을 추가(늘리는)하는 방법은 "특성공학"개념을 적용
    --> 특성을 늘려서 사용하는 모델로 다중회귀모델이 있음
    --> 특성을 늘린다는 의미는 훈련의 복잡도를 증가시킨다고 표현하며, 복잡도가 증가되면 훈련의 집중력이 강해지게 됨
  - 복잡도를 늘기는 방법으로는 규제 방법이 있음
    --> 규제를 하는 하이퍼파라미터 속성을 이용하는 방식으로 릿지와 라쏘 회귀모델 방식이 있음
  - 이외 다른 회귀모델을 사용하여 비교

  -- 특성 => 컬럼, 필드, 퓨처 모두 같은 의미
  -- 데이터 처리 분야에서는 컬럼 또는 필드
     머신러닝에서는 특성
     딥러닝에서는 퓨처라고 한다.

728x90