[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 13. ๋น„์ง€๋„ ์ฐจ์›์ถ•์†Œ! PCA!

2020. 2. 18. 20:17ยท๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹
728x90

 ์ด๋ฒˆ ์„ธ์…˜์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ์ €๋Š” ๋„ํ†ต ์ด ์ฑ…์œผ๋กœ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์„œ ๋”ฐ๋กœ ๊ฐ•์˜๋ฅผ ๋“ค์–ด์„œ PCA์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์žก์•„์™”์œผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋จผ์ € ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ณ  ๋“ค์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ€๋”” ์ด ์งง์€ ์„ค๋ช…์ด ์—ฌ๋Ÿฌ๋ถ„์ด ์ดํ•ดํ•˜์‹œ๋Š”๋ฐ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค:)

 PCA๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋Š” ์ตœ๋Œ€ํ•œ ๋ณด์กดํ•˜๋ฉด์„œ ์ฐจ์›์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์ด ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์„ ์ตœ๋Œ€ํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ์ €์ฐจ์› ๋ฒกํ„ฐ์— ์‚ฌ์˜์„ ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด์ฃ .

 ์˜ˆ๋ฅผ ๋“ค์–ด, 2์ฐจ์›์—์„œ 1์ฐจ์›์œผ๋กœ ์ฐจ์›์„ ์ถ•์†Œ์‹œํ‚จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋‹จ ํ‰๊ท ์„ 0์œผ๋กœ ๋งž์ถ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ PCA๋ฅผ ์‹คํ–‰ํ•˜์ฃ .

 ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์€ ๋ญ”๊ฐ€, ํ•˜๊ณ  ์˜๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ์€ ๊ฐ ํŠน์„ฑ์˜ ๋ณ€๋™์ด ์–ผ๋งˆ๋‚˜ ๋‹ฎ์•˜๋Š”๊ฐ€? ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ฐ ํŠน์„ฑ์—์„œ ์ „์ฒด ํŠน์„ฑ์˜ ํ‰๊ท ์„ ๋บ€ ๊ฐ’์˜ ๋‹ฎ์€ ์ •๋„๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ๋จผ์ € ํ‰๊ท ์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์œผ๋‹ˆ, ๋‹ฎ์€ ์ •๋„๋งŒ ์•Œ๋ฉด ๋˜๊ฒ ๋„ค์š”.

 ๋‹ฎ์€ ์ •๋„๋Š” ํ–‰๋ ฌ ๊ฐ„์˜ ๋‚ด์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ–‰๋ ฌ X์™€ X์˜ ์ „์น˜ํ–‰๋ ฌ์„ ์ ๊ณฑํ•˜๋ฉด ๋‚ด์  ํ–‰๋ ฌ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ด ๋‚ด์  ํ–‰๋ ฌ์€ ๋Œ€์นญํ–‰๋ ฌ์ด๊ณ , ํ–‰๋ ฌ ์•ˆ์— ๋“  ๋ฐ์ดํ„ฐ๋“ค์€ ๊ฑฐ์˜ ๊ณต๋ถ„์‚ฐ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์™œ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ๋ƒ๋ฉด, ๊ณต๋ถ„์‚ฐ์€ ์—ฌ๊ธฐ์„œ ์ „์ฒด ์ƒ˜ํ”Œ์˜ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ ์ฃผ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 ๋งŒ์•ฝ์— ์ƒ˜ํ”Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋งŒ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ ์ˆ˜๋กœ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 ์ž, ์ด ๋‹จ๊ณ„์—์„œ PCA๋ฅผ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค๊ณ  ํ•  ๋•Œ, ๊ฐ€์žฅ ๋ฐ์ดํ„ฐ๋“ค์ด ๋„“๊ฒŒ ํผ์ ธ ์žˆ์–ด์•ผ ๋ฐ์ดํ„ฐ์˜ ์›๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์žฅ ์ž˜ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ์ด ๋„“๊ฒŒ ํผ์ ธ์žˆ๋Š” ์ •๋„๋ฅผ ๋ถ„์‚ฐ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ์ฐธ์กฐํ•˜๋ฉด, ๋ถ„ํ™์ƒ‰ ์„ ์œผ๋กœ ํ‘œํ˜„๋œ ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๋ถ„์‚ฐ์ด ํฐ ์ฃผ์ถ• ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ์ฃผ์ถ•์— ์‚ฌ์˜์„ ํ•ด์คŒ์œผ๋กœ์จ PCA๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ด์ฃ .

 ๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ„์‚ฐ์ด ํฐ ์ •๋„๋Š” ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ด๊ฒƒ์€ ๊ณ ์œ ๊ฐ’๊ณผ ๊ณ ์œ  ๋ฒกํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ๊ฐ’์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด ์ฒ˜์Œ ๋‘ ๋ฒกํ„ฐ๊ฐ€ ๊ฐ€์žฅ ํฐ ๋ถ„์‚ฐ์„ ๊ฐ€์ง์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(2์ฐจ์› ๊ธฐ์ค€). ๊ฐ€์žฅ ํฐ ๊ณ ์œณ๊ฐ’์„ ๊ฐ€์ง„ ๊ณ ์œ ๋ฒกํ„ฐ๊ฐ€ ์ฃผ์ถ•์ด ๋˜๋Š” ๊ฒƒ์ด์ฃ . ์ด ์ฃผ์ถ•์— ์ •์‚ฌ์˜ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ PCA์ž…๋‹ˆ๋‹ค.

 ์•„๋ž˜ ๋‚ด์šฉ์€ ์ฑ… ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฏ€๋กœ, ์ด ์•ž์„  ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋จธ๋ฆฌ์— ์ƒˆ๊ฒจ๋‘๊ณ  ์ฝ์–ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ์ฃผ์„ฑ๋ถ„ ๋ถ„์„์˜ ์ฃผ์š” ๋‹จ๊ณ„

