Programming/etc

[ํ˜ผ๊ณต ๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹] ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€

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

์‹œ๋‚˜๋ฆฌ์˜ค

  • ๋Ÿญํ‚ค๋ฐฑ ์ด๋ฒคํŠธ ์ƒํ’ˆ
  • ๋Ÿญํ‚ค๋ฐฑ์— ํฌํ•จ๋œ ์ƒ์„ ์˜ ํ™•๋ฅ ์„ ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ ค์คŒ 
    • A ๋Ÿญํ‚ค๋ฐฑ์—๋Š” ๋„๋ฏธ ํ™•๋ฅ ์ด ๋†’์Œ 
  • ๋”ฐ๋ผ์„œ ๋Ÿญํ‚ค๋ฐฑ์— ๋“ค์–ด์žˆ์„ ์ƒ์„ ์˜ ํ™•๋ฅ ์„ ๊ตฌํ•ด์•ผ ๋จ
  • ๋Ÿญํ‚ค๋ฐฑ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ƒ์„ ์€ 7๊ฐœ
  • ๋Ÿญํ‚ค๋ฐฑ์— ๋“ค์–ด๊ฐ„ ์ƒ์„ ์˜ ํฌ๊ธฐ, ๋ฌด๊ฒŒ, ๊ธธ์ด, ๋†’์ด, ๋‘๊ป˜, ๋Œ€๊ฐ์„  ํŠน์„ฑ์ด ์ฃผ์–ด์ง 

1. k-์ตœ๊ทผ์ ‘ ์ด์›ƒ ๋ถ„๋ฅ˜๊ธฐ๋ฅผ ์ด์šฉํ•œ ์˜ˆ์ธก 

์ด์›ƒ์˜ ํด๋ž˜์Šค ๋น„์œจ๋กœ ์˜ˆ์ธก

์ฆ‰, ์ƒ˜ํ”Œ X ์ฃผ์˜์— ์‚ผ๊ฐํ˜•์ด 3๊ฐœ, ์‚ฌ๊ฐํ˜•์ด 5๊ฐœ, ์›์ด 2๊ฐœ๋ผ๋ฉด ์ƒ˜ํ”ŒX๊ฐ€ ์‚ผ๊ฐํ˜•์ผ ํ™•๋ฅ ์€ 30%, ์‚ฌ๊ฐํ˜•์ผ ํ™•๋ฅ ์€ 50%, ์›์ผ ํ™•๋ฅ ์€ 20%์ธ ๊ฒƒ์ด๋‹ค.

 

(1) ๋ฐ์ดํ„ฐ ์ค€๋น„ 

unique(๊ณ ์œ )ํ•œ ๊ฐ’์ธ species๋ฅผ ํƒ€๊นƒ์œผ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€ 5๊ฐœ์˜ ์—ด์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•œ๋‹ค. 

#๋ฐ์ดํ„ฐ ์ค€๋น„ -> pandas

import pandas as pd

fish = pd.read_csv('Fish_csv_data.csv')
fish.head()

print(pd.unique(fish['Species'])) # ์—ด์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’ ์ถœ๋ ฅ
#['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']

fish_target = fish['Species'].to_numpy()
print(fish_target)

 

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

from sklearn.model_selection import train_test_split

#ํ›ˆ๋ จ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ์„ธํŠธ๋กœ ๋‚˜๋ˆ ์ฃผ๊ธฐ
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state=42)

#ํ‘œ์ค€ํ™” ์ „์ฒ˜๋ฆฌ
from sklearn.preprocessing import StandardScaler
#์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

 

 

(2) ์˜ˆ์ธก

ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ์˜ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ์—๋Š” ๋ชจ๋‘ 7๊ฐœ์˜ ์ƒ์„  ์ข…๋ฅ˜๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. 

์ด๋ ‡๊ฒŒ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ์— 2๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ œ๋ฅผ ๋‹ค์ค‘ ๋ถ„๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋Š” ์ด์ง„๋ถ„๋ฅ˜์™€ ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ํ›ˆ๋ จํ•˜๋Š” ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‹ค. 

์ด์ง„ ๋ถ„๋ฅ˜๋ฅผ ํ–ˆ์„ ๋•Œ์—๋Š” ์–‘์„ฑ๊ณผ ์Œ์„ฑ ํด๋ž˜์Šค๋ฅผ 0๊ณผ 1๋กœ ์ง€์ •ํ•˜๊ฒŒ ํƒ€๊นƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‹ค์ค‘ ๋ถ„๋ฅ˜์—์„œ๋„ ํƒ€๊นƒ๊ฐ’์„ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ๋Š” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ฌธ์ž์—ด๋กœ ๋œ ํƒ€๊นƒ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํƒ€๊นƒ๊ฐ’ ๊ทธ๋Œ€๋กœ ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ชจ๋ธ์— ์ „๋‹ฌํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ์ž๋™์œผ๋กœ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ๋งค๊ฒจ์ง„๋‹ค. 
from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)


print(kn.score(train_scaled, train_target))
print(kn.score(test_scaled, test_target))
##0.8907563025210085
##0.85

 

