샘플에 가장 가까운 샘플 k개 선택. 회귀이기에 이웃한 샘플의 타깃은 어떤 클래스가 아니라 임의의 수치임. 이 수치들의 평균을 구하여 새로운 샘플의 타깃값 예측.
분류에서는 이웃의 레이블 개수를 확인해서 다수결로 정했지만, 회귀에서는 이웃들의 평균을 계산한다는 점에서 차이가 있음.
모델이 훈련 세트에서는 좋은 성능을 내지만 검증 세트에서는 낮은 성능을 내는 경우.
훈련 세트와 검증 세트에서 측정한 성능의 간격이 큼. (== 분산이 큼(high variance))
과대 적합의 주요 원인
: 훈련 세트에 충분히 다양한 샘플이 포함되지 않음.
해결 방법 :
1) 훈련 세트에 충분히 다양한 샘플을 포함시킴.
2) 훈련 샘플을 더 모을 수 없는 경우, 모델이 훈련 세트에 집착하지 않도록 가중치를 제한함. (= 모델의 복잡도를 낮춤)
3) 훈련 데이터의 잡음을 줄임.(Outlier, Error 제거)
훈련 세트와 검증 세트의 성능에는 차이가 크지 않지만 모두 낮은 성능을 내는 경우. 훈련 세트와 검증 세트의 성능이 서로 가까워지면 성능 자체가 낮음.
과소적합된 모델을 '편향이 크다(high bias)'라고도 함.
해결 방법 :
1) 복잡도가 더 높은 모델(파라미터가 더 많은 모델) 사용
2) 가중치 규제 완화
from sklearn.neighbors import KNeighborsRegressor knr = KNeighborsRegressor() knr.fit(train_input, train_target) knr.score(test_input, test_target) test_prediction = knr.predict(test_input) knr.score(train_input, train_target) knr.n_neighbors = 3 knr.fit(train_input, train_target) knr.score(train_input, train_target) Knr.score(test_input, test_target) knr = KNeighborsRegressor() x = np.arange(5, 45).reshape(-1, 1) knr.n_neighbors = 3 knr = KNeighborsRegressor() x = np.arange(5, 45).reshape(-1, 1) for n in [1, 5, 10]: knr.n_neighbors = n knr.fit(train_input, train_target) prediction = knr.predict(x) plt.scatter(train_input, train_target) plt.plot(x, prediction) plt.title('n_neighbors = {}'.format(n)) plt.xlabel('length') plt.ylabel('weight') plt.show()
from sklearn.neighbors import KNeighborsRegressor
: 사이킷런에서 k-최근접 이웃 회귀 알고리즘을 구현한 클래스
knr.fit(train_input, train_target)
: k-최근접 이웃 회귀 모델을 훈련
knr.score(test_input, test_target)
: 테스트 모델(k-최근접 이웃 회귀 모델)에 대한 평가
: 0.9928094061010639
test_prediction = knr.predict(test_input)
: 테스트 세트에 대한 예측
knr.score(train_input, train_target)
: 훈련 모델에 대한 평가
: 0.9698823289099255
: 이 경우, 과소적합 (훈련 세트 점수 < 테스트 세트 점수)
knr.n_neighbors = 3
: 모델을 훈련세트에 더 잘맞게 만들기 위해 k-최근접 이웃 알고리즘에서는 k의 개수를 줄임.
: 기본값 5에서 3으로 줄임.
knr.fit(train_input, train_target)
: 모델 재 훈련
knr.score(train_input, train_target)
: 훈련 모델에 대한 평가
: 0.9804899950518966
Knr.score(test_input, test_target)
: 테스트 모델에 대한 평가
: 0.974645996398761
: 훈련 세트 점수 > 테스트 세트 점수 이고, 두 점수의 차이가 크기 않으므로 적합함.
x = np.arange(5, 45).reshape(-1, 1)
for n in [1, 5, 10]:
knr.n_neighbors = n
knr.fit(train_input, train__target)
prediction = knr.predict(x)
plt.scatter(train_input, train_target)
plt.plot(x, prediction)
plt.title('n_neighbors = {}'.format(n))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
x = np.arange(5, 45).reshape(-1, 1)
: 5에서 45까지 x 좌표 생성
knr.fit(train_input, train_target)
: 모델 훈련
prediction = knr.predict(x)
: 지정한 범위 x에 대한 예측
https://github.com/arittung/Deep_Learning_Study