1. k-์ต๊ทผ์ ์ด์ ํ๊ท ์๊ณ ๋ฆฌ์ฆ
์ง๋ ํ์ต์ ํฌ๊ฒ ๋ถ๋ฅ์ ํ๊ท๋ก ๋๋๋ค.
ํ๊ท๋ ํด๋์ค ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๊ฒ์ด ์๋๋ผ ์์์ ์ด๋ค ์ซ์๋ฅผ ์์ธกํ๋ ๋ฌธ์ ์ด๋ค.
์ด์ ์ ๋ค๋ค๋ k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ์์ธกํ๋ ค๋ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ k๊ฐ๋ฅผ ์ ํํ๋ค.
๊ทธ ๋ค์ ์ํ๋ค์ ํด๋์ค๋ฅผ ํ์ธํ์ฌ ๋ค์๋ฅผ ์ฐจ์งํ๋ ์ํ๋ค์ ํด๋์ค๋ก ์์ธกํ๋ค.
k- ์ต๊ทผ์ ์ด์ ํ๊ท ๋ํ ๋ถ๋ฅ์ ๋๊ฐ์ด ์์ธกํ๋ ค๋ ์ํ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํ k๊ฐ๋ฅผ ์ ํํ๋ค.
ํ์ง๋ง ํ๊ท์ด๋ฏ๋ก ์ด์ํ ์ํ์ ํ๊น์ ์ด๋ค ํด๋์ค๊ฐ ์๋๋ผ ์์น์ด๋ค.
๋ฐ๋ผ์, ์ด์ ์ํ๋ค์ ์์น๋ฅผ ์ด์ฉํ์ฌ ์ด๋ค์ ํ๊ท ์ ๊ตฌํด ์๋ก์ด ์ํ(์์ธกํ๋ ค๋ ์ํ)์ ํ๊น์ ์์ธกํ๋ค.
(1) ๋ฐ์ดํฐ ์ค๋น
#๋ฐ์ดํฐ ์ค๋น (๋์ด์ ๊ธธ์ด์ ๋ฌด๊ฒ ๋ฐ์ดํฐ)
#ํน์ฑ=๊ธธ์ด, ํ๊น=๋ฌด๊ฒ
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_split()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋๋๋ค.
(random_state = 42)
perch_length๋ 1์ฐจ์ ๋ฐฐ์ด์ด๋ค.
ํ์ง๋ง, ์ฌ์ดํท๋ฐ์์ ์ฌ์ฉํ ํ๋ จ์ธํธ๋ 2์ฐจ์ ๋ฐฐ์ด์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ reshape() ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
train_input = train_input.reshape(-1,1)
test_input = test_input.reshape(-1,1)
print(train_input.shape)
#(42, 1) (14, 1)
(2) ๊ฒฐ์ ๊ณ์(R^)
์ฌ์ดํท๋ฐ์์ k-์ต๊ทผ์ ์ด์ ํ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ํด๋์ค๋ KNeighborsRegressor์ด๋ค.
ํด๋์ค์ ์ฌ์ฉ๋ฒ ์์ฒด๋ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ๋น์ทํ๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ fit()๋ฉ์๋๋ฅผ ํตํด ํ๋ จ์์ผ์ฃผ๋ฉด ๋๋ค.
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
knr.fit(train_input, train_target)
๋ค์์ผ๋ก ํ ์คํธ ์ธํธ์ ์ ์๋ฅผ ํ์ธํด๋ณธ๋ค.
print(knr.score(test_input, test_target))
#0.992809406101064
ํ ์คํธ ๊ฒฐ๊ณผ ๋งค์ฐ ์ข์ ์ ์๊ฐ ๋์๋ค.
์ด ์ ์๊ฐ ๋ฐ๋ก ๊ฒฐ์ ๊ณ์์ด๋ค.
๋ถ๋ฅ์ ๊ฒฝ์ฐ, ํ ์คํธ ์ธํธ์ ์๋ ์ํ์ ์ ํํ๊ฒ ๋ถ๋ฅํ ๊ฐ์์ ๋น์จ์ด ์ ์๋ก ๊ณ์ฐ๋์๋ค.
ํ์ง๋ง ํ๊ท์ ๊ฒฝ์ฐ ํ๊น์ด ์์น์ด๋ฏ๋ก ์ ํํ ๊ฐ์ ๋งํ๋ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์, ํ๊ฐ๋ฅผ ํ ๋ ๊ฒฐ์ ๊ณ์๋ก ํ๊ฐํ๋ค.
๊ฒฐ์ ๊ณ์ = 1 - (ํ๊น = ์์ธก)^์ ํฉ / (ํ๊น-ํ๊ท )^์ ํฉ
๊ฐ ์ํ์ ํ๊น๊ณผ ์ํนํ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ์ฌ ๋ํ๋ค.
๊ทธ ๋ค์ ํ๊น๊ณผ ํ๊น ํ๊ท ์ ์ฐจ์ด๋ฅผ ์ ๊ณฑํ์ฌ ๋ํ ๊ฐ์ผ๋ก ๋๋๋ค.
๋ง์ฝ ํ๊น์ ํ๊ท ์ ๋๋ฅผ ์ํนํ๋ ์์ค์ด๋ผ๋ฉด (์ฆ, ๋ถ์์ ๋ถ๋ชจ๊ฐ ๊ฐ๊น์์ง๋ฉด) R^(=๊ฒฐ์ ๊ณ์)๋ 0์ ๊ฐ๊น์์ง๊ณ , ์์ธก์ด ํ๊น์ ๊ฐ๊น์์ง๋ฉด (๋ถ์๊ฐ -์ผ๋ก ๊ฐ๊น์์ง) 1์ ๊ฐ๊น์ด ๊ฐ์ด ๋๋ค.
๊ฒฐ์ ๊ณ์๊ฐ ๋งค์ฐ ์ข๊ฒ ๋์๋๋ฐ, ์ด๊ฒ์ด ์ ํํ ๊ฒฐ๊ณผ์ธ์ง ํ์ธํด๋ณด๊ธฐ ์ํด, mean_absolute_error๋ฅผ ์ฌ์ฉํ์ฌ ํ๊น๊ณผ ์์ธก์ ์ค์ฐจ๋ฅผ ํ๊ท ํ์ฌ ๋ฐํํ๋ค.
from sklearn.metrics import mean_absolute_error
#ํ
์คํธ ์ธํธ๋ฐ ๋ํ ์์ธก ์์ฑ
test_prediction = knr.predict(test_input)
#ํ
์คํธ ์ธํธ์ ๋ํ ํ๊ท ์ ๋๊ฐ ์ค์ฐจ๋ฅผ ๊ณ์ฐ
mae = mean_absolute_error(test_target, test_prediction)
print(mae)
๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด, ์์ธก์ด ํ๊ท ์ ์ผ๋ก 19g ์ ๋ ํ๊น๊ฐ๊ณผ ๋ค๋ฅด๋ค.
2. ๊ณผ๋์ ํฉ vs ๊ณผ์์ ํฉ
์ง๊ธ๊น์ง๋ ํ๋ จ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๋ จํ๊ณ ํ ์คํธ ์ธํธ๋ก ๋ชจ๋ธ์ ํ๊ฐํ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ จ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฐํด๋ณด๋ฉด ์ด๋จ๊น?
์ฆ, score() ๋ฉ์๋์ ํ๋ จ์ธํธ๋ฅผ ์ ๋ฌํ์ฌ ์ ์๋ฅผ ์ถ๋ ฅํด๋ณด๋ ๊ฒ์ด๋ค.
print(knr.score(train_input, train_target))
#0.9698823289099254
๋ณดํต ํ๋ จ์ ์ฌ์ฉํ ํ๋ จ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ๋ฉด ์ ์๊ฐ ๋ ๋๊ฒ ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์์ํ์ง๋ง, ์์๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
๊ณผ๋์ ํฉ = ํ๋ จ ์ธํธ์์ ์ ์๊ฐ ์ข์์ง๋ง, ํ ์คํธ ์ธํธ์์๋ ์ ์๊ฐ ๊ต์ฅํ ๋์ ๊ฒฝ์ฐ
์ฆ, ํ๋ จ ์ธํธ์๋ง ์ ์ ํ ๋ชจ๋ธ์ด๋ผ๋ ๊ฒ (์ค์ ์ํ์ ๋ํ ์์ธก๋๊ฐ ๋งค์ฐ ๋จ์ด์ง)
๊ณผ์์ ํฉ = ํ๋ จ ์ธํธ๋ณด๋ค ํ ์คํธ ์ธํธ์ ์ ์๊ฐ ๋ ๋๊ฑฐ๋ ๋ ์ ์ ๋ชจ๋ ๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ
์ฆ, ๋ชจ๋ธ์ด ๋๋ฌด ๋จ์ํ์ฌ ํ๋ จ ์ธํธ์ ์ ์ ํ ํ๋ จ๋์ง ์์ ๊ฒ์ด๋ค. (๊ทธ๋ฅ ์ ๋๋ก ํ๋ จ๋์ง ์์๋ค๋ ๊ฒ)
//ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ์ ์ ์๋ฅผ ๋น๊ตํ์์ ๋ ํ๋ จ ์ธํธ๊ฐ ๋๋ฌด ๋์ผ๋ฉด ๊ณผ๋์ ํฉ, ๋ฐ๋๊ฑฐ๋ ์ ์๊ฐ ๋ ๋ค ๋ฎ์ผ๋ฉด ๊ณผ์์ ํฉ์ด๋ค.
๋ฐ๋ผ์, ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ธ์ ํ๋ จ ์ธํธ์ ์ ์๊ฐ ๋ ๋ฎ์ผ๋ฏ๋ก ๊ณผ์์ ํฉ์ด๋ค.
์ด๋ด ๋์๋ ๋ชจ๋ธ์ ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๋ฉด ํด๊ฒฐ๋๋ค.
k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด์์ ๊ฐ์ k๋ฅผ ์ค์ด๋ฉด ๋๋ค.
k๋ฅผ ์ค์ด๋ฉด ํ๋ จ ์ธํธ์ ์๋ ๋ ์์ ๋ถ์์ ์ด์๊ฐ๋ค์ ํ๊ตฐ๋ค์ ๊ตฌํ ๊ฒ์ด๊ณ ๊ทธ๋ ๊ฒ ๋๋ฉด ๋์ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ(์ด์ฉ๋ฉด ์ ํ๋๊ฐ ๋ ๋์?)๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋๋ก ์ด์ k์ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ฉด ๋ชจ๋ธ์ ๋์ฑ ๋์ ๋ฒ์์ ์ด์๊ฐ๋ค์ ํ๊ท ์ ๊ตฌํ ๊ฒ์ด๋ฏ๋ก ๋์ธ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ(์ ํ๋๊ฐ ๋จ์ด์ง ์ ์๋)๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
๋ฐ๋ผ์ k์ ๊ฐ์ 5์์ 3์ผ๋ก ์ค์ฌ ์ฌํ๋ จํ๊ณ , ํ ์คํธ ์ธํธ์ ์ ์๋ฅผ ํ์ธํด๋ณด๋ฉด ๊ณผ์์ ํฉ์ ํด๊ฒฐํ ๊ฒ์ ์ ์ ์๋ค.