ํ…Œ์ŠคํŠธ ์„ธํŠธ์— ์žˆ๋Š” 5๊ฐœ์˜ ์ƒ˜ํ”Œ ์˜ˆ์ธก ์ง„ํ–‰

 

5๊ฐœ ์ƒ˜ํ”Œ์— ๋Œ€ํ•œ ์˜ˆ์ธก์„ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค. 

์‚ฌ์ดํ‚ท๋Ÿฐ์€ predict_proba()๋ฉ”์„œ๋“œ๋กœ ํด๋ž˜์Šค๋ณ„ ํ™•๋ฅ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. predict_proba() ๋ฉ”์„œ๋“œ์˜ ์ถœ๋ ฅ ์ˆœ์„œ๋Š” classes_ ์†์„ฑ๊ณผ ๊ฐ™๋‹ค.

์ฆ‰ ['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish'] ์ˆœ์„œ์ด๋‹ค.

์ฒซ๋ฒˆ์งธ ์ƒ˜ํ”Œ์€ ๋นผ๋ฐ• perch๊ณ , ๋‘๋ฒˆ์งธ ์ƒ˜ํ”Œ๋„ ๋นผ๋ฐ• smelt, ์„ธ๋ฒˆ์งธ ์ƒ˜ํ”Œ์€ perch, ๋„ค๋ฒˆ์งธ ์ƒ˜ํ”Œ๊ณผ ๋‹ค์„ฏ๋ฒˆ์งธ ์ƒ˜ํ”Œ์€ perch์ผ ํ™•๋ฅ ์ด 0.6667(2/3), Roach์ผ ํ™•๋ฅ ์€ 0.333(1/3)์ด๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด 3๊ฐœ์˜ ์ตœ๊ทผ์ ‘์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ™•๋ฅ ์€ 0/3, 1/3, 2/3, 3/3์ด ์ „๋ถ€์ด๋‹ค.

 

2. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€

๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋Š” ์ด๋ฆ„์€ ํšŒ๊ท€์ด์ง€๋งŒ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์ด๋‹ค. 

์„ ํ˜• ํšŒ๊ท€์™€ ๋™์ผํ•˜๊ฒŒ ์„ ํ˜• ๋ฐฉ์ •์‹์„ ํ•™์Šตํ•œ๋‹ค. 

z= a * ๋ฌด๊ฒŒ + b * ๊ธธ์ด + c * ..

์—ฌ๊ธฐ์—์„œ a,b,c..,e๋Š” ๊ฐ€์ค‘์น˜ ํ˜น์€ ๊ณ„์ˆ˜์ด๋‹ค. 

ํŠน์„ฑ์€ ๋Š˜์–ด๋‚ฌ์ง€๋งŒ ์ด์ „์— ๋‹ค๋ค˜๋˜ ๋‹ค์ค‘ ํšŒ๊ท€๋ฅผ ์œ„ํ•œ ์„ ํ˜• ๋ฐฉ์ •์‹๊ณผ ๋™์ผํ•˜๋‹ค. 

 

z(ํ™•๋ฅ  ์ฆ‰, ๊ตฌํ•˜๋ ค๋Š” ๊ฐ’)์€ ์–ด๋–ค ๊ฐ’๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ™•๋ฅ ์ด ๋˜๋ ค๋ฉด 0~1 ์‚ฌ์ด์˜ ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. 

z๊ฐ€ ์•„์ฃผ ํฐ ์Œ์ˆ˜์ผ ๋•Œ์—๋Š” 0์ด ๋˜๊ณ , ์•„์ฃผ ํฐ ์–‘์ˆ˜์ผ ๋•Œ 1์ด ๋˜๋„๋ก ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜(=๋กœ์ง€์Šคํ‹ฑ ํ•จ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์‚ฌ์ดํ‚ท๋Ÿฐ์—๋Š” ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ์€ LogicsticRegression ํด๋ž˜์Šค๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค. 

 

(2) ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋กœ ์ด์ง„ ๋ถ„๋ฅ˜ ํ•ด๋ณด๊ธฐ

๋ณธ๊ฒฉ์ ์ธ ํ›ˆ๋ จ ์ด์ „์— ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ์ด 0.5๋ณด๋‹ค ํฌ๋ฉด ์–‘์„ฑ, ์ž‘์œผ๋ฉด ์Œ์„ฑ์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ์ด์ง„ ๋ถ„๋ฅ˜๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

๋„˜ํŒŒ์ด ๋ฐฐ์—ด์€ True, False ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ํ–‰์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ๋ถˆ๋ฆฌ์–ธ ์ธ๋ฑ์‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

char_arr = np.array(['A','B','C','D','E']) #'A'์™€ 'C' ๊ณจ๋ผ๋‚ด๊ธฐ
print(char_arr[[True, False, True, False, False]])

 

๋ถˆ๋ฆฌ์–ธ ์ธ๋ฑ์‹ฑ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„๋ฏธ์™€ ๋น™์–ด์˜ ํ–‰๋งŒ ๊ณ ๋ฅธ๋‹ค. 

train_target ๋ฐฐ์—ด์—์„œ Bream์ด๋‚˜ smelt์ผ ๊ฒฝ์šฐ True์ด๊ณ  ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ False๋ฅผ ๋„ฃ๋Š”๋‹ค. 

์ดํ›„ ๋น„ํŠธ ์—ฐ์‚ฐ์ž(|) ๋ฅผ ํ†ตํ•ด ํ•ฉ์น˜๋ฉด ๋„๋ฏธ์™€ ๋น™์–ด์— ๋Œ€ํ•œ ํ–‰๋งŒ ๊ณจ๋ผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

bream_smelt_indexes = (train_target == "Bream") | (train_target == "Smelt")
train_bream_smelt = train_scaled[bream_smelt_indexes]
target_bream_smelt = train_target[bream_smelt_indexes]

print(bream_smelt_indexes.shape)
print(train_bream_smelt.shape)
print(target_bream_smelt.shape)

 

ํ›ˆ๋ จ

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)

 