๋น„์ง€๋„ ์„ ํ˜• ๋ณ€ํ™˜ ๊ธฐ๋ฒ•์ธ PCA(Principal Component Analysis)๋Š” ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์—์„œ ๋ถ„์‚ฐ์ด ํฐ ๋ฐฉํ–ฅ์„ ์ฐพ์•„์„œ ๋” ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์˜ ์ฐจ์›์„ ๊ฐ–๋Š” ๋ถ€๋ถ„๊ณต๊ฐ„์œผ๋กœ ํˆฌ์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์„ฑ ์‚ฌ์ด์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์ฃ . ์ด๋•Œ ํˆฌ์˜ํ•œ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„๊ณต๊ฐ„์˜ ์ฃผ์„ฑ๋ถ„, ์ง๊ต์ขŒํ‘œ๋Š” ์กฐ๊ฑด ํ•˜์—์„œ ๋ถ„์‚ฐ์ด ์ตœ๋Œ€์ธ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณผ๊นŒ์š”?

x1๊ณผ x2๊ฐ€ ์›๋ณธ ํŠน์„ฑ ์ถ•์ด๊ณ , PC1๊ณผ PC2๋Š” ์ฃผ์„ฑ๋ถ„์ž…๋‹ˆ๋‹ค. ๋‘ ์ง๊ต ์ขŒํ‘œ๋Š” ์„œ๋กœ ์ง๊ฐ์„ ์ด๋ฃจ์ฃ . ์ด๋Š” ๋ฒกํ„ฐ์˜ ์„ฑ์งˆ์— ์˜ํ•ด์„œ ๋‘ ์ง๊ต์ขŒํ‘œ๊ฐ€ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. PCA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฐจ์›์„ ์ถ•์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›๋ณธ์ฐจ์› d * ์ƒˆ๋กœ์šด ํŠน์„ฑ ๋ถ€๋ถ„๊ณต๊ฐ„ k ์ฐจ์›์˜ ๋ณ€ํ™˜ํ–‰๋ ฌ W๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„ ๊ณต๊ฐ„์€ ๋‹น์—ฐํžˆ ์›๋ณธ d์ฐจ์›๋ณด๋‹ค ์ž‘์€ ์ฐจ์›์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

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

