๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹]Session 7. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(logistic regression)

darly213 2020. 2. 5. 23:54
728x90

 ์ด์ „๊นŒ์ง€ ์„ค๋ช…ํ–ˆ๋˜ ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ข‹์ง€๋งŒ ํด๋ž˜์Šค๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ์ˆ˜๋ ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋” ๊ฐ•๋ ฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋ฅผ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ํšŒ๊ท€์ง€๋งŒ ์‚ฌ์‹ค์€ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž„์„ ์žŠ์ง€๋งˆ์„ธ์š”!

1. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์˜ ์ดํ•ด์™€ ์กฐ๊ฑด๋ถ€ ํ™•๋ฅ 

 ๋จผ์ €, ์˜ค์ฆˆ๋น„(odds ratio)๋ฅผ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ค์ฆˆ๋Š” ํŠน์ •ํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ™œ ํ™•๋ฅ ๋กœ, ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์€ ์ˆ˜์‹์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ P๋Š” ์˜ˆ์ธกํ•  ๋Œ€์ƒ, ์–‘์„ฑ ์ƒ˜ํ”Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋กœ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ทจํ•˜๋ฉด ๋กœ์ง“(logit)ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 1. odds ratio
๊ทธ๋ฆผ 2. logit ํ•จ์ˆ˜

์—ฌ๊ธฐ์„œ์˜ ๋กœ๊ทธ๋Š” ์˜ˆ์ƒํ•˜์…จ๋“ฏ ์ž์—ฐ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. logitํ•จ์ˆ˜๋Š” 0์—์„œ 1์‚ฌ์ด์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ์‹ค์ˆ˜ ๋ฒ”์œ„์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜ w๋กœ ํ‘œํ˜„๋˜์—ˆ๋˜ ์•ž์„  ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? ํŠน์„ฑ ๊ฐ€์ค‘์น˜ ํ•ฉ๊ณผ ๋กœ๊ทธ ์˜ค์ฆˆ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์“ฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ P(y=1|x) ๋Š” ํŠน์„ฑ x๊ฐ€ ์žˆ์„ ๋•Œ ์ด ์ƒ˜ํ”Œ์ด ํด๋ž˜์Šค(y) 1์— ์†ํ•  ์กฐ๊ฑด๋ถ€ ํ™•๋ฅ ์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 3. ๊ฐ€์ค‘์น˜ํ•ฉ๊ณผ ๋กœ๊ทธ ์˜ค์ฆˆ์˜ ์„ ํ˜•์  ๊ด€๊ณ„

 

 ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์ƒ˜ํ”Œ์ด ํŠน์ • ํด๋ž˜์Šค์— ์†ํ•  ํ™•๋ฅ ์„ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์„ ๋ฐ”๋ผ๋‹ˆ logit ํ•จ์ˆ˜๋ฅผ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. ํ™•๋ฅ ์€ ๋ถ„์ˆ˜๋‹ˆ๊นŒ์š”! ์ด ํ•จ์ˆ˜๋ฅผ ๋กœ์ง€์Šคํ‹ฑ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜(logistic sigmoid function), ์ค„์—ฌ์„œ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜(sigmoid function)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 4. ๋กœ์ง€์Šคํ‹ฑ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜

 z๋Š” ์ตœ์ข…์ž…๋ ฅ, ์ฆ‰ w^Tx๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€๋ฅผ ์ง์ ‘ ๊ทธ๋ ค๋ณด๋Š” ์ฝ”๋“œ๋กœ, -7๋ถ€ํ„ฐ 7๊นŒ์ง€ ๊ทธ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

import matplotlib.pyplot as plt
import numpy as np