์ƒ˜ํ”Œ 5๊ฐœ์— ๋Œ€ํ•œ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ƒ˜ํ”Œ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ „๋ถ€ Smelt๋กœ ์˜ˆ์ธกํ•˜์˜€๋‹ค. 

์‹ค์ œ๋กœ ๋‘๋ฒˆ์งธ ์ƒ˜ํ”Œ์—์„œ๋งŒ ํ›„์ž์˜ ํ™•๋ฅ ์ด ๋” ๋†’๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ „์ž์˜ ํ™•๋ฅ ์ด ํ›จ์”ฌ ๋†’๋‹ค. 

์‚ฌ์ดํ‚ท๋Ÿฐ์€ ํƒ€๊นƒ๊ฐ’์„ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฏ€๋กœ, Bream, Smelt์˜ ์ˆœ์„œ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ง„๋ถ„๋ฅ˜๊ฐ€ ์ œ๋Œ€๋กœ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

(2) ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋กœ ๋‹ค์ค‘ ๋ถ„๋ฅ˜ํ•˜๊ธฐ

LogisitcRegression ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

max_iter ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๋ฐ˜๋ณต ํšŒ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 100์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 1000์œผ๋กœ ๋Š˜๋ ค ์‚ฌ์šฉํ•œ๋‹ค.

 

๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ„์ˆ˜์˜ ์ œ๊ณฑ์„ ๊ทœ์ œํ•œ๋‹ค. (=L2๊ทœ์ œ)

C์˜ ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋ฉฐ, C๋Š” ์ž‘์„ ์ˆ˜๋ก ๊ทœ์ œ๊ฐ€ ์ปค์ง„๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 20์œผ๋กœ ๋Š˜๋ ค ์‚ฌ์šฉํ•œ๋‹ค. 

 

๊ฒฐ๊ณผ๊ฐ€ ๊ณผ๋Œ€์ ํ•ฉ์ด๋‚˜ ๊ณผ์†Œ์ ํ•ฉ์œผ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. 

 

ํ…Œ์ŠคํŠธ ์„ธํŠธ 5๊ฐœ์˜ ์ƒ˜ํ”Œ์— ๋Œ€ํ•œ ์˜ˆ์ธก์„ ์ถœ๋ ฅํ•ด๋ณด๋‹ˆ, 5๊ฐœ์˜ ํ–‰์ด ์ถœ๋ ฅ๋œ๋‹ค. 

7๊ฐœ์˜ ์ƒ์„  ์ข…๋ฅ˜์— ๋Œ€ํ•œ ํ™•๋ฅ ์ด๋ฏ€๋กœ 7๊ฐœ์˜ ์—ด์ด ์ถœ๋ ฅ๋˜์—ˆ๋‹ค. 

๊ณ„์‚ฐ ๊ฒฐ๊ณผ ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์ธ ์ƒ์„ ์˜ ์ข…๋ฅ˜๋กœ ์˜ˆ์ธกํ•œ๋‹ค. 

 

์ด ๋ฐ์ดํ„ฐ๋Š” 5๊ฐœ์˜ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ coef_ ๋ฐฐ์—ด์˜ ์—ด์€ 5๊ฐœ์ด๋‹ค.

ํ–‰๊ณผ intercrpt_๊ฐ€ 7๊ฐœ์ธ ์ด์œ ๋Š” ์ด์ง„๋ถ„๋ฅ˜์—์„œ ๋ณด์•˜๋˜ z๋ฅผ 7๊ฐœ๋‚˜ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

์ฆ‰, ๋‹ค์ค‘ ๋ถ„๋ฅ˜๋Š” ํด๋ž˜์Šค๋งˆ๋‹ค z๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ณ„์‹ผํ•œ๋‹ค. 

๋‹ค์ค‘ ๋ถ„๋ฅ˜๋Š” ์ด์™€ ๋‹ฌ๋ฆฌ ์†Œํ”„ํŠธ๋งฅ์Šค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 7๊ฐœ์˜ ํ™•๋ฅ ๋กœ z๊ฐ’์„ ๋ณ€ํ™˜ํ–ˆ๋‹ค.