Ability ๐ŸŒฑ/ML

[ํ˜ผ๊ณต๋จธ์‹ ] 01. K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋„๋ฏธ์™€ ๋น™์–ด ๋ถ„๋ฅ˜

n_young 2022. 4. 23. 09:00

์ƒ์„  ๋ถ„๋ฅ˜ ๋ฌธ์ œ

๋จธ์‹ ๋Ÿฌ๋‹์€ ๊ธฐ์ค€์„ ์ฐพ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์ค€์„ ์ด์šฉํ•ด ์ƒ์„  ์ข…๋ฅ˜ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์Œ

๋จธ์‹ ๋Ÿฌ๋‹ ์‚ฌ์šฉํ•ด ๋„๋ฏธ(bream)์™€ ๋น™์–ด(smelt) ๊ตฌ๋ถ„

 

๋„๋ฏธ(bream) ๋ฐ์ดํ„ฐ ์ค€๋น„

๋„๋ฏธ์˜ ํŠน์ง•์„ ๊ธธ์ด์™€ ๋ฌด๊ฒŒ๋กœ ํ‘œํ˜„ -> ํŠน์„ฑ

* ํŠน์„ฑ : ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•

bream_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]
bream_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]

 

 

์‚ฐ์ ๋„ ๊ทธ๋ฆฌ๊ธฐ

x, y์ถ•์œผ๋กœ ์ด๋ค„์ง„ ์ขŒํ‘œ๊ณ„์— ๋‘ ๋ณ€์ˆ˜(x, y)์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

* matplotlib(๋งทํ”Œ๋กฏ๋ฆฝ) : ํŒŒ์ด์ฌ์—์„œ ๊ณผํ•™๊ณ„์‚ฐ์šฉ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” ํŒจํ‚ค์ง€

* scatter( ) : matplotblib ํŒจํ‚ค์ง€๋ฅผ ์ž„ํฌํ„ฐํ•˜๊ณ  ์‚ฐ์ ๋„๋ฅผ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜ 

* import : ๋”ฐ๋กœ ๋งŒ๋“ค์–ด๋‘” ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€(ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜์˜ ๋ฌถ์Œ)์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ช…๋ น

            ํŒจํ‚ค์ง€๋ฅผ ์ž„ํฌํŠธํ•  ๋•Œ as ํ‚ค์›Œ๋“œ๋กœ ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์ค„์—ฌ์„œ ์“ฐ๋Š” ๊ฒƒ ์ข‹์•„ํ•จ

 

* matplotlib.pyplot :  matplotlib์ด MATLAB์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜ ๋ชจ์Œ

* show( ) : ํ™”๋ฉด์— ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅ

import matplotlib.pyplot as plt  # matplotlib์˜ pyplot ํ•จ์ˆ˜๋ฅผ plt๋กœ ์ค„์—ฌ์„œ ์ž„ํฌํŠธ
plt.scatter(bream_length,bream_weight)
plt.xlabel('length')  # x์ถ• = ๊ธธ์ด
plt.ylabel('weight')  # y์ถ• = ๋ฌด๊ฒŒ
plt.show()

์‚ฐ์ ๋„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ผ์ง์„ ์— ๊ฐ€๊นŒ์šด ํ˜•ํƒœ : ์„ ํ˜•์ 

 

 

๋น™์–ด(smelt) ๋ฐ์ดํ„ฐ ์ค€๋น„

