๐Ÿ”ฌ Explore/๋จธ์‹ ๋Ÿฌ๋‹

2์žฅ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

devCloud 2022. 7. 22. 14:58
728x90

๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ฒŒ ์ง€๋„ ํ•™์Šต(supervisid learning)๊ณผ ๋น„์ง€๋„ ํ•™์Šต(unsupervised learning)์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์ง€๋„ ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?
- ์ •๋‹ต(ํƒ€๊นƒ)์ด ์žˆ์œผ๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ •๋‹ต์„ ๋งžํžˆ๋Š” ๊ฒƒ์„ ํ•™์Šตํ•œ๋‹ค.
- ํ›ˆ๋ จํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์™€ ์ •๋‹ต์ด ํ•„์š”ํ•˜๋‹ค.

๋น„์ง€๋„ ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? (6์žฅ์—์„œ ๋‹ค๋ฃธ)
- ํƒ€๊นƒ ์—†์ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
- ๋”ฐ๋ผ์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งžํž ์ˆœ ์—†์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.

์ง€๋„ ํ•™์Šต์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ(input), ์ •๋‹ต์„ ํƒ€๊นƒ(target)์ด๋ผ๊ณ  ํ•˜๊ณ , ์ด ๋‘˜์„ ํ•ฉ์ณ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ(training data)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ์ œ๋Œ€๋กœ ํ‰๊ฐ€ํ•˜๋ ค๋ฉด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์™€ ํ‰๊ฐ€์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ๊ฐ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ์ค€๋น„๋œ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์ผ๋ถ€๋ฅผ ๋–ผ์–ด ๋‚ด์–ด ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ›„์ž์˜ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ •ํ™•ํ•œ ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์„ธํŠธ์™€ ํ›ˆ๋ จ ์„ธํŠธ๊ฐ€ ๋”ฐ๋กœ ์ค€๋น„๋˜์–ด์•ผ ํ•œ๋‹ค.
- Test Set : ํ‰๊ฐ€์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ
- Train Set : ํ›ˆ๋ จ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ


๊ตฌ๊ธ€ ์ฝ”๋žฉ์œผ๋กœ ๋จธ์‹ ๋Ÿฌ๋‹ ์‹ค์Šตํ•˜๊ธฐ

1์žฅ์— ์ด์–ด์„œ ๋„๋ฏธ์™€ ๋น™์–ด๋ฅผ ์ด์šฉํ•ด ์‹ค์Šตํ•˜๊ธฐ


1. ์ƒ์„  ๋ฐ์ดํ„ฐ ์ค€๋น„

fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 
                10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 
                7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

์œ„์˜ ๋ฐ์ดํ„ฐ๋Š” ๋„๋ฏธ์™€ ๋น™์–ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๊ณณ์— ํ•ฉ์นœ ์ฝ”๋“œ๋‹ค. ์ค€๋น„๋œ ์ƒ์„ ์˜ ๋ฌด๊ฒŒ ํŠน์„ฑ๊ณผ ๊ธธ์ด ํŠน์„ฑ์„ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‹ด์€ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

