머신 러닝 – KNN 회귀 VS 선형 회귀

안녕하세요. 언제나휴일입니다.

우리는 앞에서 KNN 회귀와 선형 회귀를 알아보았어요.

이번에는 이 둘을 비교해 볼게요.

사용할 데이터
KNN 회귀
선형 회귀

1. 사용할 데이터

KNN 회귀와 선형 회귀를 비교할 데이터는 2017년 서울시 연령별 키와 몸무게 데이터를 가지고 할게요.

*데이터는 통계청에서 얻어왔어요. 6세부터 연령별 키와 몸무게입니다.

weight_data = [23.3,26.3,30.1,33.1,37.6,44.2,47.7,51.6,54.1,55.9,56.6,57.9]
height_data = [121.1,127.5,133,139.1,145.1,153.1,156.9,159.5,160.5,161.2,160.8,160.9]

도표로 표시해 볼게요.

import matplotlib.pyplot as plt
plt.plot(height_data,weight_data,'o')
plt.xlabel('height') 
plt.ylabel('weight')
plt.title('height - weight 2017 seoul women')
plt.show()
2017년 서울시 연령별 키 몸무게

그리고 몸무게 20kg에서 95kg까지 예측하기 위한 데이터도 표현합시다.

xs = [[weight] for weight in weight_data]
ys = height_data
test_weight = range(20,100,5)
test_xs = [[weight] for weight in test_weight]

2. KNN 회귀

KNN 회귀 모델은 사이킷 런의 KNeighborsRegressor입니다.

모델을 생성한 후 학습(fit) 후에 예측(predict)를 수행합시다.

from sklearn.neighbors import KNeighborsRegressor
knr_model = KNeighborsRegressor(n_neighbors=2)
knr_model.fit(xs,ys)
pred_data = knr_model.predict(test_xs)
print(pred_data)

출력 결과

[124.3  124.3  136.05 142.1  149.1  155.   158.2  160.85 160.85 160.85
 160.85 160.85 160.85 160.85 160.85 160.85]

도표로 표시해 볼게요.

KNN 회귀 모델로 예측한 결과와 비교하기

보시면 55Kg부터 95Kg까지 예측한 키는 모두 160.85입니다.

KNN에서는 인접한 이웃의 평균값을 사용하는데 학습 데이터에는 몸무게의 최댓값이 57.9Kg 입니다.

학습에서 인접한 2개의 이웃의 평균값을 사용하다 보니 학습 범위를 벗어난 데이터는 예측하기 어렵습니다.

3. 선형 회귀

사이킷 런의 선형 회귀는 LinearRegression입니다.

모델을 생성한 후 학습(fit)하고 예측(predict)해 봅시다.

from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()
lr_model.fit(xs,ys)
pred_data2 = lr_model.predict(test_xs)
print(pred_data2)

출력 결과

[121.89024376 127.56583778 133.2414318  138.91702581 144.59261983
 150.26821385 155.94380786 161.61940188 167.2949959  172.97058991
 178.64618393 184.32177794 189.99737196 195.67296598 201.34855999
 207.02415401]

도표로 비교해 봅시다.

import matplotlib.pyplot as plt
plt.plot(weight_data,height_data,'bo', label='actual')
plt.plot(test_weight,pred_data,'ro',label='predict(KNN)')
plt.plot(test_weight,pred_data2,'go',label='predict2(Linear)')
plt.xlabel('height')
plt.ylabel('weight')
plt.legend()
plt.title('height - weight 2017 seoul women')
plt.show()
KNN 회귀 VS 선형 회귀

보시는 것처럼 선형 회귀는 학습 데이터를 통해 독립 변수(몸무게)와 종속 변수(키) 사이의 선형 예측 함수를 구하기 때문에 예측 값들이 하나의 선에 있는 것을 알 수 있어요.

이상으로 KNN 회귀와 선형 회귀를 비교해 보았어요.