선릉역 1번 출구

3-1 본문

Computer/AI

3-1

choideu 2021. 7. 8. 07:11

회귀(regression)란 분류(classification)처럼 클래스 중 하나로 분류하는 것이 아니라 임의의 어떤 숫자(값)를 예측하는 것이다. 두 변수 사이의 상관관계를 분석하는 방법이라고도 한다.

 

간단하게 농어의 산점도를 그렸다.

import numpy as np

perch_length = np.array([8.413.715.016.217.418.018.719.019.620.021.0,
       21.021.021.322.022.022.022.022.022.522.522.7,
       23.023.524.024.024.625.025.626.527.327.527.5,
       27.528.028.730.032.834.535.036.536.037.037.0,
       39.039.039.040.040.040.040.042.043.043.043.5,
       44.0])
perch_weight = np.array([5.932.040.051.570.0100.078.080.085.085.0110.0,
       115.0125.0130.0120.0120.0130.0135.0110.0130.0,
       150.0145.0150.0170.0225.0145.0188.0180.0197.0,
       218.0300.0260.0265.0250.0250.0300.0320.0514.0,
       556.0840.0685.0700.0700.0690.0900.0650.0820.0,
       850.0900.01015.0820.01100.01000.01100.01000.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값은 낮아졌다.

'Computer > AI' 카테고리의 다른 글

3-3  (0) 2021.07.08
3-2  (0) 2021.07.08
2  (0) 2021.07.07
1  (0) 2021.07.07
Anaconda 설치하기  (0) 2021.06.28
Comments