728x90
반응형

회귀 알고리즘의 시작

  • 19세기 통계학자이자 사회학자인 프랜시스 골턴(Francis Galton)이 처음 사용
    • 키가 큰 사람의 아이가 부모보다 더 크지 않는다는 사실을 관찰하고 이를 '평균으로 회귀한다'라고 표현
  • 두 변수 사이의 상관관계를 분석하는 방법을 회귀라 불렀다.

 

k-최근접 이웃 분류 알고리즘

  1. 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다.
  2. 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측한다.

 

k-최근접 이웃 회귀

  1. 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다.
  2. 이웃한 샘플의 타깃은 어떤 클래스가 아니라 임의의 수치
  3. 이 수치들의 평균을 구한다.

 

데이터 준비

import numpy as np


# 데이터 준비
# 농어의 길이와 무게
# 농어의 길이는 특성, 무게는 타겟
perch_length = np.array(
    [8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 
     21.0, 21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 
     22.5, 22.7, 23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 
     27.3, 27.5, 27.5, 27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 
     36.5, 36.0, 37.0, 37.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 
     40.0, 42.0, 43.0, 43.0, 43.5, 44.0]
     )
perch_weight = np.array(
    [5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 
     110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 
     130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 
     197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 
     514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 
     820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 
     1000.0, 1000.0]
     )

 

데이터 산점도

import matplotlib.pyplot as plt
plt.scatter(perch_length, perch_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

# 농어으 길이에 따라서 무게가 달라짐 - 길이가 길어질수록, 무게도 늘어난다.

[그림1] 데이터 산점도

 

훈련 세트와 테스트 셀 나누기

# 농어 데이터 훈련 세트와 테스트 셑로 나누기

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42) 
# 사이킷런에 사용할 훈련 세트는 2차운 배열이어야 한다.
# perch_length는 1차원 배열이기 때문에 train_input, tes_input도 1차원 배열이다. -> 2차원 배열로 변환

test_array = np.array([1,2,3,4])
print(test_array) #(4,)

# (2,2) 크기로 변환
test_array = test_array.reshape(2,2)
print(test_array.shape)

[그림2] 훈련 세트와 테스트 셀로 나누기

 

# reshape() 크기에 -1을 지정하면 나머지 원소 개수로 모두 채우라는 의미다.

train_input = train_input.reshape(-1,1)
test_input = test_input.reshape(-1,1)
print(train_input.shape, test_input.shape)

 

#  결정계수 (R^2)
# k-최근접 이웃 회귀 알고리즘 구현한 클래스는 KNeighborsRegressor
# 클래스 사용법은 KNeighborsClassifier와 매우 비슷하다.
# 객체 생성 후 fit() 메서드로 훈련

from sklearn.neighbors import KNeighborsRegressor

knr = KNeighborsRegressor()

# k-최근접 이웃 회귀 모델을 훈련한다.
knr.fit(train_input, train_target)

# 테스트 세트 점수 확인
print(knr.score(test_input, test_target))

[그림3] 테스트 점수

  • 분류의 경우 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율이다. - 정확도
    • 정답을 맞힌 개수의 비율
  • 회귀에서 정확한 숫자를 맞힌다는 것은 불가능하다.
  • 예측하는 값이나 타깃 모두 임의의 수치이기 때문이다.
  • 회귀의 경우 다른 값으로 평가 결정계수(coefficient of determination)라고 부른다. R^2
  • R2 = 1 - (타깃 - 예측)^2의 합 / (타깃 - 평균)^2의 합

 

 

score() 메서드의 출력값의 의미

  • 사이킷런의 score() 메서드가 출력하는 값은 높을수록 조은 것. 예) 정확도 결정계수
  • 만약 score() 메서드가 에러율을 반환한다면 이를 음수로 만들어 실제로는 낮은 에러가 score() 메서드로 반환될 때는 높은 값이 되도록 바꾼다.

sklearn.metrics 패키지 아래 여러 가지 측정 도구를 이용해 타깃과 예측의 절댓값 오차 평균해 반환

# R2가 직감적으로 얼마나 좋은지 이해 
# 사이킷런은 sklearn.metrics 패키지 아래 여러 가지 측정 도구를 제공한다.

from sklearn.metrics import mean_absolute_error

# 테스트 세트에 대한 예측을 만든다.
test_prediction = knr.predict(test_input)

# 테스트 세트에 대한 평균 절댓값 오차를 계산한다.
mae = mean_absolute_error(test_target, test_prediction)
print(mae)

[그림4] 절댓값 오차

 

print(knr.score(train_input, train_target))

[그림5] 훈련한 모델 결과

 

 

과대적합(overfitting)

  • 훈련 세트에서 점수가 굉장히 좋았는데 테스트 세트에서는 점수가 굉장히 나쁘다면 모델 훈련세트에 과대적합 되었다고 말한다.

 

과소적합(underfitting)

  • 훈련 세트보다 테스트 세트의 점수가 높거나 두 점수가 모두 너무 낮은 경우에는 과소적합이라고 말한다.

 

 

현재 훈련세트보다 테스트 세트의 점수가 높으니 과소적합

모델을 좀 더 복잡하게 만들기 - k 최근접 이웃 알고리즘에서는 이웃의 개수 k를 줄이는 것이다.

# 과소적합 해결을 위해 k-최근접 이웃 알고리즘에서 
# 이웃의 개수 k를 줄이기 5 -> 3

knr.n_neighbors = 3

# 모델을 다시 훈련
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
print(knr.score(test_input, test_target))

[그림6] 이웃 개수 변경 후 결과

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기