A A
[ํ˜ผ๊ณต๋จธ์‹ ] ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ [๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ]

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ž€?

  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋Š” ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ๋ชจ๋“  ์ธ๊ณต์ง€๋Šฅ ๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์ „์—, ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ข‹๊ฒŒ ๊ฐ€๊ณตํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

Numpy๋กœ Data ์ค€๋น„ํ•˜๊ธฐ

  • ํ•œ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๋„๋ฏธ, ๋น™์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
# ์ƒ์„ ์˜ ๊ธธ์ด
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]
import numpy as np
fish_data = np.column_stack((fish_length, fish_weight))
์—ฌ๊ธฐ์„œ column_stack() ํ•จ์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Numpy์˜ column_stack() ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ผ๋ ฌ๋กœ ์„ธ์šด ๋‹ค์Œ ์ฐจ๋ก€๋Œ€๋กœ ๋‚˜๋ž€ํžˆ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚˜๋ž€ํžˆ ๋ถ™์—ฌ์„œ ํŠœํ”Œ(tuple)ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
np.column_stack(([1,2,3], [4,5,6]))
array([[1, 4],
           [2, 5],
           [3, 6]])
  • ์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ fish_length์™€ fish_weight๋ฅผ ํ•ฉ์ณ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
# column_stack: ์ „๋‹ฌ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ผ๋ ฌ๋กœ ์„ธ์šด ํ›„, ์ฐจ๋ก€๋Œ€๋กœ ๋‚˜๋ž€ํžˆ ์—ฐ๊ฒฐ
fish_data = np.column_stack((fish_length, fish_weight))
print(fish_data[:5])
  • ์‚ดํ–‰ํ•ด ๋ณด์…จ์œผ๋ฉด ์•„์‹œ๊ฒ ์ง€๋งŒ, Numpy ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ, ํ•œ์ค„๋กœ ๊ธธ๊ฒŒ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ , ํ–‰๊ณผ ์—ด์„ ๋งž์ถ”์–ด์„œ ๊ฐ€์ง€๋Ÿฐํ•œ ๋ชจ์Šต์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ์ „์—๋Š” ์›์†Œ๊ฐ€ ํ•˜๋‚˜์ธ list [1], [0]์„ ์—ฌ๋Ÿฌ๋ฒˆ ๊ณฑํ•ด์„œ Target Data๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, Numpy์—๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ np.ones() ์™€ np.zeros() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜์˜ 1๊ณผ 0์„ ์ฑ„์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
print(np.ones(5))
# [1,1,1,1,1]
  • ์ด๋ ‡๊ฒŒ, ๋‘ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด 1์ด 35์ธ ๋ฐฐ์—ด๊ณผ 0์ด 14์ธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋‘ ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ ์ฐจ์›์„ ๋”ฐ๋ผ ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ•˜๋Š” np.concatenate()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

np.column_stack() ํ•จ์ˆ˜์™€ np.concatenate() ํ•จ์ˆ˜์˜ ์—ฐ๊ฒฐ๋ฐฉ์‹

์ด์ œ, np.concatenate()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Target data๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์—ฐ๊ฒฐํ•œ list๋‚˜ array๋„ ํŠœํ”Œ๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
# target data ๋งŒ๋“ค๊ธฐ: concatenate ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ 2๊ฐœ์˜ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
print(fish_target)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
  • ์ด ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ, ๋งŒ์•ฝ์— ๋ฐ์ดํ„ฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ๋Š” Python list๋กœ ์ž‘์—…ํ•˜๋Š”๊ฑด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ž˜์„œ Numpy ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Scikit-learn์œผ๋กœ Training_set์™€ Test_set ๋‚˜๋ˆ„๊ธฐ

  • ์ „์—๋Š” Numpy ๋ฐฐ์—ด์˜ index๋ฅผ ์ง์„ญ ์„ž์–ด์„œ training_set, test_set๋ฅผ ๋‚˜๋ˆ„์—ˆ์ง€๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ๋ฒˆ๊ฑฐ๋Ÿฌ์šฐ๋ฏ€๋กœ, ์ข€ ๋” ์„ธ๋ จ๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • Scikit-learn์€ ๋จธ์‹ ๋Ÿฌ๋‹(ML) ๋ชจ๋ธ์„ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์ด์ œ ์‚ฌ์šฉํ•ด ๋ณผ train_test_split()ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ๋˜๋Š” ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ๋น„์œจ์— ๋งž์ถฐ์„œ training_set์™€ test_set๋กœ ๋‚˜๋ˆ„์–ด ์ค๋‹ˆ๋‹ค.
