ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
KNN ํ๊ท๋ชจ๋ธ
๋ฐ์ดํฐ
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]
)
๋์ด์ ๊ธธ์ด๋ก ๋ฌด๊ฒ ์์ธกํ๊ธฐ
# - ๋
๋ฆฝ๋ณ์ : ๊ธธ์ด
# - ์ข
์๋ณ์ : ๋ฌด๊ฒ
### ๋์ด์ ๊ธธ์ด๋ก, ๋ฌด๊ฒ ์์ธกํ๊ธฐ
# - ๋
๋ฆฝ๋ณ์ : ๊ธธ์ด
# - ์ข
์๋ณ์ : ๋ฌด๊ฒ
perch_length.shape, perch_weight.shape
์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
### ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
import matplotlib.pyplot as plt
plt.scatter(perch_length, perch_weight)
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
###(ํด์)
# - ์ด๋ฐ์๋ ๊ณก์ ์ ๋๋ ๋ฏ ํ๋ค๊ฐ, ์ค๋ฐ๋ถ๋ถํฐ๋ ์ง์ ์ ํํ๋ฅผ ๋ํ๋ด๊ณ ์์
# - ์ข
์๋ณ์๊ฐ ์ฐ์ํ ๋ฐ์ดํฐ์ด๋ฉฐ, ์ ํ ๋ถํฌ๋ฅผ ๋ํ๋ด๊ธฐ์ ํ๊ท๋ชจ๋ธ์ ์ฌ์ฉํจ
ํ๋ จ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ ๋ถ๋ฅํ๊ธฐ
### ํ๋ จ : ํ
์คํธ = 75 : 25๋ก ๊ตฌ๋ถ
### ์ฌ์ฉ๋ณ์ : train_input, train_target, test_input, test_target
### ํ๋ จ : ํ
์คํธ = 75 : 25๋ก ๊ตฌ๋ถ
### ์ฌ์ฉ๋ณ์ : train_input, train_target, test_input, test_target
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight,
test_size=0.25, random_state=42)
print(f"{train_input.shape} : {train_target.shape}")
print(f"{test_input.shape} : {test_target.shape}")
ํ๋ จ ๋ฐ ํ ์คํธ์ ๋ ๋ฆฝ๋ณ์๋ฅผ 2์ฐจ์์ผ๋ก ๋ง๋ค๊ธฐ
### ํ๋ จ ๋
๋ฆฝ๋ณ์ 2์ฐจ์ ๋ง๋ค๊ธฐ
train_input = train_input.reshape(-1, 1)
### ํ
์คํธ ๋
๋ฆฝ๋ณ์ 2์ฐจ์ ๋ง๋ค๊ธฐ
test_input = test_input.reshape(-1, 1)
print(f"{train_input.shape} / {test_input.shape}")
๋ชจ๋ธ ํ๋ จํ๊ธฐ
ํ๋ จ ๋ชจ๋ธ ์์ฑํ๊ธฐ
### ํ๋ จ ๋ชจ๋ธ ์์ฑํ๊ธฐ
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
knr
### ๋ชจ๋ธ ํ๋ จ ์ํค๊ธฐ
knr.fit(train_input, train_target)
ํ๋ จ ์ ํ๋ ํ์ธํ๊ธฐ
### ํ๋ จ ์ ํ๋ ํ์ธํ๊ธฐ
train_r2 = knr.score(train_input, train_target)
### ํ
์คํธ ์ ํ๋ ํ์ธํ๊ธฐ
test_r2 = knr.score(test_input, test_target)
print(f"ํ๋ จ={train_r2} / ํ
์คํธ={test_r2}")
###(ํด์)
# - ํ๋ จ ๋ฐ ํ
์คํธ ์ ํ๋๋ ๋งค์ฐ ๋๊ฒ ๋ํ๋ ์ฑ๋ฅ ์ข์ ๋ชจ๋ธ๋ก ํ๋จ๋๋,
# - ๊ทธ๋ฌ๋, ๊ณผ์ ํฉ ์ฌ๋ถ๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ
# -> ํ๋ จ ์ ํ๋๊ฐ ํ
์คํธ ์ ํ๋๋ณด๋ค ๋ฎ๊ฒ ๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์
# - ๊ณผ์์ ํฉ์ด ๋ฐ์ํ๊ณ ์๋ ๊ฒ์ผ๋ก ํ๋จ๋จ
# - ์ด๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๊ฐ ์๊ฑฐ๋, ํ๋์ด ํ์ํ ๊ฒฝ์ฐ๋ก ์ดํ ์งํ์ ํ๊ณ ์ ํจ
###(ํด์)
# - ํ๋ จ ๋ฐ ํ
์คํธ ์ ํ๋๋ ๋งค์ฐ ๋๊ฒ ๋ํ๋ ์ฑ๋ฅ ์ข์ ๋ชจ๋ธ๋ก ํ๋จ๋๋,
# - ๊ทธ๋ฌ๋, ๊ณผ์ ํฉ ์ฌ๋ถ๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ
# -> ํ๋ จ ์ ํ๋๊ฐ ํ
์คํธ ์ ํ๋๋ณด๋ค ๋ฎ๊ฒ ๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์
# - ๊ณผ์์ ํฉ์ด ๋ฐ์ํ๊ณ ์๋ ๊ฒ์ผ๋ก ํ๋จ๋จ
# - ์ด๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๊ฐ ์๊ฑฐ๋, ํ๋์ด ํ์ํ ๊ฒฝ์ฐ๋ก ์ดํ ์งํ์ ํ๊ณ ์ ํจ
๋ชจ๋ธ ํ๊ฐํ๊ธฐ : ํ๊ท ์ ๋์ค์ฐจ(MAE; Mean Absolute Error)
- ํ๊ท์์ ์ฌ์ฉํ๋ ํ๊ฐ๋ฐฉ๋ฒ
- ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ฐจ์ด๋ฅผ ํ๊ท ํ์ฌ ๊ณ์ฐํ ๊ฐ
- ์ฆ, ์ฌ์ฉ๋ ์ด์๋ค๊ณผ์ ๊ฑฐ๋ฆฌ์ฐจ๋ฅผ ์ ๋๊ฐ์ผ๋ก ํ๊ท ํ ๊ฐ
from sklearn.metrics import mean_absolute_error
์์ธกํ๊ธฐ
### ์์ธกํ๊ธฐ
test_pred = knr.predict(test_input)
test_pred
ํ๊ฐํ๊ธฐ
### ํ๊ฐํ๊ธฐ
mae = mean_absolute_error(test_target, test_pred)
mae
### (ํด์)
# - ํด๋น ๋ชจ๋ธ์ ์ด์ฉํด์ ์์ธก์ ํ ๊ฒฝ์ฐ์๋
# - ํ๊ท ์ ์ผ๋ก -> ์ฝ 19.157g ์ ๋์ ์ฐจ์ด(์ค์ฐจ)๊ฐ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์
# - ์ฆ, ์์ธก๊ฒฐ๊ณผ๋ ์ฝ 19.157g ์ ๋์ ์ฐจ์ด๊ฐ ์์
๊ณผ์์ ํฉ์ ํด์ํ๊ธฐ ์ํ์ฌ [ ํ์ดํผํ๋ผ๋ฉํฐ ํ๋ ]์ ์งํํด ๋ณด๊ธฐ
### KNN ๋ชจ๋ธ์ ์ด์์ ๊ฐฏ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ์กฐ์ ํด๋ณด๊ธฐ
### ์ด์์ ๊ฐฏ์ => ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ
knr.n_neighbors = 5
### ํ์ดํผํ๋ผ๋ฉํฐ ๊ฐ ์์ ํ ์ฌํ๋ จ ์์ผ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
knr.fit(test_input, test_target)
### ํ๋ จ์ ํ๋ ํ์ธ
train_r2 = knr.score(train_input, train_target)
### ํ
์คํธ(๊ฒ์ฆ) ์ ํ๋ ํ์ธ
test_r2 = knr.score(test_input, test_target)
print(f"ํ๋ จ={train_r2} / ํ
์คํธ={test_r2}")
###(ํด์)
# - ๊ณผ์ ํฉ ์ฌ๋ถ ํ์ธ ๊ฒฐ๊ณผ ๊ณผ์์ ํฉ์ด ๋ฐ์ํ์ฌ, ํ๋ จ๋ชจ๋ธ๋ก ์ ํฉํ์ง ์์
# - ๊ณผ์์ ํฉ ํด์ ํ์
์ด์์ ๊ฐฏ์ ์กฐ์ (3)
### KNN ๋ชจ๋ธ์ ์ด์์ ๊ฐฏ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ์กฐ์ ํด๋ณด๊ธฐ
### ์ด์์ ๊ฐฏ์ => ์กฐ์
knr.n_neighbors = 3
### ํ์ดํผํ๋ผ๋ฉํฐ ๊ฐ ์์ ํ ์ฌํ๋ จ ์์ผ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
knr.fit(test_input, test_target)
### ํ๋ จ์ ํ๋ ํ์ธ
train_r2 = knr.score(train_input, train_target)
### ํ
์คํธ(๊ฒ์ฆ) ์ ํ๋ ํ์ธ
test_r2 = knr.score(test_input, test_target)
print(f"ํ๋ จ={train_r2} / ํ
์คํธ={test_r2}")
###(ํด์)
# - ๊ณผ์์ ํฉ ํด์๋ฅผ ์ํด ์ด์์ ๊ฐฏ์๋ฅผ ์กฐ์ ํ์ฌ ํ์ดํผํ๋ผ๋ฉํฐ ํ๋์ ์งํํ ๊ฒฐ๊ณผ
# - ๊ณผ์์ ํฉ์ ํด์ํ ์ ์์์
# - ๋ํ, ํ๋ จ ์ ํ๋์ ํ
์คํธ ์ ํ๋์ ์ฐจ์ด๊ฐ ํฌ์ง ์๊ธฐ์ ๊ณผ๋์ ํฉ๋ ์ผ์ด๋์ง ์์์
# - ๋ค๋ง, ํ
์คํธ ์ ํ๋๋ ๋ค์ ๋ฎ์์ง ๋ฐ๋ฉด, ํ๋ จ ์ ํ๋๊ฐ ๋์์ก์
# - ์ด ๋ชจ๋ธ์ ๊ณผ์ ํฉ์ด ๋ฐ์ํ์ง ์์ ์ผ๋ฐํ๋ ๋ชจ๋ธ๋ก ์ฌ์ฉ๊ฐ๋ฅ
๊ฐ์ฅ ์ ํฉํ ์ด์์ ๊ฐฏ์ ์ฐพ๊ธฐ (ํ์ดํผํ๋ผ๋ฉํฐ ํ๋)
### ๊ฐ์ฅ ์ ํฉํ ์ด์์ ๊ฐฏ์ ์ฐพ๊ธฐ (ํ์ดํผํ๋ผ๋ฉํฐ ํ๋)
### 1๋ณด๋ค ์์ ๊ฐ์ฅ ์ข์ ์ ํ๋์ผ ๋์ ์ด์์ ๊ฐฏ์ ์ฐพ๊ธฐ
## ๋ชจ๋ธ(ํด๋์ค) ์์ฑ
knr = KNeighborsRegressor()
### ํ๋ จ์ํค๊ธฐ
knr.fit(train_input, train_target)
### 1๋ณด๋ค ์์ ๊ฐ์ฅ ์ข์ ์ ํ๋์ผ ๋์ ์ด์์ ๊ฐฏ์ ์ฐพ๊ธฐ
# - ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ : ๋ฒ์๋ 3 ~ ์ ์ฒด ๋ฐ์ดํฐ ๊ฐฏ์
### ์ ํ๋๊ฐ ๊ฐ์ฅ ๋์ ๋์ ์ด์์ ๊ฐฏ์๋ฅผ ๋ด์ ๋ณ์
nCnt = 0
### ์ ํ๋๊ฐ ๊ฐ์ฅ ๋์ ๋์ ๊ฐ์ ๋ด์ ๋ณ์
nScore = 0
for n in range(3, len(train_input), 2) :
knr.n_neighbors = n
score = knr.score(train_input, train_target)
print(f"{n} / {score}")
### 1๋ณด๋ค ์์ ์ ํ๋์ธ ๊ฒฝ์ฐ
if score < 1 :
### nScore์ ๊ฐ์ด score๋ณด๋ค ์์ ๊ฒฝ์ฐ ๋ด๊ธฐ
if nScore < score :
nScore = score
nCnt = n
print(f"nCnt = {nCnt} / nScore = {nScore}")
### ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ๊ฐ์ฅ ์ข์ ์์ ์ ์ด์์ ๊ฐฏ์๋ฅผ ์ถ์ถํ๊ธฐ ์ํ
# ํ์ดํผํ๋ผ๋ฉํฐ ํ๋๊ฒฐ๊ณผ, ์ด์์ ๊ฐฏ์ 3๊ฐ๋ฅผ ์ฌ์ฉํ์์ ๋
# ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์ธ๋จ
KNN ๋ชจ๋ธ์ ์ด์์ ๊ฐฏ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ์กฐ์ ํด๋ณด๊ธฐ
### KNN ๋ชจ๋ธ์ ์ด์์ ๊ฐฏ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ์กฐ์ ํด๋ณด๊ธฐ
### ์ด์์ ๊ฐฏ์ => ์กฐ์
knr.n_neighbors = 3
### ํ์ดํผํ๋ผ๋ฉํฐ ๊ฐ ์์ ํ ์ฌํ๋ จ ์์ผ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
knr.fit(train_input, train_target)
### ํ๋ จ์ ํ๋ ํ์ธ
train_r2 = knr.score(train_input, train_target)
### ํ
์คํธ(๊ฒ์ฆ) ์ ํ๋ ํ์ธ
test_r2 = knr.score(test_input, test_target)
print(f"ํ๋ จ={train_r2} / ํ
์คํธ={test_r2}")
์์ ๊ฐ์ผ๋ก ์์ธกํ๊ธฐ
๊ธธ์ด 50์ผ๋ก ๋ฌด๊ฒ ์์ธกํ๊ธฐ
### ๊ธธ์ด 50์ผ๋ก ๋ฌด๊ฒ ์์ธกํ๊ธฐ
knr.predict([[50]])
์ฌ์ฉ๋ ์ด์์ ์ธ๋ฑ์ค ํ์ธ
### ์ฌ์ฉ๋ ์ด์์ ์ธ๋ฑ์ค ํ์ธ
dist, indexes = knr.kneighbors([[50]])
indexes
์ฐ์ ๋๋ก ๊ทธ๋ ค๋ณด๊ธฐ
### ์ฐ์ ๋๋ก ๊ทธ๋ ค๋ณด๊ธฐ
plt.scatter(train_input, train_target, c="blue", label="train")
plt.scatter(50, pred[0], marker="^", c="green", label="pred")
plt.scatter(train_input[indexes], train_target[indexes], c="red", label="nei")
plt.xlabel("length")
plt.ylabel("weight")
plt.legend()
plt.show()
### ๊ธธ์ด 100์ผ๋ก ๋ฌด๊ฒ ์์ธกํ๊ธฐ
pred = knr.predict([[100]])
pred
### ์ฌ์ฉ๋ ์ด์์ ์ธ๋ฑ์ค ํ์ธ
dist, indexes = knr.kneighbors([[100]])
indexes
### ์ฐ์ ๋๋ก ๊ทธ๋ ค๋ณด๊ธฐ
plt.scatter(train_input, train_target, c="blue", label="train")
plt.scatter(50, pred[0], marker="^", c="green", label="pred")
plt.scatter(train_input[indexes], train_target[indexes], c="red", label="nei")
plt.xlabel("length")
plt.ylabel("weight")
plt.legend()
plt.show()
KNN์ ํ๊ณ
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ์ด์ฉํด์ ์์ธก์ ์ํํ๋ ๋ชจ๋ธ์ด๊ธฐ์
- ์์ธกํ๊ณ ์ ํ๋ ๋
๋ฆฝ๋ณ์์ ๊ฐ์ด ๊ธฐ์กด ํ๋ จ๋ฐ์ดํฐ์ ๋
๋ฆฝ๋ณ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ณ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋
- ๊ฐ์ด ํญ์ ๋์ผํ๊ฒ ๋์จ๋ค.(๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์ด์์ด ํญ์ ๋์ผํด์ง)
๋ฐ๋ผ์, ๋ค๋ฅธ ํ๊ท๋ชจ๋ธ์ ์ฌ์ฉํด์ผ ํจ
ํ๊ท๋ชจ๋ธ ์ข ๋ฅ
์ ํํ๊ท๋ชจ๋ธ, ๋คํญํ๊ท๋ชจ๋ธ, ๋ค์คํ๊ท๋ชจ๋ธ, ๋ฆฟ์ง, ๋ผ์, ๋๋คํฌ๋ ์คํธ, ๊ทธ๋ ๋์ธํธ๋ถ์คํธ, ํ์คํ ๊ทธ๋จ๊ทธ๋ ๋์ธํธ๋ถ์คํธ, XGBoost, ๊ธฐํ ๋ฑ๋ฑ
์ฃผ๋ก ์ฌ์ฉ๋๋ ํ๊ท๋ชจ๋ธ
๋ฆฟ์ง, ํ์คํ ๊ทธ๋จ๊ทธ๋ ๋์ธํธ๋ถ์คํธ, XGBoost