smelt_length = [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]
smelt_weight = [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๊ฐœ์˜ ์‚ฐ์ ๋„ ํ•œ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ฆฌ๊ธฐ : scatter( )ํ•จ์ˆ˜ ์—ฐ๋‹ฌ์•„ ์‚ฌ์šฉ

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weght')
plt.show()

์ฃผํ™ฉ์ƒ‰ : ๋น™์–ด  / ํŒŒ๋ž€์ƒ‰ : ๋„๋ฏธ


๋„๋ฏธ์™€ ๋น™์–ด ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ธฐ

๋ฆฌ์ŠคํŠธ ํ•ฉ์น˜๊ธฐ -> ๊ทธ๋ƒฅ ๋”ํ•˜๋ฉด ๋จ

length = bream_length + smelt_length
weight = bream_weight + smelt_weight
 
length = ๋„๋ฏธ 35๊ฐœ ๊ธธ์ด + ๋น™์–ด 14๊ฐœ ๊ธธ์ด = ๋„๋ฏธ, ๋น™์–ด ๊ธธ์ด ์ด 49๊ฐœ
weight = ๋„๋ฏธ 35๊ฐœ ๋ฌด๊ฒŒ + ๋น™์–ด 14๊ฐœ ๋ฌด๊ฒŒ = ๋„๋ฏธ, ๋น™์–ด ๋ฌด๊ฒŒ ์ด 49๊ฐœ
 
 

์‚ฌ์ดํ‚ท๋Ÿฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ฐ ํŠน์„ฑ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋Š˜์–ด๋œจ๋ฆฐ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

KNN์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด Scikit-learn ๋จธ์‹ ๋Ÿฌ๋‹ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ

Scikit-learn ํŒจํ‚ค์ง€๋ฅผ ์“ฐ๋ ค๋ฉด ๊ฐ ํŠน์„ฑ์„ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋Š˜์–ด๋œจ๋ฆฐ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ

-> zipํ•จ์ˆ˜์™€ ๋ฆฌ์ŠคํŠธ ๋‚ดํฌ ๊ตฌ๋ฌธ ์‚ฌ์šฉ
 
* zip( ) : ๋‘ ๊ทธ๋ฃน์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์—ฎ์–ด์คŒ
           ๋‚˜์—ด๋œ ๋ฆฌ์ŠคํŠธ ๊ฐ๊ฐ์—์„œ ํ•˜๋‚˜์”ฉ ์›์†Œ๋ฅผ ๊บผ๋‚ด ๋ฐ˜ํ™˜
* for( ) : ๋™์ผํ•œ ์ž‘์—…์„ ๊ณ„์† ๋ฐ˜๋ณต
fish_data = [[l,w] for l,w in zip(length, weight)]

for๋ฌธ zip( )ํ•จ์ˆ˜๋กœ length์™€ weight ๋ฆฌ์ŠคํŠธ์—์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด l๊ณผ w์— ํ• ๋‹น

๊ทธ๋Ÿฌ๋ฉด [ l, w]๊ฐ€ ํ•˜๋‚˜์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด์ง

 

์ •๋‹ต ๋ถ€์—ฌ

๊ณฑ์…ˆ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ ๋ฐ˜๋ณต

์ฐพ์œผ๋ ค๋Š” ๋Œ€์ƒ : 1

๊ทธ ์™ธ : 0

fish_target = [1]*35 + [0]*14

๋„๋ฏธ์— 1, ๋น™์–ด์— 0 ํ• ๋‹น

 

KNeighborsClassifier ์ž„ํฌํŠธ

* KNeighborsClassifier : ์‚ฌ์ดํ‚ท๋Ÿฐ ํŒจํ‚ค์ง€์˜ K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ํด๋ž˜์Šค

* ํŒจํ‚ค์ง€๋‚˜ ๋ชจ๋“ˆ ์ „์ฒด๋ฅผ ์ž„ํฌํŠธํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ํด๋ž˜์Šค๋งŒ ์ž„ํฌํŠธํ•˜๋ ค๋ฉด

   from ํŒจํ‚ค์ง€(๋ชจ๋“ˆ) ~ import ํด๋ž˜์Šค  ๊ตฌ๋ฌธ ์‚ฌ์šฉ

from sklearn.neighbors import KNeighborsClassifier

 

์ž„ํฌํŠธํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ

kn = KNeighborsClassifier()
 

ํ›ˆ๋ จ

๋ชจ๋ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๊ทœ์น™์„ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •

* fit( ) : ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ›ˆ๋ จ

kn.fit(fish_data,fish_target)

 

ํ‰๊ฐ€

* score( ) : ๋ชจ๋ธ์„ ํ‰๊ฐ€, 0~1 ์‚ฌ์ด ๊ฐ’ ๋ฐ˜ํ™˜

kn.score(fish_data, fish_target)

1.0 ์€ 100% ์ •ํ™•๋„

 

 

์˜ˆ์ธก

๊ธธ์ด 300 ๋ชธ๋ฌด๊ฒŒ 600์ธ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์˜ˆ์ธก

* predict( ) : ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์˜ ์ •๋‹ต ์˜ˆ์ธก

๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ -> ์˜ˆ์ธก ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ๋กœ 2๋ฒˆ ๊ฐ์‹ธ์ž  -> .predict[ [์˜ˆ์ธก๊ฐ’] ]

kn.predict([[30,600]])

๋ฐ˜ํ™˜ ๊ฐ’ => array([1])

์˜ˆ์ธก -> 1


 

>> K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์–ด๋–ค ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‹ต์„ ๊ตฌํ•  ๋•Œ ์ฃผ์œ„์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ๋‹ค์ˆ˜๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹ต์œผ๋กœ ์‚ฌ์šฉ

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์˜ˆ์ธกํ•  ๋•Œ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง์„ ๊ฑฐ๋ฆฌ์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด„

๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ฃผ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›€

๋ฐ์ดํ„ฐ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๊ณ  ์ง์„ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„ ํ•„์š”

 

* _fit_X ์†์„ฑ์— ์ „๋‹ฌํ•œ fish_data ๊ฐ€์ง

print(kn._fit_X)

 

* _y ์†์„ฑ์— fish_target ๊ฐ€์ง

print(kn._y)

 

K-์ตœ๊ทผ์ ‘ ์ด์›ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌด์–ธ๊ฐ€ ํ›ˆ๋ จ๋˜๋Š” ๊ฒŒ ์—†๋Š” ์…ˆ

fit( ) ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ตฌ๋ถ„

 

KNeighborsClassifier ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ๊ฐ’ = 5

๊ธฐ์ค€์€ n_neighbors ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

 

# ์ฐธ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ 49๊ฐœ๋กœ ํ•œ ๋ชจ๋ธ

kn49 = KNeighborsClassifier(n_neighbors=49)

 

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด 49๊ฐœ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉํ•˜๋Š” k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋ชจ๋ธ์— fish_data๋ฅผ ์ ์šฉํ•˜๋ฉด fish_data์— ์žˆ๋Š” ๋ชจ๋“  ์ƒ์„ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธกํ•˜๊ฒŒ ๋จ => fish_data์˜ 49๊ฐœ ์ค‘ 35๊ฐœ๊ฐ€ ๋„๋ฏธ, 14๊ฐœ๊ฐ€ ๋น™์–ด๋กœ, ๋„๋ฏธ๊ฐ€ ๋‹ค์ˆ˜๋ฅผ ์ฐจ์ง€ํ•จ => ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋„ ๋ฌด์กฐ๊ฑด ๋„๋ฏธ๋กœ ์˜ˆ์ธก

kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)

๊ฒฐ๊ณผ๊ฐ’ => 0.714285714...

 

fish_data์— ์žˆ๋Š” ์ƒ์„  ์ค‘ ๋„๋ฏธ๊ฐ€ 35๊ฐœ, ๋น™์–ด๊ฐ€ 14๊ฐœ => kn49๋ชจ๋ธ์€ ๋„๋ฏธ๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งž์ถค => ์ •ํ™•๋„ = 35/49 

print(35/49)

๊ฒฐ๊ณผ๊ฐ’ => 0.714285714...

score( ) ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ์ •ํ™•๋„ ๊ฐ’ ์–ป์Œ

 

 

 

 


์ฐธ๊ณ ๋„์„œ : ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ + ๋”ฅ๋Ÿฌ๋‹, ๋ฐ•ํ•ด์„ , ํ•œ๋น›๋ฏธ๋””์–ด, 2020๋…„

๋ฐ˜์‘ํ˜•