# scikit_learn์œผ๋กœ data ๋‚˜๋ˆ„๊ธฐ
# fish_data, fish_target data ๋ฅผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• 
from sklearn.model_selection import train_test_split

# stratify=fish_target: ๋ถ„ํ•  ์‹œ ํด๋ž˜์Šค์˜ ๋น„์œจ์„ ์œ ์ง€(๋ถ„๋ฅ˜ ์ž‘์—…์‹œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ)
# random_state=42: ๋žœ๋ค์„ฑ์„ ์ œ์–ด (๋ฐ์ดํ„ฐ ๋ถ„ํ• ์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€)
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)

 

  • ํ•œ๋ฒˆ Numpy ๋ฐฐ์—ด์˜ shape ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ์ž…๋ ฅ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
print(train_input.shape, test_input.shape)
# (36,2) (13,2)
print(train_target.shape, test_target.shape)
# (36.) (13.)
  • ๋ณด๋‹ˆ๊นŒ, ์ด์ „์— ๋ณธ ์ƒ˜ํ”Œ๋ง ํŽธํ–ฅ์ด ์กฐ๊ธˆ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋ฌด์ž‘์œ„๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ, sample์ด ๊ณจ๊ณ ๋ฃจ ์„ž์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ผ๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ, ์ฃผ๋กœ ์ด๋Ÿฐ์ผ์ด ์ƒ๊น๋‹ˆ๋‹ค. 
  • Training_set์™€ Test_set์˜ ํด๋ž˜์Šค ๋น„์œจ์ด ์ผ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋ธ์ด ์ผ๋ถ€ ์ƒ˜ํ”Œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿด๋•Œ, stratify ๋งค๊ฐœ๋ณ€์ˆ˜์— ํƒ€๊ฒŸ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํด๋ž˜์Šค ๋น„์œจ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ƒํ•œ ๋„๋ฏธ ํ•œ๋งˆ๋ฆฌ

  • ์•ž์—์„œ ์ค€๋น„ํ•œ ๋ฐ์ดํ„ฐ๋กœ K-์ตœ๊ทผ์ ‘ ์ด์›ƒ์„ ํ›ˆ๋ จํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
# ์ˆ˜์ƒํ•œ ๋„๋ฏธ ์ฐพ๊ธฐ ์‹œ์ž‘
# k-์ตœ๊ทผ์ ‘ ์ด์›ƒ
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target) 
kn.score(test_input, test_target)
  • ํ›ˆ๋ จ์„ ์‹œํ‚ค๊ณ , ๋„๋ฏธ ๋ฐ์ดํ„ฐ(1)๋ฅผ ๋„ฃ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋‹น์—ฐํžˆ ๋„๋ฏธ(1)์ด ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ..?
print(kn.predict([[25, 150]]))
# ๋„๋ฏธ ์ฐพ์•„์•ผ ํ•˜๋Š”๋ฐ ๋น™์–ด๊ฐ€ ๋‚˜์˜ด(0)
  • ํ•˜์ง€๋งŒ, ๋น™์–ด ๋ฐ์ดํ„ฐ(0)์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์•Œ์•„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ ํ•œ๋ฒˆ ์‚ฐ์ ๋„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import matplotlib.pyplot as plt

plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^') # marker ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ชจ์–‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

  • ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด, ์ด sample์€ ๋ถ„๋ช…ํžˆ ์˜ค๋ฅธ์ชฝ ์œ„๋กœ ๋ป—์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ๋„๋ฏธ ๋ฐ์ดํ„ฐ์— ๋” ๊ฐ€๊นŒ์šด๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ํŒ๋‹จ ํ–ˆ์„๊นŒ์š”?
  • K-์ตœ๊ทผ์ ‘ ์ด์›ƒ์€ ์ฃผ๋ณ€์˜ Sample์ค‘ ๋‹ค์ˆ˜์ธ ํด๋ž˜์Šค๋ฅผ ์˜ˆ์ธก์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. KNeighborsClassifier ํด๋ž˜์Šค๋Š” ์ฃผ์–ด์ง„ ์ƒ˜ํ”Œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ์„ ์ฐพ์•„ ์ฃผ๋Š” kneighbors() Method๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด Method๋Š” ์ด์›ƒ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์™€ ์ด์›ƒ Sample์˜ index๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ, indexes ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ์ด์›ƒ(Neighbors)์ƒ˜ํ”Œ์„ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
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') #indexes: ๋ฐฐ์—ด indexing
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

๊ธฐ์ค€์„ ๋งž์ถฐ๋ผ

  • ํ•œ๋ฒˆ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด, ๊ฑฐ๋ฆฌ์ƒ์œผ๋กœ ๋„๋ฏธ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ˜ํ”Œ์€ 92์ด๊ณ , ๊ทธ์™ธ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ˜ํ”Œ๋“ค์€ ๋ชจ๋‘ 130, 138์ž…๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์•ฝ๊ฐ„ ๊ฑฐ๋ฆฌ์˜ ๋น„์œจ์ด ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”?
  • ์ด์œ ๋Š” x์ถ•์€ ๋ฒ”์œ„๊ฐ€ ์ข๊ณ (10~40), y์ถ•์€ ๋ฒ”์œ„๊ฐ€ ๋„“์Šต๋‹ˆ๋‹ค(0~1000). ๊ทธ๋‹ˆ๊นŒ y์ถ•์œผ๋กœ ์กฐ๊ธˆ๋งŒ ๋ฉ€์–ด์ ธ๋„ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„์ฃผ ํฐ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. 
  • ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ, x์ถ•์˜ ๋ฒ”์œ„๋ฅผ ๋™์ผํ•˜๊ฒŒ 0~1000์œผ๋กœ ๋งž์ถ”์–ด์„œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด x์ถ• ๋ฒ”์œ„๋ฅผ ์ง€์ •์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, xlim() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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') #indexes: ๋ฐฐ์—ด indexing
plt.xlim((0,1000)) # ์ถ•์˜ ๋ฒ”์œ„(scale)๋ฅผ ์ง€์ •ํ• ์ˆ˜ ์žˆ๋Š” method
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

# answer: ๋ฌด๊ฒŒ๊ฐ€ ์ƒ์„ ์„ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ, ๊ธธ์ด๋Š” ๊ฑฐ์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ์—†์Œ.
# k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ฃผ๋ณ€ sample์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์„ฑ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ ์ˆ˜๋„. -> ๋‘ ์ƒ˜ํ”Œ์— scale์„ ๋งž์ถฐ์ค˜์•ผ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐพ์•„์•ผํ•จ.
  • ์‚ฐ์ ๋„๊ฐ€ ๊ฑฐ์ด ์ผ์ง์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, x์ถ•๊ณผ y์ถ•์˜ ๋ฒ”์œ„๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด y์ถ•(์ƒ์„ ์˜ ๋ฌด๊ฒŒ)๋งŒ ๊ณ ๋ ค ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋‘ ํŠน์„ฑ(๊ธธ์ด์™€ ๋ฌด๊ฒŒ)์˜ ๊ฐ’์ด ๋†“์ธ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๋‹ค๋ฅผ๋•Œ, ์ด๋ฅผ ๋‘ ํŠน์„ฑ์˜ ์Šค์ผ€์ผ(scale)์ด ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฑด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜์ผ๋•Œ, ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„  K-์ตœ๊ทผ์ ‘ ์ด์›ƒ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ƒ˜ํ”Œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ์— ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์œผ๋ฏ€๋กœ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์„ฑ๊ฐ’์„ ์ผ์ •ํ•œ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋Š” ํ‘œ์ค€์ ์ˆ˜(Standard Score, ํ˜น์€ z ์ ์ˆ˜)๋ผ๊ณ  ํ•˜๊ณ , ๊ฐ ํŠน์„ฑ๊ฐ’์ด ํ‰๊ท ์—์„œ ํ‘œ์ค€ํŽธ์ฐจ์˜ ๋ช‡ ๋ฐฐ๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ‰๊ท ์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๋‚˜๋ˆ„์–ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Numpy๋Š” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด ๋‘ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