PCA ๋ฐฉํ–ฅ์€ ๋ฐ์ดํ„ฐ์˜ ๊ทœ๋ชจ์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠน์„ฑ์˜ ๊ทœ๋ชจ, ์ฆ‰ ์Šค์ผ€์ผ์ด ๋‹ค๋ฅด๊ณ  ๋ชจ๋“  ํŠน์„ฑ์˜ ์ค‘์š”๋„๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋ ค๋ฉด ํŠน์„ฑ ํ‘œ์ค€ํ™” ์ฒ˜๋ฆฌ๊ฐ€ ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ PCA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•ด์•ผํ•  ๋ชฉ๋ก์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  1. d ์ฐจ์› ๋ฐ์ดํ„ฐ์…‹์„ ํ‘œ์ค€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ(covariance matrix)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  3. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๊ณ ์œ  ๋ฒกํ„ฐ(eigenvector)์™€ ๊ต์œณ๊ฐ’(eigenvalue)๋กœ ๋ถ„ํ•ดํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ณ ์œณ๊ฐ’์„ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ  ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฒกํ„ฐ์˜ ์ˆœ์œ„๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.

  5. ๊ณ ์œณ๊ฐ’์ด ๊ฐ€์žฅ ํฐ k๊ฐœ์˜ ๊ณ ์œ  ๋ฒกํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ k๋Š” ํŠน์„ฑ ๋ถ€๋ถ„ ๊ณต๊ฐ„์˜ ์ฐจ์›์ž…๋‹ˆ๋‹ค.

  6. ์ตœ์ƒ์œ„ k๊ฐœ์˜ ๊ณ ์œ ๋ฐฑํ„ฐ๋กœ ํˆฌ์˜ ํ–‰๋ ฌ(projection matrix) W๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  7. ํˆฌ์˜ํ–‰๋ ฌ W๋ฅผ ์ด์šฉํ•ด d์ฐจ์› ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์…‹ X๋ฅผ ์ƒˆ๋กœ์šด k ์ฐจ์›์˜ ํŠน์„ฑ ๋ถ€๋ถ„๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

2. ์ฃผ์„ฑ๋ถ„ ์ถ”์ถœ ๋‹จ๊ณ„

์ด๋ฒˆ์—๋Š” PCA์˜ ์ฒ˜๋ฆฌ๊ณผ์ • ์ค‘ ์ฒ˜์Œ 4๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํŒŒ์ด์ฌ์œผ๋กœ์š”! ๋จผ์ €, ์•ž์„  ์„ธ์…˜์—์„œ ์‚ฌ์šฉํ•œ wine ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ด์ฃผ๊ณ , ํ›ˆ๋ จ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ์„ธํŠธ๋กœ ๋‚˜๋ˆ„๊ณ  ํ‘œ์ค€ํ™”๋ฅผ ์ ์šฉํ•ด์ค๋‹ˆ๋‹ค. ํ›ˆ๋ จ์„ธํŠธ๊ฐ€ 70%, ํ…Œ์ŠคํŠธ์„ธํŠธ๊ฐ€ 30% ์ž…๋‹ˆ๋‹ค.

import pandas as pd
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/''machine-learning-databases/wine/wine.data', header = None)

from sklearn.model_selection import train_test_split
X, y = df.wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
X_train, Xtest, y_train, y_test = \
    train_test_split(X, y, test_size = 0.3, stratify = y, random_state = 0)

from sklearn.preprocessing import StandartScaler
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

