공부/머신러닝

[ 머신러닝 프로그램 ] k최근접 이웃 회귀 알고리즘

haena02 2023. 2. 13. 21:58
반응형

지도학습은 분류와 회귀로 두가지 종류가 있다.

분류는 샘플을 몇 개의 클래스 중 하나로 분류하는 문제이고, 회귀는 임의의 어떤 숫자를 예측하는 문제이다.

 

k-최근접 이웃 회귀의 원리는 분류와 비슷하다.

샘플에 가장 가까운 샘플 k개를 선택하고 이들의 평균을 구하면 된다!

 

우리는 농어의 정보들을 분석해서 한 농어의 정보를 예측할 것이다.

 

농어의 산점도를 보자!

산점도

산점도를 보면 길이가 길어질수록 무게가 올라가는 것을 쉽게 알 수 있다. 

 

이제 데이터들을 준비해서 알고리즘을 돌려보자!

#데이터 세팅
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight)
train_input=train_input.reshape(-1,1)
test_input=test_input.reshape(-1,1)

#머신러닝
knr=KNeighborsRegressor();
knr.fit(train_input,train_target)
print(knr.score(train_input,train_target)) #훈련세트
print(knr.score(test_input,test_target)) #테스트세트

데이터는 1차원 리스트이기 때문에 reshape()함수를 통해서 모양을 다시 만져야한다.

그러고 분류와 비슷하게 fit()함수로 학습시키고 score()함수로 결과를 확인하면 된다.

 

하지만 점수가 분류랑은 조금 다르다.

회귀에서는 예측이기 때문에 정확한 숫자를 맞힌다는 것은 거의 불가능하다.

그렇기 때문에 회귀는 결정계수로 평가한다 R^2라고 부르기도한다. 

 

결정계수는 각 샘플의 타킷과 예측한 값의 차이를 제곱하여 더한다.

그다음 타깃과 타깃 평균의 차이를 제곱하여 더한 값으로 나눈다.

 

하지만 이 숫자는 직감적으로 얼마나 좋은지 보기 어렵다.

그래서 사이킷런은 타깃과 예측의 절댓값 오차를 평균하여 반환해주는 mean_absolute_error함수를 제공한다.

 

실제 결정계수를 보면 위와 같이 나온다 위에는 훈련세트이고 아래는 테스트세트의 결과다.

훈련세트로 테스트한게 더 높은 숫자가 나올 것 같지만 더 낮은 숫자가 나왔다.

이런경우는 과소적합이라고 한다. 

훈련세트보다 테스트 세트의 점수가 높거나 둘다 너무 낮은 경우에 과소적합되었다고 말한다.

이런 경우에는 모델이 너무 단순하여 훈련세트에 적절하기 훈련되지 못한 것이다. 

이런경우에는 k를 줄여서 패턴에 더 민감해지게 해야한다.

반대로 테스트세트보다 훈련세트의 점수가 더 높은 경우 과대적합되었다고 한다. 

너무 훈련세트에 과하게 잘 맞아서 일반화가 되지 못한것이다.

이런경우 k를 늘려 더 일반화, 단순화 해야한다. 

 

훈련세트와 테스트세트의 점수가 비슷해져야 일반화를 잘했다고 한다. 

반응형