fish_data = [[l,w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14

์ด๋•Œ ํ•˜๋‚˜์˜ ์ƒ์„  ๋ฐ์ดํ„ฐ๋ฅผ Sample์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋„๋ฏธ 35๋งˆ๋ฆฌ์™€ ๋น™์–ด 14๋งˆ๋ฆฌ๋ฅผ ํ•ฉํ•ด์„œ ์ด 49๊ฐœ์˜ ์ƒ˜ํ”Œ์ด ๋ฐ์ดํ„ฐ์— ๋“ค์–ด์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ 35๊ฐœ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ๋กœ, 14๊ฐœ๋ฅผ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
โ–ฃ zip() : ๋‚˜์—ด๋œ ๋ฆฌ์ŠคํŠธ ๊ฐ๊ฐ์—์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

 

2. ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ

k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ํด๋ž˜์Šค๋ฅผ ์ž„ํฌํŠธํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

์ „์ฒด ๋ฐ์ดํ„ฐ์—์„œ 35๊ฐœ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ๋กœ, 14๊ฐœ๋ฅผ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค.
๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด์„œ๋Š” index๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. -> ์˜ˆ์‹œ : fish_data[4] - 3๋ฒˆ์งธ ์ƒ˜ํ”Œ์ด ์ถœ๋ ฅ๋œ๋‹ค.
์ธ๋ฑ์Šค ์™ธ์—๋„ slicing์ด๋ผ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค์™€์˜ ์ฐจ์ด๋Š” ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์Šฌ๋ผ์ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ [์ธ๋ฑ์Šค:์ธ๋ฑ์Šค] -> fish_data[0:5] - 0๋ฒˆ์งธ~4๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ 5๊ฐœ์˜ ์ƒ˜ํ”Œ์ด ์ถœ๋ ฅ๋œ๋‹ค.
์Šฌ๋ผ์ด์‹ฑ์€ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์˜ ์›์†Œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•œ๋‹ค. ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋Š” ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

train_input = fish_data[:35] #ํ›ˆ๋ จ ์„ธํŠธ๋กœ ์ž…๋ ฅ๊ฐ’ ์ค‘ 0๋ถ€ํ„ฐ 34๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ์‚ฌ์šฉ
train_target = fish_target[:35] #ํ›ˆ๋ จ ์„ธํŠธ๋กœ ํƒ€๊นƒ๊ฐ’ ์ค‘ 0๋ถ€ํ„ฐ 34๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ์‚ฌ์šฉ
test_input = fish_data[35:] #ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ์ž…๋ ฅ๊ฐ’ ์ค‘ 35๋ฒˆ์งธ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ์‚ฌ์šฉ
test_target = fish_target[35:] #ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ํƒ€๊นƒ๊ฐ’ ์ค‘ 35๋ฒˆ์งธ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ์‚ฌ์šฉ

์Šฌ๋ผ์ด์‹ฑ์„ ์ด์šฉํ•ด ํ›ˆ๋ จ ์„ธํŠธ 35๊ฐœ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ 14๊ฐœ๋กœ ๋‚˜๋ˆด๋‹ค.

์›ํ•˜๋Š” ๋Œ€๋กœ ๋‚˜๋ˆด์œผ๋‹ˆ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ํ‰๊ฐ€ํ•ด๋ณด์ž.

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

โ–ฃ fit() : ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ๊ทœ์น™์„ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์„ ๋œปํ•˜๋Š” ํ›ˆ๋ จ ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ›ˆ๋ จํ•จ.
โ–ฃ score() : ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, 0~1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 1์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ ๋งžํ˜”๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋Š” 0.0์œผ๋กœ ์ •ํ™•๋„๊ฐ€ 0%์ด๋‹ค. ์–ด๋–ป๊ฒŒ ๋œ ๊ฒƒ์ผ๊นŒ?
์•ž์—์„œ ํ›ˆ๋ จ ์„ธํŠธ์— ๋„๋ฏธ๋งŒ ํฌํ•จ์‹œ์ผฐ์œผ๋ฏ€๋กœ ๋น™์–ด ์—†์ด ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ ๋น™์–ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฅ˜ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๊ณจ๊ณ ๋ฃจ ์„ž์ด๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ์— ์ƒ˜ํ”Œ์ด ๊ณจ๊ณ ๋ฃจ ์„ž์—ฌ ์žˆ์ง€ ์•Š๊ณ  ์ƒ˜ํ”Œ๋ง์ด ํ•œ ์ชฝ์œผ๋กœ ์น˜์šฐ์ณค๋‹ค๋Š” ๊ฒƒ์„ Sampling Bias, ์ƒ˜ํ”Œ๋ง ํŽธํ–ฅ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์„ž๋“ ์ง€ ์•„๋‹ˆ๋ฉด ๊ณจ๊ณ ๋ฃจ ์ƒ˜ํ”Œ์„ ๋ฝ‘์•„์„œ ํ›ˆ๋ จ ์„ธํŠธ์™€ ๋ฐ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ์ž‘์—…์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด numpy ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๋„˜ํŒŒ์ด : ํŒŒ์ด์ฌ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฐ์—ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๊ณ ์ฐจ์›์˜ ๋ฐฐ์—ด์„ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„ํŽธํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr.shape)

โ–ฃ array() : ๋„˜ํŒŒ์ด ํ•จ์ˆ˜์— ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ฆ‰, ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
โ–ฃ shape ์†์„ฑ : ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๋ ค์ค€๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด (์ƒ˜ํ”Œ ์ˆ˜, ํŠน์„ฑ ์ˆ˜)๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š” (49, 2)์ด๋‹ค.

์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ž์ž!
์ฃผ์˜ํ•  ์ ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์ด ์„ ํƒ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฉ๋ฒ•์€ ์ธ๋ฑ์Šค๋ฅผ ์„ž์€ ๋‹ค์Œ ์ž…๋ ฅ๊ณผ ํƒ€๊นƒ ๋ฐฐ์—ด์—์„œ ์ƒ˜ํ”Œ์„ ์„ ํƒํ•˜๋ฉด ๋ฌด์ž‘์œ„๋กœ ํ›ˆ๋ จ ์„ธํŠธ๋ฅผ ๋‚˜๋ˆ„๋Š” ์…ˆ์ด ๋œ๋‹ค.

np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
print(index)

โ–ฃ random.seed() : ๋ฌด์ž‘์œ„ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋“ค์€ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ผ์ •ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ดˆ๊ธฐ์— ๋žœ๋ค์‹œ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
โ–ฃ arange() : ํ•จ์ˆ˜์— ์ •์ˆ˜ N์„ ์ „๋‹ฌํ•˜๋ฉด 0์—์„œ๋ถ€ํ„ฐ N-1๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
โ–ฃ shuffle() : ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฌด์ž‘์œ„๋กœ ์„ž๋Š”๋‹ค.

index ๊ฒฐ๊ณผ

์œ„์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ ๋ณด์ž!
๋„˜ํŒŒ์ด๋Š” ์Šฌ๋ผ์ด์‹ฑ ์™ธ์— Array Indexing์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. 1๊ฐœ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

print(input_arr[[1,3]]) #2๋ฒˆ์งธ์™€ 4๋ฒˆ์งธ ์ƒ˜ํ”Œ์„ ์ถœ๋ ฅ
train_input = input_arr[index[:35]] #์ฒ˜์Œ๋ถ€ํ„ฐ 35๊ฐœ๋ฅผ ์„ ํƒ
train_target = target_arr[index[:35]] #์ฒ˜์Œ๋ถ€ํ„ฐ 35๊ฐœ๋ฅผ ์„ ํƒ

๋žœ๋คํ•˜๊ฒŒ ์„ž์€ ์ธ๋ฑ์Šค์—์„œ 35๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ์„ ํƒํ•ด ํ›ˆ๋ จ ์„ธํŠธ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

print(input_arr[13], train_input[0])

train_input์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋Š” input_arr์˜ ์—ด ๋„ค ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

๋‚˜๋จธ์ง€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋„ ๋งŒ๋“ค์–ด๋ณด์ž!

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

์ด์ œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋๋‹ค. ๊ทธ๋Ÿผ ์‚ฐ์ ๋„๋กœ ํ™•์ธํ•ด๋ณด์ž.

3. ์‚ฐ์ ๋„๋กœ ํ™•์ธ

import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

โ€ป 2์ฐจ์› ๋ฐฐ์—ด์€ ํ–‰๊ณผ ์—ด ์ธ๋ฑ์Šค๋ฅผ ์ฝค๋งˆ๋กœ ๋‚˜๋ˆ„์–ด ์ง€์ •ํ•œ๋‹ค.

ํŒŒ๋ž€์ƒ‰์€ ํ›ˆ๋ จ ์„ธํŠธ, ์ฃผํ™ฉ์ƒ‰์€ ํ…Œ์ŠคํŠธ ์„ธํŠธ์ด๋‹ค. ์˜๋„ํ•œ ๋Œ€๋กœ ์ž˜ ์„ž์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

4. k-Nearest Neighbors ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œ์ผœ ํ‰๊ฐ€ํ•˜๊ธฐ

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

๊ฒฐ๊ณผ๋Š” 1.0์ด๋‹ค. ํ…Œ์ŠคํŠธ ์„ธํŠธ์— ์žˆ๋Š” ๋ชจ๋“  ์ƒ์„ฑ์„ ๋งžํ˜”๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ์˜ˆ์ธก ๊ฒฐ๊ณผ์™€ ์‹ค์ œ ํƒ€๊นƒ์„ ํ™•์ธํ•ด๋ณด์ž!

kn.predict(test_input)
test_target #๊ตฌ๊ธ€ ์ฝ”๋žฉ์€ ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ ์ถœ๋ ฅํ•ด์ค˜์„œ print()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ์•ˆ ํ•จ

โ–ฃ predict() : ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์˜ ์ •๋‹ต์„ ์˜ˆ์ธกํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

test_input๊ณผ test_target์˜ ๊ฒฐ๊ณผ

ํ…Œ์ŠคํŠธ ์„ธํŠธ์— ๋Œ€ํ•œ ์˜ˆ์ธก ๊ฒฐ๊ณผ๊ฐ€ ์ •๋‹ต๊ณผ ์ผ์น˜ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๋ฌธ์ œ์ 
๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๋ชจ๋ธ์—์„œ ๊ธธ์ด๊ฐ€ 25cm, ๋ฌด๊ฒŒ๊ฐ€ 150g์ธ ๋„๋ฏธ๋ฅผ ๋„ฃ์–ด๋ณด๋ฉด ๋น™์–ด๋ผ๊ณ  ์˜ˆ์ธกํ•œ๋‹ค. ๋ชจ๋ธ์„ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์ž.

 

1. ๋„๋ฏธ์™€ ๋น™์–ด ๋ฐ์ดํ„ฐ ์ค€๋น„ํ•˜๊ธฐ

fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 
                10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 
                7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์ƒ์„  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค. ์—ฐ๊ฒฐํ•  2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ํŒŒ์ด์ฌ ํŠœํ”Œ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
โ€ป ํŒŒ์ด์ฌ ํŠœํ”Œ์€ ๋ฆฌ์ŠคํŠธ์™€ ๋งค์šฐ ๋น„์Šทํ•œ๋ฐ, ์ฐจ์ด์ ์€ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ํŠœํ”Œ์€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.

fish_data = np.column_stack((fish_length, fish_weight))
print(fish_data[:5]) #2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž˜ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ

โ–ฃ column_stack() : ์ „๋‹ฌ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ผ๋ ฌ๋กœ ์„ธ์šด ํ›„ ์ฐจ๋ก€๋Œ€๋กœ ๋‚˜๋ž€ํžˆ ์—ฐ๊ฒฐํ•˜๋Š” ๋„˜ํŒŒ์ด ํ•จ์ˆ˜์ด๋‹ค.

fish_data ๋ฐฐ์—ด ๊ฒฐ๊ณผ

๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ๋„ ๋งŒ๋“ ๋‹ค. ์œ„์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณฑํ•ด์„œ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ๋„˜ํŒŒ์ด๋Š” ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
โ€ป ๋ฐ์ดํ„ฐ๊ฐ€ ํด์ˆ˜๋ก ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค๋Š” ๋„˜ํŒŒ์ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํšจ์œจ์ ์ด๋‹ค.

fish_target = np.concatenate((np.ones(35),np.zeros(14)))
print(fish_target)

โ–ฃ ones(), zeros() : ๊ฐ๊ฐ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜์˜ 1๊ณผ 0์„ ์ฑ„์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
โ–ฃ concatenate() : ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์„ ๋”ฐ๋ผ ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
โ€ป concatenate() vs column_stack() : ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋  ๋•Œ ์ฐจ์›์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

fish_target ๊ฒฐ๊ณผ

 

2. ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ ๋‚˜๋ˆ„๊ธฐ

์œ„์—์„œ๋Š” ๋„˜ํŒŒ์ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ง์ ‘ ์„ž์–ด์„œ ๋‚˜๋ˆ„์—ˆ์ง€๋งŒ, ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์ œ๊ณต๋œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target=train_test_split(fish_data,fish_target,random_state=42)
print(train_input.shape, test_input.shape)
print(train_target.shape, test_target.shape)

 

โ–ฃ shape : ๋„˜ํŒŒ์ด ๋ฐฐ์—ด์˜ ์†์„ฑ์œผ๋กœ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โ–ฃ train_test_split() : ์ „๋‹ฌ๋˜๋Š” ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ๋น„์œจ์— ๋งž๊ฒŒ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค. ๋‚˜๋ˆ„๊ธฐ ์ „์—” ์•Œ์•„์„œ ์„ž์–ด ์ค€๋‹ค. ๋‚˜๋ˆ„๊ณ  ์‹ถ์€ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ์›ํ•˜๋Š” ๋งŒํผ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. ์ด ํ•จ์ˆ˜ ๋‚ด์— ์ž์ฒด์ ์œผ๋กœ ๋žœ๋ค ์‹œ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” random_state ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 25%๋ฅผ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋–ผ์–ด ๋‚ธ๋‹ค.

๊ฒฐ๊ณผ

๋„๋ฏธ์™€ ๋น™์–ด๊ฐ€ ์ž˜ ์„ž์˜€๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

print(test_target)

test_target ๊ฒฐ๊ณผ

13๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์„ธํŠธ ์ค‘ 10๊ฐœ ๋„๋ฏธ, 3๊ฐœ๊ฐ€ ๋น™์–ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›๋ž˜ ๋‘ ์ƒ์„ ์˜ ๋น„์œจ์ด 2.5:1์ธ๋ฐ, ์œ„์˜ ๊ฒฐ๊ณผ๋Š” 3.3:1๋กœ ๋น™์–ด์˜ ๋น„์œจ์ด ๋ชจ์ž๋ผ๋‹ค. ์ƒ˜ํ”Œ๋ง ํŽธํ–ฅ์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์ƒ˜ํ”Œ๋ง ํŽธํ–ฅ์ด ์ผ์–ด๋‚˜๋ฉด ๋ชจ๋ธ์ด ์ผ๋ถ€ ์ƒ˜ํ”Œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค ๋น„์œจ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

train_input, test_input, train_target, test_target = 
       train_test_split(fish_data, fish_target, stratify=fish_target,random_state=42)
print(test_target)

โ–ฃ stratify : ํด๋ž˜์Šค ๋น„์œจ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ํŠน์ • ํด๋ž˜์Šค์˜ ์ƒ˜ํ”Œ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

test_target ๊ฒฐ๊ณผ

๊ทธ ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ๋น„์œจ์ด 2.25:1์ด ๋๋‹ค. ๋น„์œจ์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถœ ์ˆœ ์—†์ง€๋งŒ ๊ทผ์ ‘ํ•œ ๋น„์œจ์ด ๋๋‹ค.

 

 

3. k-Nearest Neighbors ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œ์ผœ ํ‰๊ฐ€ํ•˜๊ธฐ

โ€ป k-์ตœ๊ทผ์ ‘ ์ด์›ƒ์€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํ›ˆ๋ จ์˜ ์ „๋ถ€๋‹ค.

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)