์œ„ ์ฝ”๋“œ๋กœ ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜๊ณ , ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์€ ์ฃผ์–ด์ง„ ๋ฒกํ„ฐ์˜ ๊ฐ ์š”์†Œ ์Œ ์‚ฌ์ด์˜ ๊ณต๋ถ„์‚ฐ์„ ์ œ๊ณตํ•˜๋Š” ์ •์‚ฌ๊ฐ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ์€ 2๊ฐœ์˜ ํ™•๋ฅ ๋ณ€์ˆ˜์˜ ์ƒ๊ด€์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์€ d x d์ฐจ์›์˜ ๋Œ€์นญ ํ–‰๋ ฌ๋กœ ํŠน์„ฑ๊ฐ„์˜ ๊ณต๋ถ„์‚ฐ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ƒ˜ํ”Œ์— ๋Œ€ํ•œ ๋‘ ํŠน์„ฑ Xj์™€ Xk ์‚ฌ์ด์˜ ๊ณต๋ถ„์‚ฐ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ ํŠน์„ฑ์—์„œ ๋นผ์ฃผ๋Š” ๊ฐ’์€ ํŠน์„ฑ j์™€ k์˜ ์ƒ˜ํ”Œ ํ‰๊ท ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ์…‹์„ ํ‘œ์ค€ํ™” ์ „์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ท ์€ 0์ž…๋‹ˆ๋‹ค. ์ •๊ทœ๋ถ„ํฌ์™€ ๊ฐ™์ฃ . ๊ณต๋ถ„์‚ฐ์˜ ๊ฐ’์ด ์–‘์ด๋ฉด ํŠน์„ฑ์ด ํ•จ๊ป˜ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์†Œํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ์Œ์ด๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ํŠน์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ์‹œ๊ทธ๋งˆ๋Š” ํ•ฉ์˜ ๊ธฐํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!)

๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์˜ ๊ณ ์œ  ๋ฒกํ„ฐ๊ฐ€ ์ฃผ์„ฑ๋ถ„์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„ฑ๋ถ„์€ ์ตœ๋Œ€ ๋ถ„์‚ฐ์˜ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€์‘๋˜๋Š” ๊ณ ์œณ๊ฐ’์€ ์ฃผ์„ฑ๋ถ„์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. Wine ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ์—๋Š” 13 * 13์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์—์„œ 13๊ฐœ ๋ฒกํ„ฐ์™€ ๊ณ ์œณ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๊ณ ์œ  ๋ฒกํ„ฐ์™€ ๊ณ ์œณ๊ฐ’ ์Œ์„ ๊ตฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ๋ฒกํ„ฐ v๋Š” ์•„๋ž˜ ์‹์„ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์‹์˜ ๋žŒ๋‹ค๋Š” ์Šค์ผ€์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ ์œณ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ณ ์œ  ๋ฒกํ„ฐ์™€ ๊ณ ์œณ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ๋Š” ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์— ๋„˜ํŒŒ์ด linalg.eig ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import numpy as np
cov_mat = np.cov(X_train_std.T)
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
print('\nEigenvalues \n%s' % eigen_vals)

numpy.cov ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•ด์ฃผ๊ณ , linalg.eig ํ•จ์ˆ˜๋กœ ๊ณ ์œณ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ 13๊ฐœ ๊ณ ์œณ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋ฒกํ„ฐ์ธ eigen_vals์™€ ๋Œ€์‘ํ•˜๋Š” ๊ณ ์œ ๋ฒกํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ–‰๋ ฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ด๋ถ„์‚ฐ๊ณผ ์„ค๋ช…๋œ ๋ถ„์‚ฐ

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋ฐ์ดํ„ฐ์…‹ ์ฐจ์›์„ ์ƒˆ๋กœ์šด ํŠน์„ฑ ๋ถ€๋ถ„ ๊ณต๊ฐ„์œผ๋กœ ์••์ถ•ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ณ ์œ  ๋ฒกํ„ฐ์˜ ์ผ๋ถ€๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ ํƒํ•˜๋Š” ๊ณ ์œ ๋ฒกํ„ฐ๋Š” ๊ณ ์œณ๊ฐ’ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ตœ์ƒ์œ„ k๊ฐœ ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ, ์†Œ์ œ๋ชฉ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„ค๋ช…๋œ ๋ถ„์‚ฐ์ด ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณผ๊นŒ์š”?