# ํ‘œ์ค€ ์ ์ˆ˜๋กœ ๋ด๊พธ๋Š”๊ฒƒ -> ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์“ฐ๋Š” ์ „์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
# axis = 0: ์ด๊ฑด ํŠน์„ฑ๋งˆ๋‹ค ๊ฐ’์˜ scale์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ํ‰๊ท  & ํ‘œ์ค€ํŽธ์ฐจ๋Š” ๊ฐ ํŠน์„ฑ๋ณ„๋กœ ๊ณ„์‚ฐ & ์—ฐ์‚ฐ์ด ๊ฐ ์—ด์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•จ
# mean: ํ‰๊ท , std: ํ‘œ์ค€ํŽธ์ฐจ
mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ํ–‰์„ ๋”ฐ๋ผ ๊ฐ ์—ด์˜ ํ†ต๊ณ„ ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  • ํ‰๊ท ๊ณผ ํ‘œ์ค€ ํŽธ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์›๋ณธ ๋ฐ์ดํ„ฐ์—์„œ ํ‰๊ท ์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ‘œ์ค€ ์ ์ˆ˜๋กœ ๋ฐ˜ํ™˜ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
train_scaled = (train_input - mean) / std  # ํ‘œ์ค€ ํŽธ์ฐจ๋กœ ๋ฐ˜ํ™˜
  • ๊ทผ๋ฐ, ์ด ์‹์€ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ์ด ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด๋Ÿฌํ•œ Numpy์˜ ๊ธฐ๋Šฅ์„ Broadcasting(๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์š”์•ฝํ•˜๋ฉด, ๋ฐฐ์—ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ shape์˜ ๋ฐฐ์—ด ๊ฐ„์— ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ž‘์€ ๋ฐฐ์—ด์„ ํฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์— ๋งž์ถฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” train_input์˜ ๋ชจ๋“  ํ–‰์—์„œ ํ‰๊ท (mean)์— ์žˆ๋Š” ๋‘ ํ‰๊ท ๊ฐ’์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ(std)์— ์žˆ๋Š” ๋‘ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ๋‹ค์‹œ ๋ชจ๋“  ํ–‰์— ์ ์šฉ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

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

  • ์•ž์—์„œ ํ‘œ์ค€์ ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ train_scaled๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ, ํ•œ๋ฒˆ ๋‹ค์‹œ ์‚ฐ์ ๋„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
# Numpy Broadcasting
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()

  • ์—ฌ๊ธฐ์„œ ๋‚˜ํƒ€๋‚˜๋Š”๊ฑด ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋ณ€ํ™˜ ํ•˜๊ธฐ ์ „์˜ ์‚ฐ์ ๋„์™€ ๊ฑฐ์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์‚ฐ์ ๋„ ๊ทธ๋ž˜ํ”„์™€ ๋‹ค๋ฅธ์ ์€ x์ถ•๊ณผ y์ถ•์˜ ๋ฒ”์œ„๊ฐ€ -1.5~1.5 ์‚ฌ์ด๋กœ ๋ด๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ , ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ๋‘ ํŠน์„ฑ์ด ๋น„์Šทํ•œ ๋ฒ”์œ„๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๋Š”๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค. ์ด์ œ, ๋‹ค์‹œ ์ด Dataset์œผ๋กœ K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋ชจ๋ธ์„ ๋‹ค์‹œ ํ›ˆ๋ จ์„ ์‹œํ‚ค๊ณ  ๋ชจ๋ธ์„ ํ‰๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
kn.fit(train_scaled, train_target)

test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)

