k-최근접 이웃 회귀 (KNN-Regression)

arittung·2021년 6월 24일
0

딥러닝 스터디

목록 보기
4/23
post-thumbnail

💡 k-최근접 이웃 회귀 (KNN-Regression)

📑 지도학습 - 회귀 (Regression) 참고


  • 샘플에 가장 가까운 샘플 k개 선택. 회귀이기에 이웃한 샘플의 타깃은 어떤 클래스가 아니라 임의의 수치임. 이 수치들의 평균을 구하여 새로운 샘플의 타깃값 예측.

  • 분류에서는 이웃의 레이블 개수를 확인해서 다수결로 정했지만, 회귀에서는 이웃들의 평균을 계산한다는 점에서 차이가 있음.


01. 결정 계수 (Coefficient of determination, R^2)

  • 타깃의 평균 정도를 예측하는 수준이라면 결정계수는 0에 가까워지고, 예측이 타깃에 아주 가까워지면 결정 계수는 1에 가까운 값이 됨.

02. 과대적합(Overfitting) & 과소적합(Underfitting)


02-1. 과대 적합(Overfitting)

  • 모델이 훈련 세트에서는 좋은 성능을 내지만 검증 세트에서는 낮은 성능을 내는 경우.

  • 훈련 세트와 검증 세트에서 측정한 성능의 간격이 큼. (== 분산이 큼(high variance))

  • 과대 적합의 주요 원인
    : 훈련 세트에 충분히 다양한 샘플이 포함되지 않음.

  • 해결 방법 :
    1)   훈련 세트에 충분히 다양한 샘플을 포함시킴.
    2)   훈련 샘플을 더 모을 수 없는 경우, 모델이 훈련 세트에 집착하지 않도록 가중치를 제한함. (= 모델의 복잡도를 낮춤)
    3)   훈련 데이터의 잡음을 줄임.(Outlier, Error 제거)

02-2. 과소 적합(Underfitting)


  • 훈련 세트와 검증 세트의 성능에는 차이가 크지 않지만 모두 낮은 성능을 내는 경우. 훈련 세트와 검증 세트의 성능이 서로 가까워지면 성능 자체가 낮음.

  • 과소적합된 모델을 '편향이 크다(high bias)'라고도 함.

  • 해결 방법 :
    1)   복잡도가 더 높은 모델(파라미터가 더 많은 모델) 사용
    2)   가중치 규제 완화


⌨ 코드

KNN-Regression 구현

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()

n = 1, 5, 10일 때 예측 결과를 그래프로 그림. (훈련세트와 예측결과를 그래프로..!) n이 커짐에 따라(이웃이 많아짐에 따라) 모델이 단순해짐.

  • 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



참고

  • [한빛미디어] 혼자 공부하는 머신러닝+딥러닝, 박해선 저

0개의 댓글