์„ค๋ช…๋œ ๋ถ„์‚ฐ(explained variance)์€ ํ†ต๊ณ„์—์„œ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์„ ์„ค๋ช…ํ•˜๋Š” ๋น„์œจ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘์—์„œ, ์„ค๋ช…๋œ ๋ถ„์‚ฐ์˜ ๋น„์œจ์€ ์ „์ฒด ๊ณ ์œณ๊ฐ’ ์ค‘์—์„œ ์›ํ•˜๋Š” ๊ณ ์œณ๊ฐ’์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.

๋žŒ๋‹ค j๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์›ํ•˜๋Š” ๊ณ ์œณ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๊ฒ ์ฃ ? ์ด์ œ ๋„˜ํŒŒ์ด cumsum ํ•จ์ˆ˜๋กœ ์„ค๋ช…๋œ ๋ถ„์‚ฐ ๋ˆ„์  ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๊ณ , matplot lib์˜ stepํ•จ์ˆ˜๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

tot = sum(eigen_vals)
var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)]
cum_var_exp = np.cumsum(var_exp)

...

import matplotlib.pyplot as plt


plt.bar(range(1, 14), var_exp, alpha=0.5, align='center',
        label='individual explained variance')
plt.step(range(1, 14), cum_var_exp, where='mid',
         label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal component index')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„์—์„œ ์„ค๋ช…๋œ ๋ถ„์‚ฐ์˜ ๋น„์œจ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ค์ง„ ๊ทธ๋ž˜ํ”„์—์„œ ์ฒซ ๋ฒˆ์งธ ๊ณ ์œณ๊ฐ’์ด ์ „์ฒด ๋ถ„์‚ฐ์˜ 40%๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ณ ์œณ๊ฐ’๊นŒ์ง€๊ฐ€ 60%๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

4. ํŠน์„ฑ ๋ณ€ํ™˜

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผํ•  ์ผ์€ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ๊ณ ์œณ๊ฐ’์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ.
  2. ์„ ํƒ๋œ ๊ณ ์œ ๋ฒกํ„ฐ๋กœ ํˆฌ์˜ ํ–‰๋ ฌ ๊ตฌ์„ฑํ•˜๊ธฐ.
  3. ํˆฌ์˜ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์ฐจ์› ๋ถ€๋ถ„ ๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ.

๋จผ์ €, ๊ณ ์œ ๋ฒกํ„ฐ์™€ ๊ณ ์œณ๊ฐ’ ์Œ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

# (๊ณ ์œณ๊ฐ’, ๊ณ ์œ ๋ฒกํ„ฐ) ํŠœํ”Œ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i])
               for i in range(len(eigen_vals))]

# ๋†’์€ ๊ฐ’์—์„œ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ (๊ณ ์œณ๊ฐ’, ๊ณ ์œ ๋ฒกํ„ฐ) ํŠœํ”Œ์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค
eigen_pairs.sort(key=lambda k: k[0], reverse=True)

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ํฐ ๋‘ ๊ฐœ์˜ ๊ณ ์œณ๊ฐ’๊ณผ ๊ณ ์œ ๋ฒกํ„ฐ ์„ธํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์•ž์„  ๊ทธ๋ž˜ํ”„์—์„œ ํ™•์ธํ•˜์‹  ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด ๋‘ ์„ธํŠธ๋กœ ์ด ๋ถ„์‚ฐ์˜ 60% ๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” 2์ฐจ์› ์‚ฐ์ ๋„๋ฅผ ์œ„ํ•ด 2 ๊ฐœ๋ฅผ ์„ ํƒํ–ˆ์ง€๋งŒ, ์‹ค์ „์—์„œ๋Š” ๊ณ„์‚ฐ ํšจ์œจ๊ณผ ๋ชจ๋ธ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ ์ค‘๊ฐ„์ ์„ ์ฐพ์•„์„œ ๊ฐœ์ˆ˜๋ฅผ ์„ ํƒํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

