선릉역 1번 출구
3-1 본문
회귀(regression)란 분류(classification)처럼 클래스 중 하나로 분류하는 것이 아니라 임의의 어떤 숫자(값)를 예측하는 것이다. 두 변수 사이의 상관관계를 분석하는 방법이라고도 한다.
간단하게 농어의 산점도를 그렸다.
import numpy as np perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0, 21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7, 23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5, 27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5, 44.0]) perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0, 1000.0]) import matplotlib.pyplot as plt plt.scatter(perch_length, perch_weight) plt.xlabel('length') plt.ylabel('weight') plt.show() |
농어의 길이가 길어질수록 무게도 늘어나는 것을 알 수 있음
from sklearn.neighbors import KNeighborsRegressor knr = KNeighborsRegressor() knr.fit(train_input, train_target) |
앞서 배운 K-최근접 이웃 분류 알고리즘과 유사한 K-최근접 이웃 회귀 알고리즘을 사용하려고 한다.
회귀 알고리즘 같은 경우도 분류와 유사하게 예측하려는 샘플에 가장 가까운 샘플 k개를 선택하는 것이고 k개의 평균을 예측 값으로 사용한다.
회귀의 경우 score()을 쓰면 이 메서드가 나타내는 값은 무엇일까?
분류에서의 score()은 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율인데 회귀에서는 정확한 숫자를 맞히는 것은 불가능하기 때문에 score()가 return하는 값은 결정계수이고 R^2라고도 부른다.
R^2 = 1 - (타깃-예측)^2의 합/(타깃-평균)^2의 합
from sklearn.metrics import mean_absolute_error test_prediction = knr.predict(test_input) mae = mean_absolute_error(test_target, test_prediction) print(mae) |
사이킷런의 sklearn.metrics 패키지 아래 mean_absolute_error는 타깃과 예측의 절댓값 오차를 평균해 반환한다.
이를 사용해서 결과에서 예측이 19g정도 다른 것을 파악할 수 있었다.
과대적합: 훈련 세트에서는 좋고 테스트 세트에서는 점수가 나쁜 것으로 훈련 세트에만 잘 맞는 모델이다.
과소적합: 훈련 세트보다 테스트 세트의 점수가 높거나 두 점수 모두 낮은 경우이고 모델이 너무 단순해 훈련 세트에 적절히 훈련되지 않은 경우, 훈련 세트와 테스트 세트의 크기가 매우 작은 경우 발생한다.
print(knr.score(test_input, test_target)) // 0.9928094061010639 print(knr.score(train_input, train_target)) // 0.9698823289099255 |
테스트 점수의 score()값이 더 높게 예측되어 과소적합이라고 볼 수 있다. -> 모델을 조금 더 복잡하게 만들면 된다.(훈련세트에 더 잘 맞게 만들면 됨)
*K-최근접 이웃 회귀 알고리즘에서 모델을 더 복잡하게 만드는 방법은 이웃의 개수 k를 줄이는 것이다.
knr.n_neighbors = 3 knr.fit(train_input, train_target) print(knr.score(test_input, test_target)) // 0.974645996398761 print(knr.score(train_input, train_target)) // 0.9804899950518966 |
k 값을 줄여 훈련 세트의 R^2값이 높아졌고 테스트 세트의 R^2값은 낮아졌다.