๊ฒฐ๊ณผ๋Š” 1.0์œผ๋กœ, ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ๋„๋ฏธ์™€ ๋น™์–ด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ–ˆ๋‹ค.

์ด์ œ ์ฒ˜์Œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋˜ ์ƒˆ๋กœ์šด ๋„๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

print(kn.predict([[25,150]]))

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋Š” [0.]์ด ์ถœ๋ ฅ๋๋‹ค. ์›๋ž˜๋Š” 1์ด ๋‚˜์™€์•ผ ์ •์ƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๊ฑด์ง€ ์‚ฐ์ ๋„๋กœ ํ™•์ธํ•ด๋ณด์ž.

import matplotlib.pyplot as plt
distances, indexes = kn.kneighbors([[25,150]])

plt.scatter(train_input[:,0],train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0],train_input[indexes,1],marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
โ–ฃ kneighbors() : ์ฃผ์–ด์ง„ ์ƒ˜ํ”Œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ์„ ์ฐพ์•„ ์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋กœ, KNeighborsClassifier ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•œ๋‹ค. ํด๋ž˜์Šค์˜ ์ด์›ƒ ๊ฐœ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 5๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ดˆ๋ก์ƒ‰ ๋งˆ๋ฆ„๋ชจ๋Š” ์‚ผ๊ฐํ˜• ์ƒ˜ํ”Œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด 5๊ฐœ์˜ ์ƒ˜ํ”Œ์ด๋‹ค. ์ง๊ด€์ ์œผ๋กœ ๋ดค์„ ๋•Œ 1๊ฐœ๋Š” ๋„๋ฏธ์˜ ๋ฐ์ดํ„ฐ์™€ ๋” ๊ฐ€๊น๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋จธ์ง€ ์ƒ˜ํ”Œ 4๊ฐœ๋Š” ๋ชจ๋‘ ๋น™์–ด๋กœ ํ‘œ์‹œ๋œ๋‹ค. ํ™•์‹คํ•˜๊ฒŒ ์•Œ๊ธฐ ์œ„ํ•ด ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

