머신러닝 | 딥러닝

[ML(머신러닝)] KNN 회귀모델 -3 <하이퍼파라미터 튜닝>

멈머이 2023. 12. 26. 23:15
728x90

하이퍼파라미터 튜닝을 하는 이유?

  => 과소적합을 해결하기 위해서

 

1. 하이퍼파라미터 튜닝하기

KNN모델의 이웃(하이퍼파라미터)의 개수를 조절해보기 - 5개

knr.n_neighbor = 5

### 하이퍼파리미터 값 수정 후 재훈련 시켜서 검증해야 한다.
knr.fit(train_input, train_target)

### 훈련 정확도 확인
train_r2 = knr.score(train_input, train_target)

### 테스트(검증) 저확도 확인
test_r2 = knr.score(test_input, test_target)

print(f"훈련 : {train_r2} / 검증 : {test_r2}")

결과 : 훈련 : 0.9698823289099254 / 검증 : 0.992809406101064

<해석>
  - 과적합 여부 확인 결과 과소적합이 발생하여, 훈련모델로 적합하지 않음
  - 과소적합 해소 필요

 

 

KNN모델의 이웃(하이퍼파라미터)의 갯수를 조절해보기 - 3

knr.n_neighbors = 3

### 하이퍼파리미터 값 수정 후 재훈련 시켜서 검증해야 한다.
knr.fit(train_input, train_target)

### 훈련 정확도 확인
train_r2 = knr.score(train_input, train_target)

### 테스트(검증) 저확도 확인
test_r2 = knr.score(test_input, test_target)

print(f"훈련 : {train_r2} / 테스트 : {test_r2}")

결과 : 훈련 : 0.9804899950518966 / 테스트 : 0.9746459963987609
<해석>
  - 과소적합 해소를 위해 이웃의 갯수를 조정하여 하이퍼파라미터 튜닝을 진행한 결과 고소적합을 해소할 수 있었음
  - 또한, 훈련 정확도와 테스트 정확도의 차이가 크지 않기에 과대적합도 일어나지 않았음
  - 다만 테스트 정확도는 다소 낮아진 반면, 훈련 정확도가 높아졌음.
  - 이 모델은 과적합이 발생하지 않은 일반화된 모델로 사용가능

 

 

가장 적합한 이웃의 갯수 찾기 (하이퍼파라미터 튜닝)

knr
# 정확도가 가장 높을떄의 이웃의 갯수를 담을 변수
nCnt = 0
# 정확도가 가장 낮을떄의 이웃의 갯수를 담을 변수
nScore = 0

for n in range(3, len(train_input),2):
    knr.n_neighbors = n
    score = knr.score(train_input, train_target)
    print(f"{n} / {score}")

    ### 1보다 작은 정확도인 경우
    if score <1:
        ### nScore의 값이 score보다 작은 경우 담기
        if nScore < score:
            nScore = score
            nCnt = n

print(f"nCnt = {nCnt} / nScore = {nScore}")

결과 : 

3 / 0.9804899950518966
5 / 0.9698823289099254
7 / 0.9761170732051527
9 / 0.9693310367551284
11 / 0.9515761381539326
13 / 0.9413423450130075
15 / 0.930201118360776
17 / 0.9087778943199959
19 / 0.8782082893573573
21 / 0.8410922229110086
23 / 0.7915879473391005
25 / 0.7452999142836829
27 / 0.6908904295441316
29 / 0.6245508306350807
31 / 0.5505387544219442
33 / 0.4751211291271804
35 / 0.39478071361200084
37 / 0.28970143088637
39 / 0.18151707588188104
41 / 0.05978205016667115
nCnt = 3 / nScore = 0.9804899950518966

이웃이 3개일 때 가장 정확도가 좋다.

 

 

2. 임의 값으로 예측하기

* 길이 50으로 예측하기

pred = knr.predict([[50]])
pred

결과 : array([1033.33333333])

 

* 사용된 이웃의 인덱스 확인

dist, indexes = knr.kneighbors([[50]])
indexs

결과 : array([[34,  8, 14]], dtype=int64)

 

* 산정도 그리기

plt.scatter(train_input, train_target, c="blue", label="bream")
plt.scatter(perch_length, perch_weight)
plt.scatter(50, pred[0], marker="^", c="green", label="pred")
plt.scatter(train_input[indexes], train_target[indexes], c="red", label="bream")
plt.xlabel("lenght")
plt.ylabel("weight")
plt.legend()
plt.show()

 

 

<해석>
KNN의 한계
  - 가장 가까운 이웃을 이용해서 예측을 수행하는 모델이기에,

     예측하고자 하는 독립변수의 값이 기존 훈련데이터의 독립변수가         가지고 있는 범위를 벗어나는 경우에는
     값이 항상 동일하게 나옴 (가까운 거리의 이수이 항상 동일해짐)

            따라서, 다른 회귀모델을 사용해야 함

728x90