Programming/etc

[ํ˜ผ๊ณต ๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹] k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ํšŒ๊ท€

mnzy๐ŸŒฑ 2024. 3. 17. 01:03

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์œผ๋กœ ์ค„์—ฌ ์žฌํ›ˆ๋ จํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๊ณผ์†Œ์ ํ•ฉ์„ ํ•ด๊ฒฐํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.