print(distances)

โ–ฃ distances : ์ด์›ƒ ์ƒ˜ํ”Œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๋ฐฐ์—ด์ด๋‹ค. ์œ„์—์„œ kneighbors()๋ฉ”์„œ๋“œ์— ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒˆ์งธ ์ƒ˜ํ”Œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ 92์ด๊ณ , ๋‚˜๋จธ์ง€ 4๊ฐœ๋Š” ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์•ผ ์ง๊ด€์ ์œผ๋กœ ๋ดค์„ ๋•Œ ์ •์ƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๊ฑฐ๋ฆฌ ๋น„์œจ์ด ์ด์ƒํ•œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์œ ๋Š” ๋ฌด๊ฒŒ์™€ ๊ธธ์ด ๋น„์œจ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. x์ถ•์€ ๋ฒ”์œ„๊ฐ€ ์ข๊ณ , ๊ทธ์— ๋น„ํ•ด y์ถ•์€ ๋ฒ”์œ„๊ฐ€ ์•„์ฃผ ๋„“๋‹ค.

๊ทธ๋Ÿผ ๋น„์œจ์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”์ž.

plt.scatter(train_input[:,0],train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0],train_input[indexes,1],marker='D')
plt.xlim((0,1000))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

โ–ฃ xlim(), ylim() : x์ถ•๊ณผ y์ถ• ๋น„์œจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, ์‚ฐ์ ๋„๊ฐ€ ์ˆ˜์ง์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‘ ํŠน์„ฑ(๊ธธ์ด,๋ฌด๊ฒŒ)์˜ ๊ฐ’์ด ๋†“์ธ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅธ๋ฐ, ์ด๋ฅผ ๋‘ ํŠน์„ฑ์˜ ์Šค์ผ€์ผ(scale)์ด ๋‹ค๋ฅด๋‹ค๊ณ ๋„ ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์„ฑ๊ฐ’์„ ์ผ์ •ํ•œ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ ์ค˜์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ(data processing)๋ผ๊ณ  ํ•œ๋‹ค.

๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ํ‘œ์ค€์ ์ˆ˜์ด๋‹ค.(z ์ ์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.) ํ‘œ์ค€์ ์ˆ˜๋Š” ๊ฐ ํŠน์„ฑ๊ฐ’์ด ํ‰๊ท ์—์„œ ํ‘œ์ค€ํŽธ์ฐจ์˜ ๋ช‡ ๋ฐฐ๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ‰๊ท ์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๋‚˜๋ˆˆ๋‹ค.

๋”๋ณด๊ธฐ

โŠ™ ๋ถ„์‚ฐ์€ ๋ฐ์ดํ„ฐ์—์„œ ํ‰๊ท ์„ ๋บ€ ๊ฐ’์„ ๋ชจ๋‘ ์ œ๊ณฑํ•œ ๋‹ค์Œ ํ‰๊ท ์„ ๋‚ด์–ด ๊ตฌํ•œ๋‹ค.

โŠ™ ํ‘œ์ค€ํŽธ์ฐจ๋Š” ๋ถ„์‚ฐ์˜ ์ œ๊ณฑ๊ทผ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‚ฐ๋œ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

โŠ™ ํ‘œ์ค€์ ์ˆ˜๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์›์ ์—์„œ ๋ช‡ ํ‘œ์ค€ํŽธ์ฐจ๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis=0)

