๋ฐ์ํ
K-์ต๊ทผ์ ์ด์ ํ๊ท
- K-์ต๊ทผ์ ์ด์ ํ๊ท์ ๋ฐํ์ฌ ์ค๋ช ์ ๋๋ฆฌ๊ธฐ ์ ์, ํ๊ท์ ๋ํ์ฌ ์ค๋ช ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ํ๊ท(Regression)์ ์ง๋ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ์ค ํ๋์ด๋ฉฐ, Sample์ ๋ช๊ฐ์ Class์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
- ์ง๋ํ์ต ์๊ณ ๋ฆฌ์ฆ์ค ํ๋์ธ ๋ถ๋ฅ์ ๋๊ฐ์ด ์์ธกํ๋ ค๋ Sample์ ๊ฐ์ฅ ๊ฐ๊น์ด Sample K๊ฐ๋ฅผ ์ ํํฉ๋๋ค.
- ๊ทธ๋ฆผ์์ ๋ณด์ฌ๋๋ ธ๋ฏ์ด, ์๋ฅผ ๋ค๋ฉด ์ํ X์ Target๊ฐ์ ๊ตฌํ๋ ค๊ณ ํฉ๋๋ค. ๊ฐ๊ฐ ์ด์ํ ์ํ์ ํ๊ฒ๊ฐ์ด 100, 80, 60 ์ด๋ฉด, ์ด๋ฅผ ํ๊ท ํํ๋ฉด, Sample X์ ์์ธก Target๊ฐ์ 80์ด ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์ค๋น
์ด๋ฒ์๋ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ Numpy ๋ฐฐ์ด๋ก ๋ฐ๋ก ๋ง๋ค์ด์ ๋ณํํด๋ณด๊ฒ ์ต๋๋ค.
- ๋์ด์ ๊ธธ์ด๋ฅผ ํน์ฑ, ๋ฌด๊ฒ๋ฅผ Target์ผ๋ก ํ๊ฒ ์ต๋๋ค.
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])
- ์ผ๋จ ์ด ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํํ๋ฅผ ๋๊ณ ์๋์ง ํ์ ์ ํด์ผํฉ๋๋ค.
- ํ๋์ ํน์ฑ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํน์ฑ ๋ฐ์ดํฐ๋ฅผ x์ถ, Target ๋ฐ์ดํฐ๋ฅผ y์ถ์ ๋๊ณ scatter() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ ๋๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
import matplotlib.pyplot as plt
plt.scatter(perch_length, perch_weight) # perch_weight(target)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
- ๋์ด์ ๊ธธ์ด๊ฐ ์ปค์ง๋ฉด, ๋ฌด๊ฒ๋ ๋์ด๋๋ค๋๊ฒ์ ๊ทธ๋ํ๋ฅผ ํตํด์ ํ์ธ์ ํ์์ต๋๋ค.
- ML ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ Training Set ์ Test Set ๋ก ๋๋๋๋ค.
# ์์์ ์์น (๋์ด์ ๋ฌด๊ฒ ์ธก์ )
# Scikit-learn ํ๋ จ์ธํธ๋ 2์ฐจ์ ๋ฐฐ์ด์ด์ฌ์ผ ํจ์ผ๋ก, Numpy์ reshape method๋ฅผ ์ฌ์ฉํด์ 2์ฐจ์์ผ๋ก ๋ด๊ฟ์ค
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)
์ฌ๊ธฐ์ ๊ธฐ์ตํด์ผ ํ ์ ์ด ์์ต๋๋ค. Scikit-learn ์ ์ฌ์ฉํ ํ๋ จ ์ธํธ๋ 2์ฐจ์ ๋ฐฐ์ด์ด์ฌ์ผ ํ๋ค๋ ์ ์ ๋๋ค.
- perch_length๊ฐ 1์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก, ์ด๋ฅผ ๋๋ train_input & test_input๋ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- Scikit-learn์ ์ฌ์ฉํ๋ ค๋ฉด 2์ฐจ์ ๋ฐฐ์ด์ด ๋์ด์ผ ํจ์ผ๋ก reshape() Method๋ฅผ ์ฌ์ฉํ์ฌ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ด๊พธ์ด ๋ณด๊ฒ ์ต๋๋ค.
- reshape() Method๋ ๋ด๊พธ๋ ค๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง ์๋ณธ ๋ฐฐ์ด์ ์์์ ํฌ๊ธฐ์ ์ง์ ํ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํด์ ๋ณํ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
# test_array์ ๋ฐฐ์ด ํ์ธ
test_array = np.array([1,2,3,4])
print(test_array.shape)
# (2,2)
# reshape()๋ฅผ ์ฌ์ฉํด์ train_input & test_input์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ด๊ฟ
train_input = train_input.reshape(-1, 1) # ์ด์ด ํ๋, ๋จ์ ์ฐจ์์ ๊ฐ์๋ ํ๋๊ฐ ๋๋ค.
test_input = test_input.reshape(-1, 1)
print(train_input.shape, test_input.shape)
๊ฒฐ์ ๊ณ์
- Scikit-learn์์ K-์ต๊ทผ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ Class๋ KNeighborsRegressor ์ ๋๋ค.
- ์ฌ์ฉ๋ฒ์ KNeighborsClassifier์ ๋น์ทํฉ๋๋ค.
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor() # class ๊ฐ์ฒด ํ ๋น
# k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
knr.fit(train_input, train_target) # train, target ๋ฐ์ดํฐ ์ ๋ฌ & ํ๋ จ
knr.score(test_input, test_target) # test_set ์ ์ ํ์ธ(์ ํ๋)
0.992809406101064
๊ฒฐ์ ๊ณ์ ๊ตฌํ๋ ๊ณต์: R**2 = 1 - (test_target - test_input)**2 / (test_target - test_target_mean)**2
R**2๋ 0์ ๊ฐ๊น์์ง๋๋ค. ๋ง์ฝ ์์ธก์ด Target์ ๊ฐ๊น์์ง๋ฉด? - R2๋ ๋ถ์๊ฐ 0์ ๊ฐ๊น์์ ธ์ 1์ ๊ฐ๊น์ด ๊ฐ์ด ๋ฉ๋๋ค.
- ์ ํ๋๊ฐ 0.99์ด๋ฉด ์ข์ํธ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด๋ฒ์๋ Target๊ฐ๊ณผ ์์ธกํ ๊ฐ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฐฉ์์ ์ด๋์ ๋ ์์ธก์ด ๋ฒ์ด๋ฌ๋์ง๋ฅผ ํ๋จํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด๋ด๋์๋ Scikit-learn์์๋ sklearn.metrics ํจํค์ง ์๋ ์ฌ๋ฌ๊ฐ์ง ์ธก์ ๋๊ตฌ์ค mean_absolute_error ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ด ๋๊ตฌ๋ Target๊ณผ ์์ธก์ ์ ๋๊ฐ ์ค์ฐจ๋ฅผ ํ๊ท ๋ด์ด์ ๋ฐํํฉ๋๋ค.
# mean_absolute_error (ํ๊ท ์ ๋๊ฐ ์ค์ฐจ-์ด๋ฌํ ์ธก์ ์งํ๋ค์ด sklearn์์ metrics library์ ์กด์ฌ)
from sklearn.metrics import mean_absolute_error
test_prediction = knr.predict(test_input) # Test_input์ผ๋ก ์์ธกํ ๊ฐ
mae = mean_absolute_error(test_target, test_prediction) # Target & Test_prediction ์ผ๋ก ์์ธกํ๊ฐ
print(mae) # 19g ์ ๋๋ก ์ฐจ์ด๊ฐ ๋๋ค.
19.157142857142862
- ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ณด๋ฉด ์์ธก์ด ํ๊ท ์ ์ผ๋ก 19g ์ ๋ Target๊ฐ๊ณผ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ณผ๋์ ํฉ vs ๊ณผ์์ ํฉ
์์์ ํ๋ จํ ๋ชจ๋ธ์ ์ฌ์ฉํด Training_set์ Test_set์ R**2 ์ ์๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
knr.score(train_input, train_target)
0.9698823289099254
knr.score(test_input, test_target)
0.992809406101064
- ๊ทผ๋ฐ, ์ด ์ ์์์ ์ด์ํ ์ ์ด ์์ต๋๋ค. ๋ณดํต ๋ชจ๋ธ์ ํ๋ จ์ธํธ์์ ํ๋ จ์ ํ๋ฉด Training_set์ ์ ์๊ฐ ์กฐ๊ธ ๋ ๋๊ฒ ๋์ต๋๋ค.
๋ง์ฝ Training_set์์ ์ ์๊ฐ ์ข์๋๋ฐ, Test_set์์ ์ ์๊ฐ ๋ฎ์ผ๋ฉด Model์ด Training_set์ ๊ณผ๋์ ํฉ(Overfitting) ๋์๋ค๊ณ ํฉ๋๋ค.
๋ฐ๋๋ก, Training_set๋ณด๋ค Test_set์ ์ ์๊ฐ ๋๊ฑฐ๋, ๋ ์ ์๊ฐ ๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ๋ Model์ด Training_set์ ๊ณผ์์ ํฉ(Underfitting)๋์๋ค๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ ํ๋ฒ ๋ค์ ๋ณด๊ฒ ์ต๋๋ค. ํ์ฌ K-์ต๊ทผ์ ์ด์ ํ๊ท๋ก ํ๊ฐํ Training_set์ Test_set์ ์ ์๋ ์ด๋ค๊ฐ์?
- Training_set๋ณด๋ค Test_set์ ์ ์๊ฐ ๋ ๋์ผ๋ ๊ณผ์์ ํฉ. Underfitting ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ํ์์ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?
- ๋ชจ๋ธ์ ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ฉด ๋ฉ๋๋ค. K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ชจ๋ธ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ด์์ ๊ฐ์. ์ฆ k๊ฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค.
- scikit-learn์ k-์ต๊ทผ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ k๊ฐ์ 5์ ๋๋ค. ํ๋ฒ k๊ฐ์ 3์ผ๋ก ์ค์ฌ๋ณด๊ฒ ์ต๋๋ค.
# ์ด์์ ๊ฐ์๋ฅผ 3์ผ๋ก ์ค์
knr.n_neighbors = 3
# ๋ชจ๋ธ์ ๋ค์ ํ๋ จ
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
0.9804899950518966
print(knr.score(test_input, test_target))
0.9746459963987609
- K๊ฐ์ ์ค์๋๋, Training_Set์ ์ ์๊ฐ ์ฌ๋ผ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋์ ๋ ๊ณผ์์ ํฉ (Underfitting)๋ฌธ์ ๋ ์ด๋์ ๋ ํด๊ฒฐ ๋์๋ค๊ณ ๋ณผ ์ ์๊ฒ ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Test_set๊ณผ์ ์ฐจ์ด๋ ํฌ์ง ์์ผ๋ฏ๋ก, ๊ณผ๋์ ํฉ๋ ์ด๋์ ๋ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ฐ์ ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ๊ฒฐ๊ณผ๋ ์ด๋ ์ต๋๋ค.
plt.scatter(train_input, train_target)
plt.scatter(test_input, test_target)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Keywords
- ํ๊ท๋ ์์์ ์์น๋ฅผ ์์ธกํ๋ ๋ฌธ์ ์ ๋๋ค. ๋ฐ๋ผ์ ํ๊น๊ฐ๋ ์์์ ์์น๊ฐ ๋ฉ๋๋ค.
- k-์ต๊ทผ์ ์ด์ ํ๊ท๋ k-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์์ฉํด ํ๊ท ๋ฌธ์ ๋ฅผ ํ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ์ด ์ ์ํ์ ์ฐพ๊ณ ์ด ์ํ๋ค์ ํ๊น๊ฐ์ ํ๊ท ํ์ฌ ์์ธก์ผ๋ก ์ผ์ต๋๋ค.
- ๊ฒฐ์ ๊ณ์(R2)๋ ๋ํ์ ์ธ ํ๊ท ๋ฌธ์ ์ ์ฑ๋ฅ ์ธก์ ๋๊ตฌ์ ๋๋ค. 1์ ๊ฐ๋ผ์ธ์๋ก ์ข๊ณ , 0์ ๊ฐ๊น ๋ค๋ฉด ์ฑ๋ฅ์ด ๋์๋ชจ๋ธ์ ๋๋ค.
- ๊ณผ๋์ ํฉ์ ๋ชจ๋ธ์ ํ๋ จ ์ธํธ ์ฑ๋ฅ์ด ํ์คํธ ์ธํธ ์ฑ๋ฅ๋ณด๋ค ํจ์ฌ ๋์ ๋ ์ผ์ด๋ฉ๋๋ค. ๋ชจ๋ธ์ด ํ๋ จ ์ธํธ์ ๋๋ฌด ์ง์ฐฉํด์ ๋ฐ์ดํฐ์ ๋ด์ฌ๋ ๊ฑฐ์์ ์ธ ํจํด์ ๊ฐ์งํ์ง ๋ชปํฉ๋๋ค. ๊ณผ์์ ํฉ์ ์ด์ ๋ฐ๋์ ๋๋ค. ํ๋ จ ์ธํธ์ ํ์คํธ ์ธํธ ์ฑ๋ฅ์ด ๋ชจ๋ ๋์ผํ๊ฒ ๋ฎ๊ฑฐ๋ ํ ์คํธ ์ธํธ ์ฑ๋ฅ์ด ์คํ๋ ค ๋ ๋์๋ ์ผ์ด๋ฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ ๋ณต์กํ๋ชจ๋์์ฌ์ฉํด ํ๋ จ ์ธํธ์ ์๋ง๋๋ชจ๋ธ ์๋ง๋ค์ด์ผํฉ๋๋ค.
ํต์ฌ ํจํค์ง์ ํจ์
Scikit-learn
- KNeighborsRegressor๋ k-์ต๊ทผ์ ์ด์ ํ๊ท ๋ชจ๋์ ๋ง๋๋ ์ฌ์ดํท๋ฐ ํด๋์ค์ ๋๋ค. n_neighbors ๋งค๊ฐ๋ณ์๋ก ์ด์์ ๊ฐ์๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 5์ ๋๋ค.
- ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ KNeighborsClassifier ํด๋์ค์ ๊ฑฐ์ ํต์ผํฉ๋๋ค.
- mean_absolute_error()๋ ํ๊ท ๋ชจ๋์ ํ๊ท ์ ๋ฉ๊ฐ ์ค์ฐจ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ ์๋ ํ๊น, ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์์ธก๊ฐ์ ์ ๋ฌํฉ๋๋ค. ์ด์ ๋น์ทํ ํจ์๋ก๋ ํ๊ท ์ ๊ณฑ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ mean_squared_error() ๊ฐ ์์ต๋ ๋ค.
- ์ด ํจ์๋ ํ๊น๊ณผ ์์ธก์ ๋บ ๊ฐ์ ์ ๊ณฑํ ๋ค์ ์ ์ฒด ์ํ์ ๋ํด ํ๊ท ํ ๊ฐ์ ๋ฐํํฉ๋๋ค.
Numpy
- reshape()๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ๋ ๋ฉ์๋์ ๋๋ค. ๋น๊พธ๊ณ ์ ํ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค. ๋ฐ๊พธ๊ธฐ ์ ํ์ ๋ฐฐ์ด ์์ ๊ฐ์๋ ๋์ผํด์ผ ํฉ๋๋ค.
- Numpy๋ ์ข ์ข ๋ฐฐ์ด์ ๋ฉ์๋์ ๋์ผํ ํจ์๋ฅผ ๋ณ๋๋ก ์ ๊ณตํฉ๋๋ค. ์ด๋ ํจ์์ ์ฒซ ๋ฒ ์งธ ๋งค๊ฐ๋ณ์๋ ๋ฐ๊พธ๊ณ ์ ํ๋ ๋ฐฐ์ด์ ๋๋ค. ์๋ฅผ ๋ค์ด test_array.reshape (2, 2)๋ np.reshape (test_array, (2, 2))์๊ฐ์ด ๋ฐ๊ฟ ์ธ์ ์์ต๋๋ค.
๋ฐ์ํ
'๐น๏ธ ํผ๊ณต๋จธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ML] ํน์ฑ ๊ณตํ๊ณผ ๊ท์ (0) | 2023.09.24 |
---|---|
[ํผ๊ณต๋จธ์ ] Linear Regression (0) | 2023.09.23 |
[ํผ๊ณต๋จธ์ ] ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ [๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ] (0) | 2023.09.18 |
[ํผ๊ณต๋จธ์ ] ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ [๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ] (0) | 2023.09.18 |
[ํผ๊ณต๋จธ์ ] ๋์ ์ฒซ ๋จธ์ ๋ฌ๋ (0) | 2023.09.11 |