더북(TheBook)

훌륭합니다. 자, 두 가지 명심할 것이 있습니다. 첫째, sklearn 이외에도 다른 시스템을 이용해서 모델을 학습할 수 있습니다. 또 다른 시스템으로 만든 모델을 sklearn을 이용해서 평가할 수도 있습니다. 둘째, 그 이름처럼 np.polyfit은 그 어떤 차수의 다항식도 쉽게 만들어 낼 수 있습니다. 간단한 직선보다 훨씬 더 복잡한 패턴도 만들어 낼 수 있지요.

이번에는 “직선이 아닌 곡선을 사용해 보면 어떨까?”라는 질문과 함께 선형 회귀의 복잡도를 조정해 보겠습니다. 간단한 굽힘을 추가하면 어떤 일이 벌어질까요? 하나의 굽힘이 있는 곡선, 즉 포물선은 2차 다항식으로 표현할 수 있습니다. 훈련 데이터의 포인트에 직선을 적합하고 오차 제곱합이 가장 낮은 직선을 선택하는 대신, 여러 개의 포물선을 그리고 그중에서 가장 적합한 포물선을 찾는 것이죠. 수학 공식상으로는 매우 비슷합니다. 덕분에 코드를 크게 수정할 필요가 없습니다.

 

In [7]:

# 2차 다항식(포물선)을 적합-예측-평가합니다
model_two = np.poly1d(np.polyfit(train_ftr, train_tgt, 2))
preds_two = model_two(test_ftr)
print("RMSE:", np.sqrt(mse(test_tgt, preds_two)))
RMSE: 1.2765992188881117

 

테스트 오차가 조금 나아졌군요. 오차라는 것은 한겨울 창문으로 빠져나가는 열 같은 것입니다. 적으면 적을수록 좋죠. 굽힘 하나로 성능이 개선되었다면 더 많은 굽힘을 추가해 보는 것은 어떨까요? 여덟 개까지 굽힘을 늘려 봅시다. 하나가 좋은 수준이라면 여덟 개는 분명 훨씬 더 좋을 것이에요! 다항식 차수를 9차까지 늘리면 여덟 개의 굽힘을 얻을 수 있습니다. 9차 다항식은 영어로 nonic이라고도 합니다. 9차 다항식의 MSE를 계산해 봅시다.

 

In [8]:

model_three = np.poly1d(np.polyfit(train_ftr, train_tgt, 9))
preds_three = model_three(test_ftr)
print("RMSE:", np.sqrt(mse(test_tgt, preds_three)))
RMSE: 317.3634424235501

 

오차가 엄청나게 높아졌습니다. 포물선을 사용했을 때보다 상황이 훨씬 심각해졌네요. 예상치 못한 결과입니다. 왜 이러한 결과가 나왔을까요?

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.