728x90
반응형
K-최근접 이웃 회귀 (K-Neighbors Regression)
- K-최근접 이웃 분류와 같이 예측하려는 샘플에 가장 가까운 샘플 K개를 선택
- 선택한 샘플들의 값의 평균을 구함
데이터 준비
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()
농어의 길이가 커짐에 따라 무게도 늘어난다. -> 선형적이다.
훈련(Train) 세트, 테스트(Test) 세트 분할
from sklearn.model_selection import train_test_split
train_feature, test_feature, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42) # 사이킷런의 train_test_split() 함수 사용, random_state는 난수 초깃값을 지정하는 매개변수
데이터셋 shape 확인
print(f'train_feature: {train_feature.shape}')
print(f'test_feature: {test_feature.shape}')
print(f'train_target: {train_target.shape}')
print(f'test_target: {test_target.shape}')
train_feature: (42,)
test_feature: (14,)
train_target: (42,)
test_target: (14,)
Sckit-learn을 사용하기 위해 데이터셋 shape을 2차원 배열로 변경
# reshape(행, 열) 함수의 매개변수에 -1을 지정하면 원래 배열의 크기와 남은 차원으로 부터 추정하여 배열의 크기를 지정
print(train_feature.reshape(-1, 1))
[[19.6]
[22. ]
[18.7]
[17.4]
[36. ]
[25. ]
[40. ]
[39. ]
[43. ]
[22. ]
[20. ]
[22. ]
[24. ]
[27.5]
[43. ]
[40. ]
[24. ]
[21. ]
[27.5]
[40. ]
[32.8]
[26.5]
[36.5]
[13.7]
[22.7]
[15. ]
[37. ]
[35. ]
[28.7]
[23.5]
[39. ]
[21. ]
[23. ]
[22. ]
[44. ]
[22.5]
[19. ]
[37. ]
[22. ]
[25.6]
[42. ]
[34.5]]
train_feature = train_feature.reshape(-1, 1)
test_feature = test_feature.reshape(-1, 1)
print(f'train_feature: {train_feature.shape}\ntest_feature: {test_feature.shape}')
train_feature: (42, 1)
test_feature: (14, 1)
K-최근접 이웃 회귀 알고리즘(K-Neighbors Regression)을 통해 모델 훈련
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor() # KNeighborsRegressor 클래스의 객체 생성
knr.fit(train_feature, train_target) # fit() 메서드로 훈련
KNeighborsRegressor()
KNeighborsRegressor()
학습한 모델로 테스트 데이터셋의 통해 점수 확인
print(f'R^2(결정계수): {knr.score(test_feature, test_target)}') # score() 메서드로 평가
print("-> 독립변수(X)가 종속변수(Y)의 99%, 매우 잘 설명한다고 할 수 있음")
R^2(결정계수): 0.992809406101064
-> 독립변수(X)가 종속변수(Y)의 99%, 매우 잘 설명한다고 할 수 있음
- 분류 문제 -> score()를 통해 나온 값을 정확도(Accuracy)라고 부름
- 정확도(accuracy): 정답을 맞힌 개수의 비율
- 회귀 문제 -> score()를 통해 나온 값을 결정계수(R^2)라고 부름
- 결정계수(R^2): 회귀모델에서 독립변수($X$)가 종속변수($Y$)를 얼마나 설명해 주는지를 보여주는 지표, '설명력'이라고도 부름
- 0 ~ 1 사이의 값으로 표현
from sklearn.metrics import mean_absolute_error # mean_absolute_error() 함수를 사용하여 MAE(평균 절댓값 오차) 계산
test_prediction = knr.predict(test_feature) # predict() 메서드로 예측
mae = mean_absolute_error(test_target, test_prediction) # MAE 계산
print(f'MAE: {mae}')
print("-> 예측이 평균적으로 19.15g 정도 타깃값과 다르다는 것을 알 수 있음")
MAE: 19.157142857142862
-> 예측이 평균적으로 19.15g 정도 타깃값과 다르다는 것을 알 수 있음
MAE(Mean Absolute Error, 평균절대오차): 예측값과 실제값의 차이의 절대값 합의 평균
$$MAE = \dfrac{1}{N}\sum ^{n}{i=1}\left| y{i}-\widehat{y}i\right|$$
학습한 모델을 사용해 train_target 데이터셋의 R^2 점수 확인
print(f'R^2: {knr.score(train_feature, train_target)}')
R^2: 0.9698823289099254
왜 테스트 데이터셋에 대한 예측보다, 학습한 데이터셋에 대한 예측의 R^2값이 더 낮을까? -> 과소적합(Under-fitting) 되었기 때문이다!!!
Under-fitting(과소적합)을 해결하려면? -> 모델을 더 복잡하게 만들면 된다!
- KNeighborsRegressor 클래스의 n_neighbors 매개변수를 줄이면 훈련 세트에 있는 국지적인 패턴에 민감해지고 복잡한 모델이 만들어짐
knr.n_neighbors = 3 # 이웃의 개수를 3으로 설정
knr.fit(train_feature, train_target)
print(f'R^2 by Train_Datset: {knr.score(train_feature, train_target)}')
R^2 by Train_Datset: 0.9804899950518966
print(f"R^2 by Test_Dataset: {knr.score(test_feature, test_target)}")
R^2 by Test_Dataset: 0.9746459963987609
Test Dataset에 대한 R^2값보다 Train Dataset에 대한 R^2값이 낮아진 것을 볼 수 있다. -> Under-fitting(과소적합) 문제 해결!
728x90
반응형
'Data Science > 혼자 공부하는 머신러닝' 카테고리의 다른 글
[혼공머] Chapter 03-2. 선형 회귀 (0) | 2024.06.01 |
---|---|
[혼공머] 01-3. 마켓과 머신러닝 (0) | 2024.05.13 |