โ–ฃ mean() : ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ๋„˜ํŒŒ์ด์—์„œ ์ œ๊ณตํ•œ๋‹ค.
โ–ฃ std() : ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ๋„˜ํŒŒ์ด์—์„œ ์ œ๊ณตํ•œ๋‹ค.
ํŠน์„ฑ๋งˆ๋‹ค ๊ฐ’์˜ ์Šค์ผ€์ผ์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋Š” ๊ฐ ํŠน์„ฑ๋ณ„๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด axis = 0์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ–‰์„ ๋”ฐ๋ผ ๊ฐ ์—ด์˜ ํ†ต๊ณ„ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฐ ํŠน์„ฑ๋งˆ๋‹ค ํ‰๊ท ์€ [ 27.29722222 454.09722222]์ด๊ณ , ํ‘œ์ค€ํŽธ์ฐจ๋Š” [ 9.98244253 323.29893931]์ด๋‹ค.

์ด์ œ ์›๋ณธ ๋ฐ์ดํ„ฐ์—์„œ ํ‰๊ท ์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆ  ํ‘œ์ค€์ ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด๋ณด์ž.

train_scaled = (train_input - mean) / std



๋„˜ํŒŒ์ด๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ชจ๋“  ํ–‰์—์„œ ๋‘ ํ‰๊ท ๊ฐ’์„ ๋นผ์ฃผ๊ณ , ๋‘ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๋‹ค์‹œ ๋ชจ๋“  ํ–‰์— ์ ์šฉํ•œ๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์ด๋ผ๊ณ  ํ•œ๋‹ค.
broadcasting : ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ๋ชจ์–‘์ด ๋‹ค๋ฅธ ๋ฐฐ์—ด ๊ฐ„์˜ ์—ฐ์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 

