ํ˜ผ๊ณต ML+DL #9

myeongยท2022๋…„ 9์›” 26์ผ
0

ML+DL

๋ชฉ๋ก ๋ณด๊ธฐ
7/23

๐Ÿ“Œ ํ™•๋ฅ 

๐Ÿ“ ๋ฐ์ดํ„ฐ ์ค€๋น„

  • head() : csv ํŒŒ์ผ ์ฝ์–ด์„œ pandas ํ‘œ๋กœ ๋ณด์—ฌ์คŒ
import pandas as pd

fish = pd.read_csv('https://bit.ly/fish_csv_data')
fish.head()

  • Species = target (7๊ฐ€์ง€ ์ƒ์„ ), ๋‚˜๋จธ์ง€ = features (ํŠน์„ฑ)

๐Ÿ“ Data Set, ์ •๊ทœํ™”

fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
fish_target = fish['Species'].to_numpy()

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)

๐Ÿ“ k-์ตœ๊ทผ์ ‘ ์ด์›ƒ์˜ ๋‹ค์ค‘ ๋ถ„๋ฅ˜

  • classes_ : ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ํ•™์Šตํ•œ 7๊ฐœ์˜ ์ƒ์„  ์†์„ฑ
    (์ง€์ •ํ•œ ๊ฒƒx, train_target์œผ๋กœ๋ถ€ํ„ฐ ์ถ”์ถœ)
from sklearn.neighbors import KNeighborsClassifier

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

print(kn.classes_)

['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']

  • 5๊ฐœ์˜ sample์— ๋Œ€ํ•ด ์˜ˆ์ธก
print(kn.predict(test_scaled[:5]))

['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']

  • 5๊ฐœ์˜ sample์— ๋Œ€ํ•ด 7๊ฐœ ํด๋ž˜์Šค(์ƒ์„ )์— ํ•ด๋‹นํ•  ํ™•๋ฅ 
import numpy as np

proba = kn.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=4))

[[0. 0. 1. 0. 0. 0. 0. ],
[0. 0. 0. 0. 0. 1. 0. ],
[0. 0. 0. 1. 0. 0. 0. ],
[0. 0. 0.6667 0. 0.3333 0. 0. ],
[0. 0. 0.6667 0. 0.3333 0. 0. ]]

-> ์ด์›ƒ์„ 3๊ฐœ๋กœ ์ •ํ•ด๋†“์•„์„œ ํ™•๋ฅ  = 0, 1/3, 2/3, 3/3



๐Ÿ“Œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ (์ด์ง„ ๋ถ„๋ฅ˜)

  • z = a x๋ฌด๊ฒŒ + b x๊ธธ์ด + c x๋Œ€๊ฐ์„  + d x๋†’์ด + e x๋‘๊ป˜ + f

๐Ÿ“ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜

  • ์ด์ง„ ๋ถ„๋ฅ˜๋ฅผ ํ™•๋ฅ ๋กœ ํ‘œํ˜„
  • z -> 0 ~ 1 ๋ฒ”์œ„๋กœ ๋ฐ”๊ฟ”์คŒ (๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํšŒ๊ท€์ž„)
  • ์Œ์„ฑ ํด๋ž˜์Šค < 0.5 < ์–‘์„ฑ ํด๋ž˜์Šค

๐Ÿ“ ์ด์ง„ ๋ถ„๋ฅ˜

  • == : ๋„˜ํŒŒ์ด ๋ถˆ๋ฆฌ์–ธ ์ธ๋ฑ์‹ฑ
    ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋งŒ true๋กœ ์„ค์ •, ๋‚˜๋จธ์ง€๋Š” false
  • bream, smelt ์ธ ์›์†Œ๋งŒ ๋ฝ‘์•„์„œ ๋ฐฐ์—ด๋กœ
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]

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

print(lr.predict(train_bream_smelt[:5]))

['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']

print(lr.predict_proba(train_bream_smelt[:5]))

[[0.99759855 0.00240145],
[0.02735183 0.97264817],
[0.99486072 0.00513928],
[0.98584202 0.01415798],
[0.99767269 0.00232731]]

-> ๋„๋ฏธ: ์Œ์„ฑ , ๋น™์–ด: ์–‘์„ฑ

๐Ÿ“ ๊ณ„์ˆ˜ ํ™•์ธ

  • ์„ ํ˜• ํ•จ์ˆ˜ ๊ณ„์ˆ˜ ํ™•์ธ
print(lr.coef_, lr.intercept_)

[[-0.4037798 -0.57620209 -0.66280298 -1.01290277 -0.73168947]][-2.16155132]

  • z ๊ฐ’ -> ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜ ์ ์šฉ - scipy์˜ expitํ•จ์ˆ˜
decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)

from scipy.special import expit
print(expit(decisions))
  • z ๊ฐ’
    [-6.02927744 3.57123907 -5.26568906 -4.24321775 -6.0607117 ]
  • 0 ~ 1 ๊ฐ’์œผ๋กœ ์‹œ๊ทธ๋ชจ์ด๋“œ
    [0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]