def sigmoid(z):
	return 1.0 / (1.0 + np.ezp(-z)
    
z = np.arange(-7, 7, 0.1)
phi_z = sigmoid(z)
plt.plot(z, phi_z)
plt.axvline(0.0, color = 'k')
plt.ylim(-0.1, 1.1)
plt.xlabel('z')

plt.yticks([0.0, 0.5, 1.0])
ax = plt.gca()
ax.yaxis.grid(True)
plt.tight_layout()
plt.show()

๊ทธ๋ฆผ 5. ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜

 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด S์ž ํ˜•ํƒœ์˜ ์‹œ๊ทธ๋ชจ์ด๋“œ ๊ณก์„ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. x์ถ•์„ ๋‹ด๋‹นํ•˜๋Š” z๊ฐ€ ๋ฌดํ•œ๋Œ€์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก e^(-z)์˜ ๊ฐ’์€ ์ž‘์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ทธ๋ชจ์ด๋“œ๋Š” 1์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ z๊ฐ€ ์Œ์˜ ๋ฌดํ•œ๋Œ€๋กœ ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก e^(-z)์˜ ๊ฐ’์€ ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ทธ๋ชจ์ด๋“œ๋Š” 0์— ์ˆ˜๋ ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์„ 0๊ณผ 1 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์•„๋‹ฌ๋ฆฐ์„ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? ๋กœ์ง€์Šฝํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ์„ ์•„๋‹ฌ๋ฆฐ๊ณผ ๋น„๊ตํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 6. ์•„๋‹ฌ๋ฆฐ๊ณผ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์˜ ์ฐจ์ด์ 

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

 ์—ฌ๊ธฐ์„œ ์ž…๋ ฅ์ด ํด๋ž˜์Šค 1์— ์†ํ•  ์กฐ๊ฑด๋ถ€ ํ™•๋ฅ ์ด โˆฎ(z) = P(y=1|x;w)๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์–ด๋–ค ์ƒ˜ํ”Œ์ด โˆฎ(z) = 0.3์ด๋ผ๋ฉด ์ƒ˜ํ”Œ์ด ํด๋ž˜์Šค 1์— ์†ํ•  ํ™•๋ฅ ์ด 30%๋ผ๋Š” ๋œป์ด์ฃ . ๋ฐ˜๋Œ€๋กœ ํด๋ž˜์Šค 2์ผ ํ™•๋ฅ ์€ 70%๊ฐ€ ๋˜์ฃ . ์˜ˆ์ธก ํ™•๋ฅ ์ธ y hat์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 7. ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜ ์˜ˆ์ธก ํ™•๋ฅ 

 ์ด ๋ชจ์–‘์€ ์•„๋‹ฌ๋ฆฐ์˜ ์ž„๊ณ„ ํ•จ์ˆ˜์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„์™€ ๋™์ผํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

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

 

3. ๋กœ์ง€์Šคํ‹ฑ ๋น„์šฉ ํ•จ์ˆ˜์˜ ๊ฐ€์ค‘์น˜ ํ•™์Šต

 ์ด์ œ ๊ฐ€์ค‘์น˜ w์˜ ํ•™์Šต ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ์“ฐ์ธ ์ œ๊ณฑ ์˜ค์ฐจํ•ฉ ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 8. ์ œ๊ณฑ ์˜ค์ฐจํ•ฉ ํ•จ์ˆ˜

 ์•„๋‹ฌ๋ฆฐ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฐ€์ค‘์น˜ w๋ฅผ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ง€์Šคํ‹ฑ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ ์ตœ๋Œ€ํ™”ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ L(likelihood)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 9. ๋กœ์ง€์Šคํ‹ฑ ๋ชจ๋ธ์˜ ์ตœ๋Œ€ํ™”๊ธฐ๋Šฅ L(likelihood)

 ์‹ค์ „์—์„œ๋Š” ๊ฐ€๋Šฅ๋„๊ฐ€ ๋‚ฎ์„ ๋•Œ ์ผ์–ด๋‚˜๋Š” ์–ธ๋”ํ”Œ๋กœ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ„์ˆ˜์˜ ๊ณฑ์„ ๊ณ„์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋ฐ”๊ฟ”์“ธ ์ˆ˜ ์žˆ๋Š” ์ž์—ฐ๋กœ๊ทธ๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ๋กœ๊ทธ ๊ฐ€๋Šฅ๋„ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 10. ๋กœ๊ทธ ๊ฐ€๋Šฅ๋„ ํ•จ์ˆ˜

 ๊ฒฝ์‚ฌ ์ƒ์Šน๋ฒ• ๊ฐ™์€ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋กœ๊ทธ ๊ธฐ๋Šฅ๋„ ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ ๊ธฐ๋Šฅ๋„ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ๋น„์šฉํ•จ์ˆ˜์ธ J๋กœ ํ‘œํ˜„ํ•ด ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ์ด์šฉํ•ด ์ตœ์†Œํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 11. ๋น„์šฉํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•œ ๋กœ๊ทธ ๊ธฐ๋Šฅ๋„ ํ•จ์ˆ˜

์ด ๋น„์šฉํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ˜ํ”Œ์ด ํ•˜๋‚˜์ผ ๋•Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์‹์„ ๋ณด๋ฉด y = 0์ผ ๋•Œ ์ฒซ์งธ ํ•ญ์ด 0์ด ๋˜๊ณ , y = 1์ผ ๋•Œ๋Š” ๋‘˜์งธ ํ•ญ์ด 0์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 12. ๋น„์šฉํ•จ์ˆ˜ ์ดํ•ด

 

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ƒ˜ํ”Œ์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ์— โˆฎ(z) ๊ฐ’์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜ ๋น„์šฉ์„ ๊ทธ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

def cost_1(z):
    return - np.log(sigmoid(z))


def cost_0(z):
    return - np.log(1 - sigmoid(z))

z = np.arange(-10, 10, 0.1)
phi_z = sigmoid(z)

c1 = [cost_1(x) for x in z]
plt.plot(phi_z, c1, label='J(w) if y=1')

c0 = [cost_0(x) for x in z]
plt.plot(phi_z, c0, linestyle='--', label='J(w) if y=0')

plt.ylim(0.0, 5.1)
plt.xlim([0, 1])
plt.xlabel('$\phi$(z)')
plt.ylabel('J(w)')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

๊ทธ๋ฆผ 13. ์‹œ๊ทธ๋ชจ์ด๋“œ ํ™œ์„ฑํ™” ๋Œ€๋น„ ๋กœ์ง€์Šคํ‹ฑ ๋น„์šฉ ๊ทธ๋ž˜ํ”„

 ํด๋ž˜์Šค 1์— ์†ํ•œ ์ƒ˜ํ”Œ์„ ์ •ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธกํ•˜๋ฉด ๋น„์šฉ์ด 0์— ์ˆ˜๋ ดํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(ํŒŒ๋ž€์ƒ‰ ์‹ค์„ ) ํด๋ž˜์Šค 0์— ์†ํ•œ ์ƒ˜ํ”Œ์„ ์ •ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธกํ•˜๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„์šฉ์ด 0์— ์ˆ˜๋ ดํ•˜๋Š” ๊ฒƒ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ .(๋…ธ๋ž€์ƒ‰ ์ ์„ ) ์˜ˆ์ธก์ด ์ž˜๋ชป๋˜๋ฉด ๋น„์šฉ์€ ๋ฌดํ•œ๋Œ€๋กœ ๋ฐœ์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์˜ˆ์ธก์—๋Š” ๊ทธ์— ๋”ฐ๋ฅธ ๋” ํฐ ๋น„์šฉ์ด ๋ถ€์—ฌ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

3. ์•„๋‹ฌ๋ฆฐ ๊ตฌํ˜„์„ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

 ์•ž ์„ธ์…˜์—์„œ ๊ตฌํ˜„ํ•œ ์•„๋‹ฌ๋ฆฐ์— ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„์šฉํ•จ์ˆ˜๋งŒ ๋Œ€์ฒดํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 11. ๋น„์šฉํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•œ ๋กœ๊ทธ ๊ธฐ๋Šฅ๋„ ํ•จ์ˆ˜

 ์š” ๊ทธ๋ฆผ 11์— ๋‚˜์˜จ ๋น„์šฉํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋กœ ์—ํฌํฌ๋งˆ๋‹ค ํ›ˆ๋ จ์ƒ˜ํ”Œ์„ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋กœ ๋Œ€์ฒดํ•˜๊ณ , ์ž„๊ณ„ ํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค 1๊ณผ -1์ด ์•„๋‹Œ 0๊ณผ 1์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

class LogisticRegressionGD(object):
    """๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ถ„๋ฅ˜๊ธฐ

    ๋งค๊ฐœ๋ณ€์ˆ˜
    ------------
    eta : float
      ํ•™์Šต๋ฅ  (0.0๊ณผ 1.0 ์‚ฌ์ด)
    n_iter : int
      ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์…‹ ๋ฐ˜๋ณต ํšŸ์ˆ˜
    random_state : int
      ๊ฐ€์ค‘์น˜ ๋ฌด์ž‘์œ„ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‹œ๋“œ

    ์†์„ฑ
    -----------
    w_ : 1d-array
      ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜
    cost_ : list
      ์—ํฌํฌ๋งˆ๋‹ค ๋ˆ„์ ๋œ ๋กœ์ง€์Šคํ‹ฑ ๋น„์šฉ ํ•จ์ˆ˜ ๊ฐ’

    """
    def __init__(self, eta=0.05, n_iter=100, random_state=1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state

    def fit(self, X, y):
        """ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ํ•™์Šต

        ๋งค๊ฐœ๋ณ€์ˆ˜
        ----------
        X : {array-like}, shape = [n_samples, n_features]
          n_samples ๊ฐœ์˜ ์ƒ˜ํ”Œ๊ณผ n_features ๊ฐœ์˜ ํŠน์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ
        y : array-like, shape = [n_samples]
          ํƒ€๊นƒ๊ฐ’

        ๋ฐ˜ํ™˜๊ฐ’
        -------
        self : object

        """
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
        self.cost_ = []

        for i in range(self.n_iter):
            net_input = self.net_input(X)
            output = self.activation(net_input)
            errors = (y - output)
            self.w_[1:] += self.eta * X.T.dot(errors)
            self.w_[0] += self.eta * errors.sum()
            
            # ์˜ค์ฐจ ์ œ๊ณฑํ•ฉ ๋Œ€์‹  ๋กœ์ง€์Šคํ‹ฑ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
            cost = -y.dot(np.log(output)) - ((1 - y).dot(np.log(1 - output)))
            self.cost_.append(cost)
        return self
    
    def net_input(self, X):
        """์ตœ์ข… ์ž…๋ ฅ ๊ณ„์‚ฐ"""
        return np.dot(X, self.w_[1:]) + self.w_[0]

    def activation(self, z):
        """๋กœ์ง€์Šคํ‹ฑ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ™œ์„ฑํ™” ๊ณ„์‚ฐ"""
        return 1. / (1. + np.exp(-np.clip(z, -250, 250)))

    def predict(self, X):
        """๋‹จ์œ„ ๊ณ„๋‹จ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"""
        return np.where(self.net_input(X) >= 0.0, 1, 0)
        # ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
        # return np.where(self.activation(self.net_input(X)) >= 0.5, 1, 0)

 

 ์—ฌ๊ธฐ์„œ ๊ตฌํ˜„๋œ ๋กœ์ง€์Šคํ‹ฑ ๋ชจ๋ธ์€ ์˜ค์ง ์ด์ง„ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—๋งŒ ์ ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์ค‘ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค 1๊ณผ 0๋งŒ์„ ๊ฐ–๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๊ตฌํ˜„์ด ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

X_train_01_subset = X_train[(y_train == 0) | (y_train == 1)]
y_train_01_subset = y_train[(y_train == 0) | (y_train == 1)]

lrgd = LogisticRegressionGD(eta=0.05, n_iter=1000, random_state=1)
lrgd.fit(X_train_01_subset,
         y_train_01_subset)

plot_decision_regions(X=X_train_01_subset, 
                      y=y_train_01_subset,
                      classifier=lrgd)

plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

plt.tight_layout()
plt.show()

 

๊ทธ๋ฆผ 14. ๊ฒฐ์ •๊ฒฝ๊ณ„ with logistic regression model

 

4. ์‚ฌ์ดํ‚ท๋Ÿฐ์„ ์ด์šฉํ•œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ ํ›ˆ๋ จ

 ์•ž์—์„œ ์•„๋‹ฌ๋ฆฐ๊ณผ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ–ˆ์œผ๋‹ˆ, ์ด๋ฒˆ์—๋Š” ์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ์š”? ์ด๋ฒˆ์—๋Š” ์œ„ ์ฝ”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋‹ค์ค‘ ๋ถ„๋ฅ˜๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ sklearn.linear_model.LogisticRegression์˜ fit ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ‘œ์ค€ํ™”๋œ ํด๋ž˜์Šค ์„ธ ๊ฐœ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(solver='liblinear', multi_class='auto', C=100.0, random_state=1)
lr.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, y_combined,
                      classifier=lr, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

๊ทธ๋ฆผ 15. ์‚ฌ์ดํ‚ท๋Ÿฐ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ์˜ ๊ฒฐ์ •๊ฒฝ๊ณ„

 

 ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์€ ํ›ˆ๋ จํ•˜๊ณ  ๊ทธ๋ฆฌ๋ฉด ๊ทธ๋ฆผ 15์™€ ๊ฐ™์ด ๊ฒฐ์ •๊ฒฝ๊ณ„๋ฅผ ์„ ๋ช…ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์•„์ง ์œ„ ์ฝ”๋“œ์˜ 'C' ๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ์ง€๋งŒ, ์ด๊ฑด ๋‹ค์Œ 5๋ฒˆ์—์„œ ์„ค๋ช…๋“œ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ”๋กœ ๋‹ค์Œ์—๋Š” overfitting๊ณผ ๊ทœ์ œ์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•˜๊ฒŒ ๋ ํ…Œ๋‹ˆ๊นŒ์š”. 

 ํ›ˆ๋ จ ์ƒ˜ํ”Œ์ด ์–ด๋–ค ํด๋ž˜์Šค์— ์†ํ•  ํ™•๋ฅ ์€ predict_proba ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lr.predict_proba(X_test_std[:3,:])

 ์œ„ ์ฝ”๋“œ๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ–‰์€ ์ฒซ ๋ฒˆ์งธ ๋ถ“๊ฝƒ ํด๋ž˜์Šค์˜ ์†Œ์† ํ™•๋ฅ ์ด๊ณ , ๋‘ ๋ฒˆ์งธ ํ–‰์€ ๋‘ ๋ฒˆ์งธ ๊ฝƒ์˜ ํด๋ž˜์Šค ์†Œ์† ํ™•๋ฅ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ชจ๋“  ์—ด์„ ๋”ํ•˜๋ฉด ๋‹น์—ฐํžˆ ํ™•๋ฅ ์˜ ํ•ฉ์ด๋ฏ€๋กœ 1์ด ๋˜๊ฒ ์ฃ ? ์ฒซ ๋ฒˆ์งธ ํ–‰์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์€ 0.855 ์ •๋„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ๊ฝƒ์ด ํด๋ž˜์Šค 3์— ์†Œ์†๋  ํ™•๋ฅ ์ด 85.5% ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ๊ฐ ํ–‰์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์˜ˆ์ธก ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์ด ๋ฉ๋‹ˆ๋‹ค. ๋„˜ํŒŒ์ด ํ•จ์ˆ˜์ธ argmax๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

lr.predict_proba(X_test_std[:3, :]).argmax(axis=1)
#array([2,0,0])

lr.predict(X_test_std[:3, :])
#array([2,0,0])

lr.predict(X_test_std[0,:].reshape(1, -1))
#array([2])

 

 ์‹คํ–‰ํ•˜๋ฉด array([2, 0, 0]) ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ง์ ‘ predict ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ๋„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ˜ํ”Œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ์˜ˆ์ธกํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€, ์‚ฌ์ดํ‚ท๋Ÿฐ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ 2์ฐจ์› ๋ฐฐ์—ด์„ ์š”๊ตฌํ•˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ํ–‰์„ 2์ฐจ์› ํฌ๋งท์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ reshape ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ƒˆ๋กœ์šด ์ฐจ์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

5. ๊ทœ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณผ๋Œ€์ ํ•ฉ ํ”ผํ•˜๊ธฐ

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

 ๋น„์Šทํ•˜๊ฒŒ ๋ชจ๋ธ์ด ๊ณผ์†Œ์ ํ•ฉ, ์ฆ‰ underfitting์ผ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์žˆ๋Š” ํŒจํ„ด์„ ๊ฐ์ง€ํ•  ์ •๋„๋กœ ๋ชจ๋ธ์ด ๋ณต์žกํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ 16์˜ ๊ฒฐ์ •๊ฒฝ๊ณ„๋ฅผ ํ†ตํ•ด์„œ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 16. overfitting, underfitting

  ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์ ˆ์ถฉ์ ์„ ์ฐพ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๊ทœ์ œ(regularization)์„ ์ด์šฉํ•ด์„œ ๋ชจ๋ธ์˜ ๋ณต์žก๋„๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทœ์ œ๋Š” ๊ณต์„ ์„ฑ(collinearity), ์ฆ‰ ํŠน์„ฑ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์žก์Œ์„ ์ œ๊ฑฐํ•˜๋Š” ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ณผ๋„ํ•œ ๊ฐ€์ค‘์น˜ ๊ฐ’์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด์ธ ํŽธํ–ฅ์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฐœ๋…์ด์ฃ . ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ทœ์ œ๋Š” L2๊ทœ์ œ(๋‹ค๋ฅธ ๋ง๋กœ L2์ถ•์†Œ ๋˜๋Š” ๊ฐ€์ค‘์น˜ ๊ฐ์‡ )์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 17. L2 ๊ทœ์ œ

 ์ด ์‹์—์„œ ๋žŒ๋‹ค๋Š” ๊ทœ์ œ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์—์„œ ๋น„์šฉํ•จ์ˆ˜๋Š” ๊ทœ์ œ ํ•ญ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 18. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์— ๊ทœ์ œ ์ ์šฉ

 ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ค‘์น˜๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์— ๋งž์ถ”๋Š” ์ •๋„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์ˆ˜์‹์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๋žŒ๋‹ค๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๊ทœ์ œ์˜ ๊ฐ•๋„๋„ ๋†’์•„์ง€์ฃ . 

 ์œ„์—์„œ ๊ถ๊ธˆํ–ˆ๋˜ ๋งค๊ฐœ๋ณ€์ˆ˜ 'C' ๋Š” ๊ทœ์ œ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ ๋žŒ๋‹ค์˜ ์—ญ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ C๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋ฉด ๊ทœ์ œ๊ฐ•๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์ด ๊ณผ์ •์—์„œ L2 ๊ทœ์ œ ํšจ๊ณผ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

weights, params = [], []
for c in np.arange(-5, 5):
    lr = LogisticRegression(solver='liblinear', multi_class='auto', C=10.**c, random_state=1)
    lr.fit(X_train_std, y_train)
    weights.append(lr.coef_[1])
    params.append(10.**c)

weights = np.array(weights)
plt.plot(params, weights[:, 0],
         label='petal length')
plt.plot(params, weights[:, 1], linestyle='--',
         label='petal width')
plt.ylabel('weight coefficient')
plt.xlabel('C')
plt.legend(loc='upper left')
plt.xscale('log')
plt.show()

๊ทธ๋ฆผ 19. ๊ทœ์ œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ฅธ ๊ฐ€์ค‘์น˜ ํฌ๊ธฐ๋ณ€ํ™”

  ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ทธ๋ฆผ 19์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด C๊ฐ€ ๊ฐ์†Œํ•˜๋ฉด ๊ฐ€์ค‘์น˜ ์ ˆ๋Œ“๊ฐ’์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค, ์ฆ‰ ๊ทœ์ œ ๊ฐ•๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์ฃ .


 ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์ค‘์š”ํ•œ ๊ฐœ๋…์ธ overfitting, underfitting ๊ทธ๋ฆฌ๊ณ  ๊ทœ์ œ(regularization)์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ œ๊ฐ€ ์ฒ˜์Œ ๋จธ์‹ ๋Ÿฌ๋‹์„ ์œ ํŠœ๋ธŒ <๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋จธ์‹ ๋Ÿฌ๋‹>์œผ๋กœ ๋ฐฐ์šธ ๋•Œ ๊ทน ์ดˆ๋ฐ˜์— ๋ฐฐ์› ๋˜ ๋‚ด์šฉ์ด๊ธฐ๋„ ํ•˜๊ณ , ์‹ค์ œ๋กœ๋„ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์•„๋‹ฌ๋ฆฐ๊ณผ ํผ์…‰ํŠธ๋ก ์€ ์ด๋ฒˆ์— ์ฒ˜์Œ ๋“ค์–ด๋ณธ ๊ฐœ๋…์ด์—ˆ๋Š”๋ฐ, ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋Š” ์œ ๋ช…ํ•ด์„œ ์•Œ๊ณ  ์žˆ์—ˆ๊ฑฐ๋“ ์š”. ์ •๋ง ๋งŽ์ด ์“ฐ์ด๋Š” ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ๋ฐฐ์šด ๊ฒƒ์„ ์ถ•ํ•˜๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‹ค์Œ ์„ธ์…˜์—์„œ ์ตœ๋Œ€ ๋งˆ์ง„ ๋ถ„๋ฅ˜์™€ ๋น„์„ ํ˜• ๋ฌธ์ œ๋ฅผ ๋“ค๊ณ  ์ฐพ์•„์˜ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

728x90