4. ์ „์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ ํ›ˆ๋ จํ•˜๊ธฐ

ํ‘œ์ค€์ ์ˆ˜๋กœ ๋ณ€ํ™˜ํ–ˆ์œผ๋‹ˆ ์ƒ˜ํ”Œ์„ ๋‹ค์‹œ ์‚ฐ์ ๋„๋กœ ๊ทธ๋ ค๋ณด์ž!

new = ([25,150]- mean)/std
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

โ€ป new = ([25,150]- mean)/std ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š” x์ถ•๊ณผ y์ถ• ๋ฒ”์œ„๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

 
์‚ฐ์ ๋„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ๋‘ ํŠน์„ฑ์ด ๋น„์Šทํ•œ ๋ฒ”์œ„๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค. 
 
๊ทธ๋Ÿผ ์ด์ œ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•œ ํ›„ ํ‰๊ฐ€ํ•ด๋ณด์ž.
kn.fit(train_scaled, train_target)
test_scaled = (test_input - mean)/std
kn.score(test_scaled, test_target)
print(kn.predict([new]))

๋ชจ๋ธ์˜ ํ‰๊ฐ€ ๊ฒฐ๊ณผ๋Š” 1์ด๊ณ , ๋„๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ 1์ด ๋„์ถœ๋๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฐ์ ๋„๋ฅผ ๊ทธ๋ ค๋ณด์ž.

distances, indexes = kn.kneighbors([new])
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.scatter(train_scaled[indexes,0],train_scaled[indexes,1],marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

๊ทธ ๊ฒฐ๊ณผ, ๋„๋ฏธ ์ƒ˜ํ”Œ๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด 5๊ฐœ ์ƒ˜ํ”Œ์ด ๋ชจ๋‘ ๋„๋ฏธ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ์Šค์ผ€์ผ์ด ๋‹ค๋ฅธ ํŠน์„ฑ์„ ์ž˜ ์ฒ˜๋ฆฌํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

728x90