-> ์–‘์„ฑ ํด๋ž˜์Šค์— ๋Œ€ํ•˜์—ฌ z ๊ฐ’์„ ๊ณ„์‚ฐํ•จ



๐Ÿ“Œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ (๋‹ค์ค‘ ๋ถ„๋ฅ˜)

๐Ÿ“ OvR ์•Œ๊ณ ๋ฆฌ์ฆ˜ (One vs Rest)

  • L2 ๋…ธ๋ฆ„ ๊ทœ์ œ ๊ธฐ๋ณธ ์ ์šฉ (C๊ฐ’โ†‘ ๊ทœ์ œโ†“)
    max_iter = ๋ฐ˜๋ณต ํšŸ์ˆ˜ (ํ•™์Šต)
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))

0.9327731092436975 // ์ •ํ™•๋„
0.925

proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))

[[0. 0.014 0.841 0. 0.136 0.007 0.003],
[0. 0.003 0.044 0. 0.007 0.946 0. ],
[0. 0. 0.034 0.935 0.015 0.016 0. ],
[0.011 0.034 0.306 0.007 0.567 0. 0.076],
[0. 0. 0.904 0.002 0.089 0.002 0.001]]

๐Ÿ“ ๊ณ„์ˆ˜ ํ–‰๋ ฌ์˜ ํฌ๊ธฐ ํ™•์ธ

print(lr.coef_.shape, lr.intercept_.shape)

(7, 5) (7,)

-> 7๊ฐœ ํ–‰์€ ๊ฐ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธ
-> 5๊ฐœ ํ–‰์€ ๊ฐ ํŠน์„ฑ์— ๊ณฑํ•ด์ง€๋Š” ๊ณ„์ˆ˜
-> y ์ ˆํŽธ์ด 7๊ฐœ์ด๋ฏ€๋กœ z๊ฐ’ 7๊ฐœ

  • ํด๋ž˜์Šค๋งˆ๋‹ค ์„ ํ˜• ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ (z๊ฐ’ 7๊ฐœ)

  • ๋”ฐ๋ผ์„œ ์œ„์—์„œ ์˜ˆ์ธกํ•œ ํ™•๋ฅ ์˜ ํ•œ ํ–‰์€...
    = ์ƒ˜ํ”Œ๋งˆ๋‹ค 7๊ฐœ์˜ ์„ ํ˜• ํ•จ์ˆ˜๋ฅผ ์ ์šฉ ์‹œํ‚จ ๊ฒฐ๊ณผ์˜ ํ™•๋ฅ 

  • ์ด์ง„ ๋ถ„๋ฅ˜๋ฅผ 7๋ฒˆ ํ›ˆ๋ จํ•ด์„œ ์„ ํ˜• ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค
    ๊ฐ ์ƒ˜ํ”Œ๋งˆ๋‹ค ํด๋ž˜์Šค ํ•˜๋‚˜๋ฅผ ์–‘์„ฑ, ๋‚˜๋จธ์ง€๋Š” ์Œ์„ฑ์œผ๋กœ ๋‘๊ณ  ์ด์ง„ ๋ถ„๋ฅ˜
    -> ํ•˜๋‚˜์˜ ์ƒ˜ํ”Œ ๋‹น 7๋ฒˆ ๋ฐ˜๋ณต -> 7๊ฐœ z๊ฐ’

  • ๊ฐ€์žฅ ํฐ ํ™•๋ฅ ๊ฐ’ = ์˜ˆ์ธก ํด๋ž˜์Šค

๐Ÿ“ Softmax ํ•จ์ˆ˜

  • ๋‹ค์ค‘ ๋ถ„๋ฅ˜๋ฅผ ํ™•๋ฅ ๋กœ ํ‘œํ˜„

  • z๊ฐ’ 7๊ฐœ ์ถœ๋ ฅ

decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))

[[ -6.5 1.03 5.16 -2.73 3.34 0.33 -0.63],
[-10.86 1.93 4.77 -2.4 2.98 7.84 -4.26],
[ -4.34 -6.23 3.17 6.49 2.36 2.42 -3.87],
[ -0.68 0.45 2.65 -1.19 3.26 -5.75 1.26],
[ -6.4 -1.99 5.82 -0.11 3.5 -0.11 -0.71]]

  • z1 ~ z7 ๊ฐ๊ฐ ์ง€์ˆ˜ํ•จ์ˆ˜ ์ ์šฉ, ์ดํ•ฉ์œผ๋กœ ๋‚˜๋ˆ” -> ํ•ฉ=1
from scipy.special import softmax

proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))

[[0. 0.014 0.841 0. 0.136 0.007 0.003],
[0. 0.003 0.044 0. 0.007 0.946 0. ],
[0. 0. 0.034 0.935 0.015 0.016 0. ],
[0.011 0.034 0.306 0.007 0.567 0. 0.076],
[0. 0. 0.904 0.002 0.089 0.002 0.001]

-> ์•ž์—์„œ ์ถœ๋ ฅํ•œ ํ™•๋ฅ  ๊ฐ’๊ณผ ๋™์ผ



๐Ÿ”— ํ˜ผ๊ณต MLDL-9

0๊ฐœ์˜ ๋Œ“๊ธ€