w = np.hstack((eigen_pairs[0][1][:, np.newaxis],
               eigen_pairs[1][1][:, np.newaxis]))
print('ํˆฌ์˜ ํ–‰๋ ฌ W:\n', w)

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 13 * 2์˜ ํˆฌ์˜ ํ–‰๋ ฌ W๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํˆฌ์˜ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ˜ํ”Œ x(1 * 13์˜ ํ–‰ ๋ฐฑํ„ฐ)๋ฅผ PCA ๋ถ€๋ถ„๊ณต๊ฐ„์œผ๋กœ ํˆฌ์˜ํ•ด x'๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2๊ฐœ ํŠน์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ 2์ฐจ์› ์ƒ˜ํ”Œ ๋ฒกํ„ฐ๊ฐ€ ๋˜์ฃ .

์‹์€ ์š”๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์ „์ฒด 124 * 13์ฐจ์›์˜ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰๋ ฌ ๊ณฑ์œผ๋กœ ๋‘ ๊ฐœ์˜ ์ฃผ์„ฑ๋ถ„์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์‹์„ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

X_train_std[0].dot(w)

X_train_pca = X_train_std.dot(w)
colors = ['r', 'b', 'g']
markers = ['s', 'x', 'o']

for l, c, m in zip(np.unique(y_train), colors, markers):
    plt.scatter(X_train_pca[y_train == l, 0], 
                X_train_pca[y_train == l, 1], 
                c=c, label=l, marker=m)

plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
plt.show()

์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด 124 * 2์ฐจ์›์˜ ํ–‰๋ ฌ๋กœ ๋ณ€ํ™˜ํ•œ Wine ํ›ˆ๋ จ ์„ธํŠธ๋ฅผ 2์ฐจ์› ์‚ฐ์ ๋„๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ทธ๋ž˜ํ”„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฐ์ดํ„ฐ๊ฐ€ y์ถ•(๋‘ ๋ฒˆ์งธ ๊ณ ์œณ๊ฐ’)๋ณด๋‹ค x์ถ•(์ฒซ ๋ฒˆ์งธ ๊ณ ์œณ๊ฐ’)์„ ๋”ฐ๋ผ์„œ ๋” ๋„“๊ฒŒ ํŽผ์ณ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ ์ฃผ์„ฑ๋ถ„ ๋ถ„์„

์ด์ „ ๋‹จ๊ณ„๋“ค์—์„œ PCA์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ์ด์   ์‚ฌ์ดํ‚ท๋Ÿฐ์„ ์ด์šฉํ•ด๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ๋จผ์ € ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋Š” ์ดˆ๋ฐ˜ ์„ธ์…˜์—์„œ ๋งŒ๋“ค์—ˆ๋˜ plot_decision_regions๋ฅผ ์ด์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


def plot_decision_regions(X, y, classifier, resolution=0.02):

    # ๋งˆ์ปค์™€ ์ปฌ๋Ÿฌ๋งต์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    # ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    # ํด๋ž˜์Šค ์ƒ˜ํ”Œ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], 
                    y=X[y == cl, 1],
                    alpha=0.6, 
                    c=cmap.colors[idx],
                    edgecolor='black',
                    marker=markers[idx], 
                    label=cl)

๊ทธ๋ฆฌ๊ณ  ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ๊ฐ™์€ ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ›ˆ๋ จ๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํ‚ท๋Ÿฐ PCA ํด๋ž˜์Šค๋ฅผ Wine๋ฐ์ดํ„ฐ์…‹์˜ ํ›ˆ๋ จ ์„ธํŠธ์— ์ ์šฉํ•˜๊ณ  ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€๋กœ ๋ถ„๋ฅ˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)

lr = LogisticRegression(solver='liblinear', multi_class='auto')
lr = lr.fit(X_train_pca, y_train)

