"분류"에서는 score()메소드를 통해 정확도를 반환받을 수 있었다. "회귀"에서는 score()메소드를 통해 R^2(결정계수)를 반환받는다.
"회귀" 모델에서는 score()를 통해 결정계 수로 성능을 평가할 수 있지만, 다른 성능 지표들도 존재한다. 그중 평균 절댓값 오차를 이용하여 또 다른 성능 지표를 확인해보도록 한다.
test_prediction = knr.predict(test_input)
mae = mean_absolute_error(test_prediction, test_target)
print("'평균 제곱 오차'를 통해 확인해본 성능 점수 : {}".format(mae))
'평균 제곱 오차'를 통해 확인해본 성능 점수 : 19.157142857142862
평균 제곱 오차가 약 19g이 확인되었다.
5. 과적합 확인
print("train data로 확인 해본 score : {}".format(knr.score(train_input, train_target)))
print("")
print("test data로 확인 해본 score : {}".format(knr.score(test_input, test_target)))
train data로 확인해본 score : 0.9698823289099254
test data로 확인 해본 score : 0.992809406101064
train data로 확인해본 score이 test data로 확인해본 score보다 더 높아야 한다. 위와 같이 train data로 확인해본 score이 더 낮은 경우, 과소적합(underfitting)된 상황이다. 반면에 train data로 확인 해본 score이 더 높지만, test data로 확인 해본 score이 너무 낮은 경우에는 과대 적합(overfitting)이라고 한다.
k-최근접 이웃 회귀 모델에서는 k(이웃)의 개수를 줄이면 과대 적합, 늘리면 과소 적합이 발생한다. 현재 과소 적합이 발생했으므로 k(이웃)의 개수를 줄여야 할 것이다.
6. 최적의 k(이웃) 값 도출
for i in range(1, 5) :
knr.n_neighbors = i
knr.fit(train_input, train_target)
print("##### k(이웃)의 갯수 : {} ####".format(i))
print("train data로 확인해본 결정계수 : {:.5f}".format(knr.score(train_input, train_target)))
print("test data로 확인해본 결정계수 : {:.5f}".format(knr.score(test_input, test_target)))
print("두 결정계수의 차이의 절대값 : {:.5f}".format((knr.score(train_input, train_target)-knr.score(test_input, test_target))))
print("")