# ๊ฒฐ๊ณผ๊ฐ’: 1.0
  • ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ์ƒ˜ํ”Œ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ณ , ์ •ํ™•๋„๊ฐ€ 1.0 (100%)๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
  • ํ•œ๋ฒˆ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋ธ์˜ ์˜ˆ์ธก์„ ์ถœ๋ ฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
print(kn.predict([new]))
# [1.]
  • 1์ด ๋‚˜์˜ค๋ฉด ๋„๋ฏธ(1)๋กœ ์˜ˆ์ธกํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ธธ์ด๊ฐ€ 25cm์ด๊ณ  ๋ฌด๊ฒŒ๊ฐ€ 150g์ธ ์ƒ์„ ์€ ๋„๋ฏธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ kneighbors() ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜์˜ k-์ตœ๊ทผ์ ‘ ์ด์›ƒ์„ ๊ตฌํ•œ ๋‹ค์Œ, ์‚ฐ์ ๋„ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํŠน์„ฑ์„ ํ‘œ์ค€์ ์ˆ˜ํ™” ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
# sample์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด๊ฑด ๋„๋ฏธ
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()


Keywords

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ

  • ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์— ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์ „์— ๊ฐ€๊ณตํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€์ ์ˆ˜

  • Training_set์˜ ์Šค์ผ€์ผ์„ ๋ด๊พธ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€์ ์ˆ˜๋ฅผ ์–ป์œผ๋ ค๋ฉด, ํŠน์„ฑ์˜ ํ‰๊ท ์„ ๋นผ๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ›ˆ๋ จ์„ธํŠธ์˜ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋กœ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋ด๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…

  • ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋„˜ํŒŒ์ด ๋ฐฐ์—ด์—์„œ ์ž๋™์œผ๋กœ ์‚ฌ์น™ ์—ฐ์‚ฐ์„ ๋ชจ๋“  ํ–‰์ด๋‚˜ ์—ด๋กœ ํ™•์žฅํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํŒจํ‚ค์ง€์™€ ํ•จ์ˆ˜

Scikit-learn

  • train_test_split()์€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„๋Š” ํž˜์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ ์˜ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‹ˆ๋ˆŒ ๋น„์œจ์€ test_size ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 0.25(25%)์ž…๋‹ˆ๋‹ค.
  • shuffle ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„๊ธฐ ์ „์— ๋ฌด์ž‘์œ„๋กœ ์„ž์„์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ True์ž…๋‹ˆ๋‹ค. stratify ๋งค๊ฐœ๋ณ€์ˆ˜์— ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์ด ๋‹ด๊ธด ๋ฐฐ์—ด(์ผ๋ฐ˜์  ์œผ๋กœ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ)์„ ์ „๋‹ฌํ•˜๋ฉด ํด๋ž˜์Šค ๋น„์œจ์— ๋งž๊ฒŒ ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋‚˜๋‘ก๋‹ˆ๋‹ค.

 

  • kneighbors()๋Š” k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ์— ๊ฐ€ ์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ์„ ์ฐพ์•„ ๊ฑฐ๋ฆฌ์™€ ์ด์›ƒ ์ƒ˜ํ”Œ์˜ ์ธํ…์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์›ƒ์˜ ๊ฐœ์ˆ˜ ๋Š” KNeighborsClassifier ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ ๊ฐœ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ n_neighbors ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • return_distance ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ False๋กœ ์ง€์ •ํ•˜๋ฉด ์ด์›ƒ ์ƒ˜ํ”Œ์˜ ์ธํ…์Šค๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฑฐ๋ฆฌ๋Š” ๋ฐ˜ํ™˜ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ True์ž…๋‹ˆ๋‹ค.