#๊ทธ๋ฆฌ๊ธฐ!
plot_decision_regions(X_train_pca, y_train, classifier=lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
plt.show()

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ์ฃผ์„ฑ๋ถ„ ์ถ•์œผ๋กœ ์ค„์–ด๋“  ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ดํ‚ท๋Ÿฐ์˜ PCA ํˆฌ์˜๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์•ž์—์„œ ์ญ‰ ๊ตฌํ˜„ํ•ด๋ณธ PCA๋Š” ์„œ๋กœ ๊ฑฐ์šธ์ฒ˜๋Ÿผ ๋’ค์ง‘ํ˜€์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๊ทธ์ € ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๊ณ ์œ ๋ฒกํ„ฐ๊ฐ€ ์–‘์ˆ˜๋‚˜ ์Œ์ˆ˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฐ์ดํ„ฐ์— -1์„ ๊ณฑํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์œ ๋ฒกํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์œ„ ๊ธธ์ด๊ฐ€ 1์ด ๋˜๋„๋ก ์ •๊ทœํ™”๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ฒฐ์ •๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ ค๋ณผ๊นŒ์š”?

plot_decision_regions(X_test_pca, y_test, classifier=lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
plt.show()

๋งŒ์•ฝ ์ „์ฒด ์ฃผ์„ฑ๋ถ„์˜ ์„ค๋ช…๋œ ๋ถ„์‚ฐ์˜ ๋น„์œจ์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด PCA ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ n_components๋ฅผ None์œผ๋กœ ํ•ด๋‘๊ณ  explained_variance_ratio_ ์†์„ฑ์—์„œ ๋ชจ๋“  ์ฃผ์„ฑ๋ถ„์˜ ์„ค๋ช…๋œ ๋ถ„์‚ฐ ๋น„์œจ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pca = PCA(n_components=None)
X_train_pca = pca.fit_transform(X_train_std)
pca.explained_variance_ratio_


์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ PCA์— ๋Œ€ํ•œ ์„ค๋ช…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ์…˜์—์„œ๋Š” LDA๋ฅผ ๋“ค๊ณ  ๋Œ์•„์˜ฌํ…๋ฐ์š”, ์œ„์— ์ˆ˜๋งŽ์€ ์ˆ˜์‹์— ๋Œ€ํ•ด์„œ ๋„ˆ๋ฌด ์‹ ๊ฒฝ์“ฐ์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. PCA๊ฐ€ ์–ด๋–ค ๊ฑฐ๊ณ , ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์ธ์ง€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์•„์ฃผ ์žฆ๊ฒŒ ์“ฐ์ด๋Š” ๊ธฐ๋ฒ•๋„ ์•„๋‹ˆ๊ณ , ๊ด€์‹ฌ์žˆ๋Š” ๋ถ„์•ผ๊ฐ€ ์•„๋‹ˆ๋ฉด ์•„๋Š” ์‚ฌ๋žŒ๋„ ์ ์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ ์„ธ์…˜์—์„œ ๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค!

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿฌ ML & Data > ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘  (0) 2020.02.24
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•  (0) 2020.02.21
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 12. ์ˆœ์ฐจ ํŠน์„ฑ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ ์ค‘์š”๋„ ์‚ฌ์šฉ  (0) 2020.02.16
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 11. ๋ฐ์ดํ„ฐ์…‹ ๋‚˜๋ˆ„๊ธฐ์™€ ํŠน์„ฑ ์Šค์ผ€์ผ๊ณผ ์„ ํƒ  (0) 2020.02.13
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 10. ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ์™€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ  (0) 2020.02.11
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 12. ์ˆœ์ฐจ ํŠน์„ฑ ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ ์ค‘์š”๋„ ์‚ฌ์šฉ
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 11. ๋ฐ์ดํ„ฐ์…‹ ๋‚˜๋ˆ„๊ธฐ์™€ ํŠน์„ฑ ์Šค์ผ€์ผ๊ณผ ์„ ํƒ
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 13. ๋น„์ง€๋„ ์ฐจ์›์ถ•์†Œ! PCA!
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”